Помощь новичкам

Вы правы, Александр: я тоже считаю, что с допусками самый правильный вариант, но это формальность, так как по условию конкретной задачи равенство нестрогое (включительно) и важнее логика - правильное решение. Сначала меня смутило отсутствие проверки на дурачка (вроде нецифровых или нулевых и минусовых значений) и подсказок в запросах, но проблема не в этом.

Хотя ваше решение лаконичней, однако также основано на “избыточном” методе .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.
1 лайк

Все это на самом деле ерунда. Не тому учит учительница! Сейчас главный ресурс - это время разработки, а не одна миллисекунда процессорного времени персонального компьютера. Именно стоимость разработки программного обеспечения, а также лаконичность и наглядность кода, упрощающие сопровождение и поддержку, сегодня определяют конечную стоимость продукта и, как следствие, его конкурентоспособность на рынке.

Вот только “свопы” затрудняют понимание алгоритма. Три строки свопов по наглядности на порядок уступают слову Sorted.

1 лайк

Для данной задачи такая оптимизация не является обязательной. Но, всё-же, стоит заметить, что в общем случае при желании получить максимальное быстродействие лучше не использовать Linq и подобные вещи.

Да, для получения быстродействия все пишем на чистом С. Или на ассемблере. Но эти идеи Вы можете позволить для себя, пока пишете свои библиотеки, а не работаете в большой софтверной компании.

Вспоминается следующая мысль: на Assembler можно написать всё что угодно, только жизнь слишком коротка…

Дополнение

Был у меня знакомый, который утверждал, что все языки с GC - не очень хорошая вещь (будем выражаться культурно, а не как данный товарищ), поскольку не позволяют нормально оптимизировать программы. Также, что есть один универсальный язык, имя которого C++, а также, что настоящие программисты пишут только на нём. В ответ на это ему указали, что это не так. Но, мнения он так своего и не поменял.

Это действительно не так. Например, драйверы пишут на С, а не на C++. Программы защиты пишут на С. Потому что именно С, а не С++ имеет возможности, максимально приближенные к ассемблеру.

Ожидается, что ученицу уже научили пузырьковой сортировке и это пример как её можно было реализовать.

А .Sort, и тем более ваша башня из .Sorted.Take.ToArray - это эскалибур для нарезания масла. Поэтому у вас хуже, ещё более “избыточный” код.

Это где было сказано про “ожидается”?

Избыточной для чего/кого? Какая цель должна была достигаться этой задачей, Вы знаете? Нет, если Вы не “та самая учительница”. Тогда для чего все эти разговоры о какой-то мифической “избыточности”? Или это так, “Здесь был Вася” ?

Как правило, в школьных заданиях подразумевают использование ранее полученных знаний, так что в 10-м классе уже имеют понятия о методах сортировки Пузырька, Вставки и Шелла.

С другой стороны, обучение проводится на базе Pascal Abc Net, поэтому ученики знают многие методы платформы. Однако конкретный учитель хотя и засчитал решение, так как логика была правильной, но отметил, что .Sort “избыточно” именно для данного случая с двумя-тремя элементами. Вроде пока логично.

Хотя, если память не сильно изменяет, в большинстве методов Net учитываются вырожденные и частные случаи, но желательно знать и понимать расплату за универсальность.

1 лайк

