программа для определения цифр числа в диапазоне от 2 до 7.

Что это вам даёт?

А вообще:

  1. Диапазоны быстрее чем массивы.
  2. Находить минимум и максимум это решение через 5 точку. Вы, получается, проходите всю последовательность и все элементы сравниваете друг с другом, вместо того чтобы сразу сравнить, является ли элемент подходящим.
  3. Выражение в заголовке if и так имеет тип boolean, то есть значение True или False. Поэтому if тут не нужен. Вам только вывернуть надо, но тут правило де моргана прекрасно работает - получается Print( (a.Min not in 0..1) and (a.Max not in 8..9 ) );.

В итоге то же самое но без лишнего:

## uses School;

ReadInteger.Digits.All(d->d in 2..7).Print;

Спасибо! Я пока что разбираюсь с этими нововведениями. tohashset убирает дубли. Думал, что программа быстрее заработает.

.Distinct тоже убирает дубли. Но надо пытаться разбираться как всё работает, а не использовать первый попавшийся метод.

.ToHashSet в первую очередь создаёт коллекцию элементов типа HashSet. То что там нет дублей - это вторично.

.Distinct возвращает новую последовательность, при перечислении которой будет создано множество, похожее на HashSet, на на много проще (а значит и быстрее). И на выходе при перечислении будут элементы, которые получилось добавить в это множество.

##

var d := SeqGen(1, i->Random(10)).Cycle
  .Distinct; // .ToHashSet тут зависнет

d.Take(5).Println; // Тут вычислит только первые 5 подходящих из бесконечной последовательности
d.Take(5).Println; // В отличии от .ToHashSet, .Distinct возвращает не коллекцию, поэтому тут начнёт вычислять заново

Но в обоих случаях - даже если не знать как оно работает, а подумать логически - чтобы оставить только уникальные элементы надо сравнить каждый новый элемент с предыдущими. Хеш-таблицы оптимизируют так, что обычно не с каждый предыдущим, а только похожими. Но это всё равно куча лишней работы, когда по сути вам по изначальному условию надо сопоставить каждый элемент с 2 границами единожды.

Гораздо лучше будет программа вроде этой. Она хоть и длиннее, но зато гораздо нагляднее и универсальнее:

Program digits_2to7;
Var
	n, i: int64;
	digit: integer;
	result: boolean;
Begin
	write('Input a number to test: ');
	readln(n);
	i := n;
	result := true;
	while i > 0 do begin
		digit := i mod 10;
		if (digit < 2) or (digit > 7) then begin
			result := false;
			break
		end;
		i := i div 10
	end;
	if result then
		writeln('Number n=', n, ' has no digits outside of 2-7 range.')
	else
		writeln('Number n=', n, ' has at least one digit outside of 2-7 range.')
End.

23 строки вместо двух. Я не стану вешать ярлык, кем нужно быть, чтобы иметь такое предпочтение.

1 лайк

Любую программу можно превратить в однострочник, если убрать всё форматирование, комментарии, пустые строки и так далее. Если не доходить до таких крайностей, то можно вот так:

Uses RegExpr;
Var s: string;
Begin
	readln(s);
	writeln(TRegExpr.Create('^[2-7]*$').Exec(s))
End.

Но по-моему решение на математических выражениях предпочтительней именно с педагогической точки зрения. Это же не Code Golf какой-нибудь, верно?

Кстати, заодно ответ на старое сообщение:

Не все так однозначно, это зависит от того, какая тема изучается. По поводу модуля RegExpr - да, был не в курсе, но зато немного посмеялся заметке

In 2019 year, after about 15 years of missed patches from anybody, work on TRegExpr was continued by Alexey Torgashin

Ну, если изучается не .Net, то вариант с div и mod лучше всего. Конечно, написать одну строчку на linq будет быстрее, при условии знания модуля School и синтаксиса, но толку от такой программы мало, поскольку увидеть есть ли в числе цифры вне диапазона 2-7 можно запросто глазами. Из этого можно сделать вывод, что программа нужна не для результата, а для демонстрации.

И что продемонстрирует строчка ReadInteger.Digits.All(d->d in 2..7).Print; ? Только то, что в PascalABC .Net есть разложение на цифры и всё.

А вот программа с div и mod даёт основу для других алгоритмов, например перевод числа в другую систему счисления получится минимальной модификацией этой программы, кроме того, подобное легко повторить на любом языке программирования — C, бейсик, Rust и тд, в то время как вариант с linq завязано только на .Net

Вариант с регулярным выражением тут имеет промежуточную полезность, так как регекспы существуют почти во всех ЯП и утилитах командной строки, но всё же используют сторонние библиотеки.

Вариант с div и mod нужен один раз - при объяснении темы деления целых чисел и алгоритмов на основе деления и взятия остатков. Это как сортировка - один раз нужно показать алгоритм, а дальше пользоваться готовой. Да, преобразование к строке занимает несколько больше времени, чем последовательное деление и взятие остатков, но смысла в постоянном переписывании длинного алгоритма никакого нет.

