Номер 27 из ЕГЭ по информатике 2017 года

С одной стороны да, но с другой, вы посмотрите на современные игры (достаточно крупные), они требуют очень много, но не у каждого дома стоит компьютер с например GeForce GTX 1080Ti, вот как раз для этого и учат детей оптимизировать свои коды, только на простых примерах. Лишь бы понятно было всё!

Номер 27 из ЕГЭ не обязывает ученика писать задачу на PascalABC.net, в коем есть последовательности. Оно обязывает использовать либо один из языков программирования (алгоритмический в том числе) либо естественный язык. Среди языков программирования есть язык object Pascal, в котором последовательностей нет! Ещё раз подчёркиваю - использование возможностей различных компиляторов запрещено!

Это кто Вам такую, простите, глупость сказал?

Не надо искажать регламентирующие материалы ФИПИ в угоду поддержке собственных фантазий! Идем на сайт ФИПИ и читаем в разделе информатики “Методические рекомендации для учителей, подготовленные на основе анализа типичных ошибок участников ЕГЭ 2016 года” (авт. В.Р. Лещинер, М.А. Ройтберг):

Для написания программ в задании 27 можно будет использовать любой изучавшийся язык программирования, в том числе стандартные библиотеки.

Обратите также внимание на документ 2017 года “МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО ОЦЕНИВАНИЮ ВЫПОЛНЕНИЯ ЗАДАНИЙ ЕГЭ С РАЗВЕРНУТЫМ ОТВЕТОМ” - там нигде нет ни слова об ограничениях на язык программирования или его возможностей. А в Питоне нет массивов - знаете? Они в NumPi. И вообще нет почти математических функций - надо библиотеки подключать, а это разрешено только с 2017 года. А раньше как? Там только последовательности. Так что, по-Вашему и на других языках программирования надо запретить с массивами работать? Бред, бред и еще раз бред. По задаче 27 единственное языковое требование:

А. Напишите на любом языке программирования программу для решения поставленной задачи…Перед программой укажите версию языка программирования.

Да Вы, батенька, Роскомнадзор переплюнули!

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

Здесь такие идеи.

  1. Надо вместо чисел хранить их существенные характеристики (делится на 38, делится на 19 и не входит в предыдущую группу, делится на 2 и не входит в предыдущие группы и остальные)
  2. Понять, что ответ не зависит от порядка этих чисел, поэтому можно считать, что вначале идут числа 1 группы, потом 2, 3 и 4
  3. Понять, что не нужно сохранять ничего кроме количества чисел в каждой группе
  4. Понять, что на первом этапе достаточно считать числа тем или иным способом и получить значения этих четырех счетчиков
  5. На заключительном этапе посчитать нужное количество пар. Возможно, осознать, что на этом этапе даже циклы не надо писать
  6. Понять, что самое сложное - перебрать все пары чисел в группе делящихся на 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 элементов, а если их миллион, то странно вводить всё это из консоли и не ошибиться.

2 лайка

Возможно это потому, что в ряде языков входной поток можно переадресовывать…

Задача чисто математическая, поэтому легко решается даже на калькуляторе.

Если n - длина последовательности, n38 - количество чисел, кратных 38 n19 - количество чисел, не кратных 38, но кратных 19 n2 - количество чисел, не кратных 38, но кратных 2,

то число пар можно найти по формуле:

(2*n - n38 - 1) / 2 * n38 + n19 * n2

Второе слагаемое в этой формуле очевидно. Первое потребует вспомнить формулу для суммы членов арифметической прогрессии.

Программа на компьютере затратит несколько байтов и наносекунд на решение этой задачи.

Где мне получить 4 балла?

1 лайк

Это не очень хорошо для ЕГЭ по ИНФОРМАТКЕ. Вы представьте, что на ЕГЭ по истории будет чисто химическая задача.

Может и нехорошо, но меня удивляет, когда сумму натуральных от 1 до n программируют при помощи цикла, забыв, что она равна n(n+1)/2

Вот как раз хорошо! Чтобы будущие программисты изучали математику, иначе так и будут писать кривые программы.

Да, они (школьники) утверждают, что это задача дается для решения в теме “Циклы” ! Т.е. уже заранее какой-то “умник” заложил основы формирования “неправильного” мышления.

Если задача на циклы, то откуда появились дополнительные условия? Для изучения циклов она вполне годится.

Я имел в виду задачу о сумме чисел натурального ряда. Там условий нет.

Ого, и давно? Это что ещё за новости цензуры?

3 лайка

Всегда так было

2 лайка

Гнать в шею!

Не хотел бы создавать лишнюю тему. Но мой вопрос по теме ЕГЭ 2017 27 задания: Если честно, на экзамене забыл инициализировать одну переменную (result). Из этого вытекло 3 балла. А в итоге 97 баллов из 100 возможных. Поправьте если не прав. Разве в PascalABC при выделении памяти под глобальную переменную ей не присваивается 0( longint, integer ). Мне кажется, да. Но в документации не нашел информации про это(нашел только про выделение памяти). Так что идти на апелляцию без этого не смогу, наверное. Очень сильно надо, потому что иду против критериев и мне нужны факты, а не слова. А так сделал программу. Очень легкая.

Глобальным присваивается 0. Конечно. Это во всём .NET так. Это в Delphi так, а PascalABC.NET обеспечивает прежде всего совместимость с Delphi.

Локальным - нет. В частности, Result в функции не инициализируется.

Сочувствуем. Непрофессиональные проверяющие - бич ЕГЭ по информатике.

Согласен с предыдущим мнением. Гнать в шею!

1 лайк

Стоит идти на апелляцию? Если да, то где можно найти эту информацию. Документация по NET ? Через 2 - 3 дня перед комиссией. Разве result в моем случае не глобальная переменная?

Глобальная.

Например, это сказано вот здесь: http://pascalabc.net/downloads/pabcnethelp/index.htm#page=LangGuide/_ProgrStruct_Defs/vardef.html