Оптимизации - дело хорошее и полезное. Например, использовать Linq где требуется высокая производительность - неразумное решение. Под конкретную задачу следует подбирать конкретные средства языка. В мелких задачах без требований к высокой производительности использование Sort() и подобных вещей - не является проблемой. При решении более серьезных задач, могут пригодиться такие вещи, как работа с указателями (в C# - unsafe код), не с целью запутать читающего Ваш код, а с целью, опять же, оптимизации и использование многого привычного функционала из, например, .NET может оказаться вредным с точки зрения производительности. Вообще, оптимизация (необязательно по производительности) является причиной написания более-менее крупного проекта на различных языках, адаптированных под различные задачи, например на C#+C++, C#+PascalABC.NET (пример такого проекта можно найти здесь).

Задолго до распада СССР, когда я работал в Ростовском областном управлении статистики (это чтобы сразу снять вопрос об объемах обрабатываемой информации), довелось принять участие в решении проблемы с формированием отчетности по тогдашней форма 1-ТР (автотранспорт). Там обрабатывались данные о пробеге и расходе ГСМ для каждого государственного автомобиля. Это сотни тысяч записей. А тогда иметь 4 мБ оперативной памяти на ЭВМ было пределом мечтаний. И дисковая подсистема комплектовалась дисками емкостью 29 мБ со скоростью обмена меньше, чем у нынешних внешних флешек. И вот коллеги из Ташкента “сваяли” программу, где вместо внешней сортировки, стандартно являвшейся утилитой операционной системы, написали собственную. В положенное время мы запустили формирование сводов для отправки в Москву, на верхний уровень. Машина работает час, два, пять… и все это молча, никаких сообщений и непонятно, что там внутри делается. К концу первой смены позвонили коллегам в Краснодар. У них объем был в два с лишним раза меньше нашего, а вот ЭВМ они сумели “отхватить” пошустрее. И, к нашему удивлению, они ответили, что у них уже вторые сутки (!) идет формирование свода. После чего я предложил поступить радикально: отсортировать средствами операционной системы входные данные. Сортировка прошла за несколько минут, после чего мы эти данные отдали на вход ташкентского чуда и получили свод примерно за полчаса. Это к вопросу о том, всегда ли стоит считать, что ты умнее всех на свете, когда пишешь “оптимизированный” код для стандартного алгоритма.

1 лайк

Как возмущённо пояснила ученица, самым правильным решением оказалось то, где ученик с умом использовал подсказку

repeat print('Введите в порядке возрастания ....') ... until (c>=b)and(b>=a);
// и ... until (y>=x);

А условие на строгие или нестрогие допуски было не обязательно, ведь главное - правильный подход и стабильно ожидаемый и проверяемый ответ.

Можно понять такое возмущение самодурством учительницы. Конечно, если она при постановке задачи не оговорила, что программист вправе затребовать определенный порядок следования данных. А теперь чуть изменим ситуацию: задача проверяет “стопятьсот” кирпичей, читая данные из файла… Такие “псевдоправильные решения” приучают мыслить шаблонно и писать задачи под конкретную ситуацию. Потом, если ситуация чуть меняется все надо переделывать с нуля.

3 лайка

Насколько я помню ЕГЭшные требования, в составленной программе не проверяется корректность входных данных, если это специально не оговорено в задании. И с этой точки зрения избыточны именно repeаt … until, столь превознесенные учительницей. А вот строгий допуск как раз принципиален, потому что при нестрогом задача может не пройти набор тестов.

Вывод плохой.

Правильно было сначала узнать как реализовано в системе, есть ли какое то встроенное в железо ускорение. Если информацию найти не получается - надо провести несколько тестов на небольших объёмах данных.

Такие проверки занимают не так уж много времени и они на столько же нужны как и продумывание структуры проекта и распределения труда между программистами. Необдуманные велосипеды можно делать только в своих проектах “для души”. А то что тут такой велосипед не сработал - ничего не показывает.

Не думаю. Моя интерпретация вывода такая: если есть готовый функционал, то почему бы не использовать его? Разумеется, удостоверившись, что он сделан качественно и подходит под данную задачу.

Александр, даже если вы не путаете “ученица” и “учительница”, можно “шаблонным” назвать любое решение, включая методы.

Верно, ученик перестраховался с упорядочиванием, но вполне экономно и обоснованно, потому что иначе не будет гарантировано правильного решения. ЧеловеКовский фактор. А допуски хотя важны, однако именно в этой конкретной задаче не являлись основной темой - можно было и так, и этак.

В общем, я думал, что упрощения через Sort считаются “избыточными”, а это касалось сортировки двух элементов, да и с тремя можно справиться. Подозреваю, что дело не столько в легкости, как реализации собственного решения, например, в языках без готового .Sort.

1 лайк

Реализовать можно по разному. В обобщённом виде и необобщённом (без generic’ов). Да, в контексте данной задачи, особо “показывать свои знания” смысла не имеет - учитель может не поверить, что писали код Вы (хотя, если умеете объяснять код, то флаг Вам в руки). Но, всё-же, бывает хорошим решением ставить перед собой задачу чуть более сложную, чем дал преподаватель с целью саморазвития (опять же, всё упирается в то, насколько “препод” одобряет такую стратегию действий). Главное помнить, что за время, проведённое в университете или школе Вы можете научиться большему, чем дают учителя, единственное, что требуется - Ваше желание.

Не путаю. Вы пишете, “Как возмущённо пояснила ученица, самым правильным решением оказалось…”, т.е. по словам ученицы эпитет “самое правильное”, возможно иными словами, но исходил от учительницы - а кто же еще на уроке определяет что “самое правильное”?

Шаблонное мышление и шаблонное решение - “две большие разницы”. Шаблонное мышление при постановке задачи приводит к проблемам в будущем, если это задачка не на “сдал и забыл”. В последнем случае оно не хуже других, если применяется осознанно. Шаблонное решение - это решение в рамках некоторой парадигмы программирования или комбинации парадигм. Тут все в порядке.

К сожалению, действительно, есть учителя и Учителя, “преподы” и преподаватели…

2 лайка