А разве вопрос @Pexikk — это не есть про тот самый один раз? Так-то задачи на манипуляцию отдельными цифрами целого числа после окончания этой самой темы почти никогда не возникает, разве что во всяких занимательных задачах.

Вот сортировка — другое дело, она постоянно используется во многих программах, в том числе и практически полезных, а не учебных, например сортировка фотографий по дате и/или различным тегам.

“Задачи на манипуляцию” - посмотрите задания к ЕГЭ, например. А в школе ЕГЭ - самый важный аспект, увы…

Catcher прав: LINQ - это специфический инструмент для обработки последовательностей. Как и RedEx, мало кто знает, как он работает. Решать детские задачи с помощью LINQ имеет смысл только при изучении LINQ.

Весьма сомневаюсь, что в школе доберутся до LINQ, а основы всё равно выучат.

RAlex тоже прав: в данном случае речь идёт о последовательностях, которые вполне разумно и естественно обрабатывать с помощью LINQ.

Поэтому оба подхода верные, поэтому спорить не о чем: кому как удобнее решать задачу, тот так и решает. Если же нужно объяснить решение школьнику, то было бы странно объяснять ему, как решать задачу с помощью LINQ или RegEx.

1 : 1 - боевая ничья, победила дружба.

1 лайк

Первый/не_первый раз мы знать не можем, но делать свалку var до begin не полезно (и скорее даже вредно) для обучения на любой стадии.

“Задачи на манипуляцию” - посмотрите задания к ЕГЭ, например. А в школе ЕГЭ - самый важный аспект, увы…

Так в школе ЕГЭ — это как раз и есть проверка того, как изучены темы, в том числе доступ к отдельным цифрам в числе с помощью арифметики. А если применять другие способы, ответ, конечно, будет получен, но запланированная цель ЕГЭ достигнута не будет.

Кстати, я про это уже писал. На мой взгляд все эти фишки в PascalABC .Net, особенно модуль School — это собственно чит. Это примерно как на контрольных по математике в пятом классе разрешить калькуляторы.

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

