С одной стороны да, но с другой, вы посмотрите на современные игры (достаточно крупные), они требуют очень много, но не у каждого дома стоит компьютер с например GeForce GTX 1080Ti, вот как раз для этого и учат детей оптимизировать свои коды, только на простых примерах. Лишь бы понятно было всё!
Номер 27 из ЕГЭ не обязывает ученика писать задачу на PascalABC.net, в коем есть последовательности. Оно обязывает использовать либо один из языков программирования (алгоритмический в том числе) либо естественный язык. Среди языков программирования есть язык object Pascal, в котором последовательностей нет! Ещё раз подчёркиваю - использование возможностей различных компиляторов запрещено!
Это кто Вам такую, простите, глупость сказал?
Не надо искажать регламентирующие материалы ФИПИ в угоду поддержке собственных фантазий! Идем на сайт ФИПИ и читаем в разделе информатики “Методические рекомендации для учителей, подготовленные на основе анализа типичных ошибок участников ЕГЭ 2016 года” (авт. В.Р. Лещинер, М.А. Ройтберг):
Для написания программ в задании 27 можно будет использовать любой изучавшийся язык программирования, в том числе стандартные библиотеки.
Обратите также внимание на документ 2017 года “МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО ОЦЕНИВАНИЮ ВЫПОЛНЕНИЯ ЗАДАНИЙ ЕГЭ С РАЗВЕРНУТЫМ ОТВЕТОМ” - там нигде нет ни слова об ограничениях на язык программирования или его возможностей. А в Питоне нет массивов - знаете? Они в NumPi. И вообще нет почти математических функций - надо библиотеки подключать, а это разрешено только с 2017 года. А раньше как? Там только последовательности. Так что, по-Вашему и на других языках программирования надо запретить с массивами работать? Бред, бред и еще раз бред. По задаче 27 единственное языковое требование:
А. Напишите на любом языке программирования программу для решения поставленной задачи…Перед программой укажите версию языка программирования.
Да Вы, батенька, Роскомнадзор переплюнули!
Конечно, задача идейно хорошая. Это удачная попытка сравнять все языки с разными языковыми возможностями выбором хорошего алгоритма.
Здесь такие идеи.
- Надо вместо чисел хранить их существенные характеристики (делится на 38, делится на 19 и не входит в предыдущую группу, делится на 2 и не входит в предыдущие группы и остальные)
- Понять, что ответ не зависит от порядка этих чисел, поэтому можно считать, что вначале идут числа 1 группы, потом 2, 3 и 4
- Понять, что не нужно сохранять ничего кроме количества чисел в каждой группе
- Понять, что на первом этапе достаточно считать числа тем или иным способом и получить значения этих четырех счетчиков
- На заключительном этапе посчитать нужное количество пар. Возможно, осознать, что на этом этапе даже циклы не надо писать
- Понять, что самое сложное - перебрать все пары чисел в группе делящихся на 38 (там формула арифметической прогрессии), а в остальных группах достаточно умножить количество элементов этой группы на количество элементов одной из предыдущих групп или всех сразу.
Конечно, язык тут может помочь в более понятной записи. Ну например:
begin
var (d38,d19,d2,d1) := (0,0,0,0);
var n := ReadInteger;
foreach var x in ReadSeqInteger(n) do
if x mod 38 = 0 then
d38 += 1
else if x mod 19 = 0 then
d19 += 1
else if x mod 2 = 0 then
d2 += 1
d1 := n - d38 - d19 - d2;
// Ну и дальше - последняя часть
end.
Тут ввод отделен от вычислений, а вычисления разбиты на 2 части - предкомпиляцию и заключительное вычисление. То есть, всё хорошо тут с качеством кода.
Если проверяющий, увидев это решение и тем более поняв идею, снизит решение за использованные возможности языка, он - больной, это - клиника, его надо лечить и ограждать от проверки работ школьников пожизненно.
В условии задачи конечно лишним является условие, что все числа различны.
Ну и - можно конечно балл потерять за хранение в памяти - пусть подавятся:
begin
var a := ReadArrInteger(ReadInteger).Numerate;
Print(a.Cartesian(a).Where(y->(y[0][0]<y[1][0])and(y[0][1]*y[1][1] mod 38 = 0)).Count)
end.
Это решение замечательно тем, что оно написано ровно по постановке задачи: берутся все пары (это Cartesian и Where со сравнением номеров) и из них выбираются только те, произведение которых кратно 38. Здесь только одна дополнительная идея - значения надо пронумеровать.
Куда большим грехом в этой задаче является ввод всех значений из консоли (!) Ведь если их всего 1000, то странно запрещать использовать массив на 1000 элементов, а если их миллион, то странно вводить всё это из консоли и не ошибиться.
Возможно это потому, что в ряде языков входной поток можно переадресовывать…
Задача чисто математическая, поэтому легко решается даже на калькуляторе.
Если n - длина последовательности, n38 - количество чисел, кратных 38 n19 - количество чисел, не кратных 38, но кратных 19 n2 - количество чисел, не кратных 38, но кратных 2,
то число пар можно найти по формуле:
(2*n - n38 - 1) / 2 * n38 + n19 * n2
Второе слагаемое в этой формуле очевидно. Первое потребует вспомнить формулу для суммы членов арифметической прогрессии.
Программа на компьютере затратит несколько байтов и наносекунд на решение этой задачи.
Где мне получить 4 балла?
Это не очень хорошо для ЕГЭ по ИНФОРМАТКЕ. Вы представьте, что на ЕГЭ по истории будет чисто химическая задача.
Может и нехорошо, но меня удивляет, когда сумму натуральных от 1 до n программируют при помощи цикла, забыв, что она равна n(n+1)/2
Вот как раз хорошо! Чтобы будущие программисты изучали математику, иначе так и будут писать кривые программы.
Да, они (школьники) утверждают, что это задача дается для решения в теме “Циклы” ! Т.е. уже заранее какой-то “умник” заложил основы формирования “неправильного” мышления.
Если задача на циклы, то откуда появились дополнительные условия? Для изучения циклов она вполне годится.
Я имел в виду задачу о сумме чисел натурального ряда. Там условий нет.
Ого, и давно? Это что ещё за новости цензуры?
Всегда так было
Гнать в шею!
Не хотел бы создавать лишнюю тему. Но мой вопрос по теме ЕГЭ 2017 27 задания:
Если честно, на экзамене забыл инициализировать одну переменную (result). Из этого вытекло 3 балла. А в итоге 97 баллов из 100 возможных.
Поправьте если не прав. Разве в PascalABC при выделении памяти под глобальную переменную ей не присваивается 0( longint, integer ). Мне кажется, да.
Но в документации не нашел информации про это(нашел только про выделение памяти). Так что идти на апелляцию без этого не смогу, наверное. Очень сильно надо, потому что иду против критериев и мне нужны факты, а не слова.
А так сделал программу. Очень легкая.
Глобальным присваивается 0. Конечно. Это во всём .NET так. Это в Delphi так, а PascalABC.NET обеспечивает прежде всего совместимость с Delphi.
Локальным - нет. В частности, Result в функции не инициализируется.
Сочувствуем. Непрофессиональные проверяющие - бич ЕГЭ по информатике.
Согласен с предыдущим мнением. Гнать в шею!
Стоит идти на апелляцию? Если да, то где можно найти эту информацию. Документация по NET ? Через 2 - 3 дня перед комиссией. Разве result в моем случае не глобальная переменная?
Глобальная.
Например, это сказано вот здесь: http://pascalabc.net/downloads/pabcnethelp/index.htm#page=LangGuide/_ProgrStruct_Defs/vardef.html