Вы правы, Александр: я тоже считаю, что с допусками самый правильный вариант, но это формальность, так как по условию конкретной задачи равенство нестрогое (включительно) и важнее логика - правильное решение. Сначала меня смутило отсутствие проверки на дурачка (вроде нецифровых или нулевых и минусовых значений) и подсказок в запросах, но проблема не в этом.
Хотя ваше решение лаконичней, однако также основано на “избыточном” методе .Sort, что, как пояснила ученица, их учитель и ожидал увидеть в реализации.
А пока что попросил её уточнить какое минимальное количество элементов оправдывает применение метода, то есть, оптимизация по размеру кода или же по быстродействию.
Я б сказал бы 4. Но это по внешнему виду кода, по скорости, конечно, надо специально много тестировать. На 3 элементов всё же пузырьковая сортировка самая быстрая, просто потому что она простая, а для 3 элементов надо не больше 3 Swap-ов.
.Sorted для последовательности, ещё и с .ToArray после метода возвращающего yield-последовательность .Take - это ещё хуже. Там создаётся как минимум 3 лишних массива. Прочитать ReadArrReal(3) и затем применить .Sort было бы и то лучше. Но лучше всего в данном варианте всё через Swap-ы:
begin
var (X,Y,Z) := ReadReal3('Размеры X Y Z кирпича =');
if X > Y then Swap(X,Y);
if Y > Z then Swap(Y,Z);
if X > Y then Swap(X,Y);
var (A,B) := ReadReal2('Размеры A B щели =');
if A > B then Swap(A,B);
Writeln( (A > X) and (B > Y) );
end.
Все это на самом деле ерунда. Не тому учит учительница! Сейчас главный ресурс - это время разработки, а не одна миллисекунда процессорного времени персонального компьютера. Именно стоимость разработки программного обеспечения, а также лаконичность и наглядность кода, упрощающие сопровождение и поддержку, сегодня определяют конечную стоимость продукта и, как следствие, его конкурентоспособность на рынке.
Вот только “свопы” затрудняют понимание алгоритма. Три строки свопов по наглядности на порядок уступают слову Sorted.
Для данной задачи такая оптимизация не является обязательной. Но, всё-же, стоит заметить, что в общем случае при желании получить максимальное быстродействие лучше не использовать Linq и подобные вещи.
Да, для получения быстродействия все пишем на чистом С. Или на ассемблере. Но эти идеи Вы можете позволить для себя, пока пишете свои библиотеки, а не работаете в большой софтверной компании.
Вспоминается следующая мысль: на Assembler можно написать всё что угодно, только жизнь слишком коротка…
Дополнение
Был у меня знакомый, который утверждал, что все языки с GC - не очень хорошая вещь (будем выражаться культурно, а не как данный товарищ), поскольку не позволяют нормально оптимизировать программы. Также, что есть один универсальный язык, имя которого C++, а также, что настоящие программисты пишут только на нём. В ответ на это ему указали, что это не так. Но, мнения он так своего и не поменял.
Это действительно не так. Например, драйверы пишут на С, а не на C++. Программы защиты пишут на С. Потому что именно С, а не С++ имеет возможности, максимально приближенные к ассемблеру.
Избыточной для чего/кого? Какая цель должна была достигаться этой задачей, Вы знаете? Нет, если Вы не “та самая учительница”. Тогда для чего все эти разговоры о какой-то мифической “избыточности”? Или это так, “Здесь был Вася” ?
Как правило, в школьных заданиях подразумевают использование ранее полученных знаний, так что в 10-м классе уже имеют понятия о методах сортировки Пузырька, Вставки и Шелла.
С другой стороны, обучение проводится на базе Pascal Abc Net, поэтому ученики знают многие методы платформы. Однако конкретный учитель хотя и засчитал решение, так как логика была правильной, но отметил, что .Sort “избыточно” именно для данного случая с двумя-тремя элементами. Вроде пока логично.
Хотя, если память не сильно изменяет, в большинстве методов Net учитываются вырожденные и частные случаи, но желательно знать и понимать расплату за универсальность.
Оптимизации - дело хорошее и полезное. Например, использовать Linq где требуется высокая производительность - неразумное решение. Под конкретную задачу следует подбирать конкретные средства языка. В мелких задачах без требований к высокой производительности использование Sort() и подобных вещей - не является проблемой. При решении более серьезных задач, могут пригодиться такие вещи, как работа с указателями (в C# - unsafe код), не с целью запутать читающего Ваш код, а с целью, опять же, оптимизации и использование многого привычного функционала из, например, .NET может оказаться вредным с точки зрения производительности. Вообще, оптимизация (необязательно по производительности) является причиной написания более-менее крупного проекта на различных языках, адаптированных под различные задачи, например на C#+C++, C#+PascalABC.NET (пример такого проекта можно найти здесь).
Задолго до распада СССР, когда я работал в Ростовском областном управлении статистики (это чтобы сразу снять вопрос об объемах обрабатываемой информации), довелось принять участие в решении проблемы с формированием отчетности по тогдашней форма 1-ТР (автотранспорт). Там обрабатывались данные о пробеге и расходе ГСМ для каждого государственного автомобиля. Это сотни тысяч записей. А тогда иметь 4 мБ оперативной памяти на ЭВМ было пределом мечтаний. И дисковая подсистема комплектовалась дисками емкостью 29 мБ со скоростью обмена меньше, чем у нынешних внешних флешек. И вот коллеги из Ташкента “сваяли” программу, где вместо внешней сортировки, стандартно являвшейся утилитой операционной системы, написали собственную. В положенное время мы запустили формирование сводов для отправки в Москву, на верхний уровень. Машина работает час, два, пять… и все это молча, никаких сообщений и непонятно, что там внутри делается. К концу первой смены позвонили коллегам в Краснодар. У них объем был в два с лишним раза меньше нашего, а вот ЭВМ они сумели “отхватить” пошустрее. И, к нашему удивлению, они ответили, что у них уже вторые сутки (!) идет формирование свода. После чего я предложил поступить радикально: отсортировать средствами операционной системы входные данные. Сортировка прошла за несколько минут, после чего мы эти данные отдали на вход ташкентского чуда и получили свод примерно за полчаса. Это к вопросу о том, всегда ли стоит считать, что ты умнее всех на свете, когда пишешь “оптимизированный” код для стандартного алгоритма.
Можно понять такое возмущение самодурством учительницы. Конечно, если она при постановке задачи не оговорила, что программист вправе затребовать определенный порядок следования данных. А теперь чуть изменим ситуацию: задача проверяет “стопятьсот” кирпичей, читая данные из файла… Такие “псевдоправильные решения” приучают мыслить шаблонно и писать задачи под конкретную ситуацию. Потом, если ситуация чуть меняется все надо переделывать с нуля.
Насколько я помню ЕГЭшные требования, в составленной программе не проверяется корректность входных данных, если это специально не оговорено в задании. И с этой точки зрения избыточны именно repeаt … until, столь превознесенные учительницей. А вот строгий допуск как раз принципиален, потому что при нестрогом задача может не пройти набор тестов.
Правильно было сначала узнать как реализовано в системе, есть ли какое то встроенное в железо ускорение. Если информацию найти не получается - надо провести несколько тестов на небольших объёмах данных.
Такие проверки занимают не так уж много времени и они на столько же нужны как и продумывание структуры проекта и распределения труда между программистами. Необдуманные велосипеды можно делать только в своих проектах “для души”. А то что тут такой велосипед не сработал - ничего не показывает.
Не думаю. Моя интерпретация вывода такая: если есть готовый функционал, то почему бы не использовать его? Разумеется, удостоверившись, что он сделан качественно и подходит под данную задачу.
Александр, даже если вы не путаете “ученица” и “учительница”, можно “шаблонным” назвать любое решение, включая методы.
Верно, ученик перестраховался с упорядочиванием, но вполне экономно и обоснованно, потому что иначе не будет гарантировано правильного решения. ЧеловеКовский фактор. А допуски хотя важны, однако именно в этой конкретной задаче не являлись основной темой - можно было и так, и этак.
В общем, я думал, что упрощения через Sort считаются “избыточными”, а это касалось сортировки двух элементов, да и с тремя можно справиться. Подозреваю, что дело не столько в легкости, как реализации собственного решения, например, в языках без готового .Sort.
Реализовать можно по разному. В обобщённом виде и необобщённом (без generic’ов). Да, в контексте данной задачи, особо “показывать свои знания” смысла не имеет - учитель может не поверить, что писали код Вы (хотя, если умеете объяснять код, то флаг Вам в руки). Но, всё-же, бывает хорошим решением ставить перед собой задачу чуть более сложную, чем дал преподаватель с целью саморазвития (опять же, всё упирается в то, насколько “препод” одобряет такую стратегию действий). Главное помнить, что за время, проведённое в университете или школе Вы можете научиться большему, чем дают учителя, единственное, что требуется - Ваше желание.
Не путаю. Вы пишете, “Как возмущённо пояснила ученица, самым правильным решением оказалось…”, т.е. по словам ученицы эпитет “самое правильное”, возможно иными словами, но исходил от учительницы - а кто же еще на уроке определяет что “самое правильное”?
Шаблонное мышление и шаблонное решение - “две большие разницы”. Шаблонное мышление при постановке задачи приводит к проблемам в будущем, если это задачка не на “сдал и забыл”. В последнем случае оно не хуже других, если применяется осознанно. Шаблонное решение - это решение в рамках некоторой парадигмы программирования или комбинации парадигм. Тут все в порядке.
К сожалению, действительно, есть учителя и Учителя, “преподы” и преподаватели…