А где именно описание переменных, непосредственно до begin или { или сразу после — это совершенно не принципиальный вопрос.

У ЕГЭ есть как сторонники, так и критики, вплоть до полного отторжения. Поэтому дискутировать тут бесполезно. Я считаю ЕГЭ идиотизмом, оглупляющим абитуриентов. Пользы от него с точки зрения получения знаний предмета - ноль. Он нацелен на получение знаний другого рода - как сдать предмет, применив одну из заранее заученных “компетенций”. В советское время компетенции были уделом выпускников ПТУ и частично техникумов. Инженеры использовали не компетенции, а знания. Поэтому советская наука всегда была на высоте. Так что задача школьника - сдать ЕГЭ и поскорее все это забыть. И в этих условиях любой “чит”, как Вы выразились, я только приветствую. ЕГЭ - зло и против зла все средства хороши.

Не согласен. Получается, что еще в далеком уже 1960 году, когда вышел язык Алгол-60, его разработчики (виднейшие умы), сделали по-вашему глупость, введя внутриблочные описания и возможность вкладывать друг в друга “матрешкой” подпрограммы.

когда вышел язык Алгол-60, его разработчики (виднейшие умы)

Ну насчёт виднейших умов — это несколько спорно, всё-таки почему-то на этом языке так никто толком и не писал, впрочем дело скорее не в умах отдельных разработчиках, а в том, что разрабатывали его большим комитетом…

сделали по-вашему глупость, введя внутриблочные описания

Почему глупость? Я не говорил, что описания внутри блоков — это плохо. Я говорил:

А где именно описание переменных, непосредственно до begin или { или сразу после — это совершенно не принципиальный вопрос.

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

ЕГЭ - это метод обучения, а проверка знаний. Я учился в советское время в челябинском политехе на хорошем факультете. Там сплошь и рядом были тесты - как машинные, так и ручные. Ни фига они не отупляют. Отупляют плохие преподы и плохие тесты.

ЕГЭ - это государственная проверка деятельности учителей, а не детей. Государство содержит школы и оплачивает труд учителей. Было бы странно, если бы государство не проверяло качество работы учителей. Учителя как в советское время, так и сейчас были невысокого уровня. Хорошие учителя умели вбивать знания, плохие - для подстраховки - вечно готовили детей к экзаменам. Что изменилось с введением ЕГЭ? - Хорошие учителя продолжают вбивать знания, плохие - готовят к ЕГЭ. Но теперь плохие учителя не могут симулировать хорошую работу, поскольку существует объективный контроль.

Мы в совё время готовились к 8 или типа того экзаменам в школе. Плюс 4 вступительных экзамена. Сдавали учителям - и хорошим, и плохим: кому как повезёт, такую отметку и получит.

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

Я уверен, что ни Путин, ни Мишустин ЕГЭ не отменят, поэтому нужно смириться и принять ЕГЭ как должное. Более того, а кто вообще мешает школьнику самообразовываться или получать дополнительное образование? Мы в своё время так и делали и не ныли, кк современные школяры. Давно следует понять, что школа работает по государственным программам, в которых каждый час занятий расписан. Нет там времени на регексы и линки, поэтому на ЕГЭ нет таких задач, чтобы их решать таким изощрённым способом.

Я в своё время самостоятельно изучил стенографию, что помогло мне записывать лекции в институте. Нужно не ныть, а работать. Ни фиг на школу пенять, если ума нет.

1 лайк

По-моему для этого ВПР есть. А ОГЭ / ЕГЭ всё-таки для проверки знаний именно учеников.

Мне кажется, что логика тут такая — если ученик может решить все, весьма разнообразные задачи из ЕГЭ — значит что-то он в предмете понимает. Вероятно, изначальная идея ЕГЭ и была во всесторонней проверке знания и понимания школьной программы по предмету. Правда учителя вместо того, чтобы просто преподавать предмет в общем, стали готовить учеников конкретно к ЕГЭ и это не очень хорошо.

Но, кстати, цель ЕГЭ — это не получение знаний, а единообразная по всей стране проверка полученных в школе знаний. Вроде как последнее звучит не так уж и плохо, и можно сказать, даже хорошо, разве нет? Другое дело, что эта проверка могла бы происходить в какой-то совершенно другой форме.

@RAlex так что бы вы предложили, как по-вашему должен был бы выглядеть единый для всей страны формат экзамена, который бы вам понравился и при этом выполнял задачу, эффективно выявляя абитуриентов, дальнейшее обучение которых в в университете будет наиболее эффективно?

знания учеников - это знания и умения учителей. Остальное - от лукавого

Безусловно, ЕГЭ проверяет знания, умения и навыки в минимальном объёме. Для сдачи ЕГЭ не обязательно знать больше, чем по школьной программе. Но тут надо головой работать, то есть мыслить. Линки и регексы мыслить не учат. Для школы это лишняя информация, которая забирает время безо всякой пользы для мышления.

Любую задачу можно решить многими способами, поэтому есть вполне разумное мнение, что лучше решить 1 задачу многими способами, чем 100 задач одним способом. Для ЕГЭ это не нужно, но это полезно для ума. Поскольку школа мозги не развивает, то лучше крепко выучить 1 способ, чем 10.

Современная школа в принципе не способна развивать мышление. Моя жена преподавала в школе много лет, поэтому я мог бы более подробно рассказать, как и что нужно делать, но в современном обществе это будет воспринято как дискриминация. Поэтому советская власть придумала смешанные классы - с девочками, мальчиками, умными, средними и дураками. Очень выгодно красивую, но глупую девочку подсадить к умному, но не шибко красивому мальчику. Тогда оба будут учиться на 3 и четвёрки. Так стирали грани в СССР, так сейчас стирают грани на западе. Это от бессилия современной педагогической науки и общественной морали.

Поэтому все рассуждения, как сделать лучше, - бесплодны, потому что никто лучше делать не станет, поскольку у нас одно понимание, что лучше, а ТАМ - другое, выгодное для ТЕХ. Им плевать, что мы об этом думаем.

Мода не обязывает людей слепо ей следовать. Подражают обезьяны и дураки. Хитрецы и мошенники на этом делают деньги. Люди, которые не хотят быть пешками в политических и других играх, должны развивать в себе самостоятельность во всём. Но это личное дело каждого, кто кузнец своего счастья. Таких людей мало, но только из-за них мир ещё не рухнул окончательно.Школа - это государственное учреждение, поэтому нигде и ни в коей мере не будет развивать самостоятельность. И никакие формы проверки знаний ничего не изменят.

Осел останется ослом, Хотя осыпь его звездами; Где должно действовать умом, Он только хлопает ушами.

Державин, 1794 год.

Мне, к счастью, нужно отвечать только перед самим собой. И чтобы было не стыдно. В своё время я сдавал немало зачётов, экзаменов и прочей ерунды. Я человек, как я сам о себе мыслю, в некотором смысле самостоятельный. Поэтому мне учителя и преподаватели, за исключением начальных классов, никогда не были нужны ни в каком качестве - не как менторы/туторы, ни как экзаменаторы. Я получаю задачу - и решаю её. Поэтому я предпочитал письменные экзамены. Кстати, как я уже писал, в институте было полно тестов, которые примерно соответствовали моим представлениям и предпочтениям. То есть я понимаю экзамен так: получил задачу - решил - получил отметку. Никаких промежуточных звеньев. тут проблема в последнем звене - “получил отметку”. Если решение задачи не детерминировано, то есть нет точного и однозначного ответа, то всегда можно оценить неверно или заведомо, намеренно гнусно. Из этого следует, что оценка учителями недетерминированных заданий - это путь к произволу. В этом смысле ЕГЭ гораздо более справедливо оценивает знания. Дважды два должно быть четыре, а не пять и не семь… Поэтому сочинения - это оценка учителя самим собой, то есть насколько ученик близко передал мысли и чаяния учителя, а не свои мысли и чувства.

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