Найти в Дзене
Павел Рябчиков

Нейросети для подготовки к ЕГЭ: пока репетиторы круче. Пока))

Дай-ка, думаю, и я пять копеек вложу своих в общую истерию по поводу технологической сингулярности))

Спойлер: прочтение этой статьи даст вам три первичных балла на ЕГЭ по информатике, если вдруг надо. Распорядитесь с умом моей болтовнёй, я обычно за неё деньги беру 😉

Мэтр Kandinsky 2.1, Результат генерации по запросу "Репетитор и нейросеть при помощи армрестлинга выясняют, кто из них круче", стиль: 4k. Осталось выяснить, кто из этих двоих я, а кто - ChatGPT, о которой сегодня пойдёт речь
Мэтр Kandinsky 2.1, Результат генерации по запросу "Репетитор и нейросеть при помощи армрестлинга выясняют, кто из них круче", стиль: 4k. Осталось выяснить, кто из этих двоих я, а кто - ChatGPT, о которой сегодня пойдёт речь

Как сэкономить на репетиторе и почему это ни у кого (почти) не получится? Разберём для начала несколько типичных задач из ЕГЭ по информатике.

Пример 1. Задание 7, объём графических файлов. (ссылка на задачу на сайте К. Ю. Полякова)

(№ 4789) Изображения размером 4х7 дюйма сканируются с разрешением 300 ppi и использованием 2 в 24 степени цветов. Заголовок файла занимает 6 Кбайт. Для хранения таких изображений выделено 640 Мбайт памяти. Сколько изображений удастся сохранить? В ответе введите целое число.

Теоретический минимум для решения задачи (очень упрощённо):

  • Объём информации в растровом изображении (без заголовка и прочего такого, только графика) в битах - это количество точек в изображении (K) умноженное на цветопередачу (i), то есть, на количество битов в одной точке изображения (I = K * i)
  • Количество цветов в палитре изображения - это двойка, возведённая в степень, равную количеству бит в одной точке (N = 2 в степени i, формула Шеннона-Хартли)
  • В байте - восемь битов, в килобайте - 1024 байта, в мегабайте - 1024 килобайта и так далее.

Итак, чтобы решить эту задачу, находим объём изображения вместе с заголовком (объём заголовка выражен в килобайтах, поэтому и всё изображение будем измерять в них же).

  • 4 * 300 = 1200 точек (ширина изображения)
    7 * 300 = 2100 точек (длина изображения)
    1200 * 2100 = 2 520 000 точек (то самое K)
  • Цветов в палитре изображения - 2 в 24 степени, то есть показатель степени даёт нам количество битов в одной точке - двадцать четыре штуки (то самое i).
  • 2 520 000 * 24 = 60 480 000 битов (то самое I)
  • делим на восемь, получаем байты: 7 560 000 байтов
    делим байты на 1024, получаем килобайты: 7382,8125 килобайтов
    прибавляем объём заголовка, 6 килобайтов: 7388,8125 килобайтов
И вот тут мы сталкиваемся с первым препятствием. Трое из четверых одиннадцати-мать-их-классников НЕ ЗНАЮТ соотношений единиц измерения информации и спрашивают: А ПОЧЕМУ МЫ ДЕЛИМ НА ВОСЕМЬ???

Далее. Чтобы получить КОЛИЧЕСТВО изображений, нам будет проще делить килобайты на килобайты, то есть общий объём (он пока в мегабайтах) на объём одного изображения. Переводим 640 мегабайтов в килобайты методом ужасно трудоёмкого умножения на 1024, делим и получаем:

(640 * 1024) / 7388,8125 = 88,6962553... (то есть дробь, нецелое число).

Нецелых изображений не бывает, поэтому отбрасываем дробную часть и получаем 88 (восемьдесят восемь) изображений.

Вот такой, подробный, как для первоклашек, способ семь из десяти учеников запоминают С ТРЕТЬЕГО, А ТО И С ЧЕТВЁРТОГО РАЗА.
Сложно?

Если бы я или ученик, который с седьмого класса информатику не задвигал, решал бы эту задачу, то он (или я) бы сделал вот так:

(640 * 1024) /(((4 * 300 * 7 * 300 * 24) / (8 * 1024)) + 6) = 88,69... = 88

То есть, в одно выражение. Понятно, что теорию для этого надо знать. Её не знает почти никто.

В школе же не дают ничего. А то что дают - нигде и никогда не пригодится, ага.
Да думать вас учат, думать. Вот и всё. А так-то - да, сама по себе информация ценности не представляет. Только и только В КОНТЕКСТЕ, применимо к определённым ситуациям, из которых жизнь, собственно, и состоит.

Теперь посмотрим, что скажет по поводу этой задачи навязшая на зубах нейронка ChatGPT:

Логика практически та же, но не зная теории - не поймёшь. Лишние подробности опускаются, поэтому нубу (пардон, не нубу, а взрослой, сформированной личности, имеющей, как она думает, дофига прав, не подозревающей об обязанностях и не имеющей знаний даже для порогового балла на экзамене) не понять, почему тут 24 бита на точку. Округление до десятых мегабайта тоже некорректно, но в данном случае ошибка в пределах допустимой погрешности, ответ в итоге правильный
Логика практически та же, но не зная теории - не поймёшь. Лишние подробности опускаются, поэтому нубу (пардон, не нубу, а взрослой, сформированной личности, имеющей, как она думает, дофига прав, не подозревающей об обязанностях и не имеющей знаний даже для порогового балла на экзамене) не понять, почему тут 24 бита на точку. Округление до десятых мегабайта тоже некорректно, но в данном случае ошибка в пределах допустимой погрешности, ответ в итоге правильный

Пример 2. Комбинаторика, задание 8. Количество комбинаций различных символов (ссылка на задачу на сайте К. Ю. Полякова)

(№ 5336) (ЕГЭ-2022) Определите количество пятизначных чисел, записанных в девятеричной системе счисления, которые не начинаются с нечётных цифр, не оканчиваются цифрами 1 или 8, а также содержат в своей записи не более одной цифры 3.

Прежде чем браться за такие задачи, я всегда спрашиваю у учеников: сколько в десятичной (то есть, нашей, нормальной, человеческой) системе счисления трёхзначных чисел? Каких только ответов я не слышал!

А вы знаете?))

На самом деле их 900, не больше, не меньше. Самое маленькое - 100, самое большое 999. Числа трёхзначные. В разряде единиц - числа от 0 до 9, т.е. десять вариантов единиц. То же самое в разряде десятков, от 0 до 9, десять штук вариантов. А вот с сотнями похуже, их там всего девять вариантов. Не потому, что сотни плохие, а потому, что ни одно число, кроме нуля, с нуля не начинается. Перемножаем все эти количества вариантов и получаем девятьсот.

В принципе, все вот такие задачи так решить можно, чтобы не использовать формулы из комбинаторики (это, если что, алгебра, 9 класс).

Давайте прикинем, как вообще будут выглядеть эти числа. Система счисления девятеричная, цифр всего девять, от нуля до восьми.

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

Вот так будут выглядеть эти группы чисел
Вот так будут выглядеть эти группы чисел

То есть, если в числе встречается тройка, то вариантов цифр в том разряде, где эта тройка стоит будет всего один.

Посчитаем количество вариантов на каждой позиции. Помним о том, что в начале числа не будет нечётных цифр (а ещё нуля), в конце - единиц и восьмёрок, а система счисления - девятеричная:

Количество вариантов цифр в каждом разряде
Количество вариантов цифр в каждом разряде

Теперь нужно перемножить все количества вариантов в каждой группе и сложить получившиеся числа:

Да, электронные таблицы помогают, надо уметь пользоваться
Да, электронные таблицы помогают, надо уметь пользоваться

Теперь предложим эту задачу ChatGPT:

Ответ неверный
Ответ неверный

И вот они, ошибки! Не может число с нуля начинаться! И остальное условие задачи тоже катится в тартарары. Так что не, не, не.

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

Пример 3. Задание 25, Перебор чисел. Соответствие маске (ссылка на задачу на сайте К. Ю. Полякова)

(№ 4987) (А. Кабанов) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300425. Среди натуральных чисел, не превышающих 109, найдите все числа, соответствующие маске 1?34567?9 и делящиеся на 17 без остатка. В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им частные от деления на 17.

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

1. Неизвестные цифры обозначим в виде переменных x и y, например.
2. Представляем число как сумму некоторых слагаемых:
100000000
x0000000 (это будет, соответственно, x * 10000000)
3456700
y0 (это, получается, y * 10)
9

Или ещё проще:
103456709
x0000000
y0
3. Если число делится на 17, то выводим сначала его, потом - частное от его деления на 17.

Вот код на Python и результат его работы:

Несмотря на неторопливость языка Python, программа выполняется мгновенно, так как совершает всего 100 (сто) проверок
Несмотря на неторопливость языка Python, программа выполняется мгновенно, так как совершает всего 100 (сто) проверок

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

1. Задействуем специальный модуль (набор команд) для работы с маской.
2. В цикле перебираем все числа, кратные, в данном случае, 17 (так в задаче - они должны делиться на 17).
3. Если число соответствует маске, то выводим его, а так же частное от его деления на 17.

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

Этот способ вполне хорош. Если в маске одни звёздочки - делаем только им и не заморачиваемся с оптимизацией - времени на экзамене на это не будет.

А вот что предлагает нам для решения этой задачи ChatGPT:

Задача прокомментирована, но код, увы, придётся править. Ошибка. В левом углу красненьким написано. Да и сама программа структурой своей кагбэ намекает - не туда идём, не туда. Получается забивание гвоздей микроскопом. Сложно, неудобно и, в конце концов, неправильно.
Задача прокомментирована, но код, увы, придётся править. Ошибка. В левом углу красненьким написано. Да и сама программа структурой своей кагбэ намекает - не туда идём, не туда. Получается забивание гвоздей микроскопом. Сложно, неудобно и, в конце концов, неправильно.

Пример 4. Тоже 25-е задание, но из позапрошлогодних, поиск делителей числа (ссылка на задачу на сайте К. Ю. Полякова)

(№ 2562) (Демовариант 2021 г.). Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [174457; 174505], числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти два делителя в таблицу на экране с новой строки в порядке возрастания произведения этих двух делителей. Делители в строке таблицы также должны следовать в порядке возрастания.
Способ решения очень простой. даже оптимизировать не будем, незачем. Писать будем на Python.
Произведение этих двух делителей, на минуточку, это и есть само число.

1. Перебираем все числа на заданном числовом промежутке.
2. Для каждого числа создаём массив, в который будем помещать найденные делители.
3. Для каждого числа на промежутке от 2 до половины самого числа (самый большой делитель числа, если это не само число, не больше его половины) перебираем все числа, которые могут оказаться делителями, все подряд, все-все, вообще все.
4. Если число из промежутка делится на найденное число - делитель найден, помещаем его в массив.
5. Если длина массива равна двум, то есть в нём два элемента, два делителя найденных, то выводим этот массив. Во-первых, и числа будут перебраны в порядке возрастания, во вторых, делители в массиве тоже будут расположены в порядке возрастания.

Вот программа и пары чисел. В квадратных скобках, потому что выведен массив. Можно и без них, но вы ведь мне верите? Или нет? Ладно, если хотите, как у нейросети или К. Ю. Полякова, то поставьте символ '*' в последней строке в скобках перед divs
Вот программа и пары чисел. В квадратных скобках, потому что выведен массив. Можно и без них, но вы ведь мне верите? Или нет? Ладно, если хотите, как у нейросети или К. Ю. Полякова, то поставьте символ '*' в последней строке в скобках перед divs

Это ответ. Как видим, Пал Саныч не обманывает:

-11

А вот ChatGPT посчитала себя умнее одесского раввина (кстати, получилось):

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

А вот что эта программа должна вывести по мнению самой нейросети:

Как видим, если бы ученик взялся переписывать этот результат, не проверив его на деле, был бы лёгонький такой конфузец и минус первичный балл. Странно, почему при рабочем коде нейросеть выдала неверный результат его работы? Ответ простой - она неразумная. И да, искусственного интеллекта ещё нет. Пока нет.
Как видим, если бы ученик взялся переписывать этот результат, не проверив его на деле, был бы лёгонький такой конфузец и минус первичный балл. Странно, почему при рабочем коде нейросеть выдала неверный результат его работы? Ответ простой - она неразумная. И да, искусственного интеллекта ещё нет. Пока нет.

Вывод: грамотный ученик при помощи нейросетей усвоит мою науку, я думаю, значительно быстрее, чем без них. Неграмотный ученик, а их подавляющее большинство, такой, думать не желающий, неизбежно от меня по мозгам получающий, не сможет использовать нейросеть для своего развития, потому что развиваться не хочет. А вот как захочет - тогда сможет, потому что станет уже каким надо 😉

Мэтр Kandinsky 2.1, Результат генерации по запросу "Репетитор Пал Саныч Рябчиков и нейросеть ChatGPT при помощи армрестлинга выясняют, кто из них круче", стиль: 4k. Даже несмотря на уточнённый запрос, непонятно, кто из нас кто. Но я круче.
Мэтр Kandinsky 2.1, Результат генерации по запросу "Репетитор Пал Саныч Рябчиков и нейросеть ChatGPT при помощи армрестлинга выясняют, кто из них круче", стиль: 4k. Даже несмотря на уточнённый запрос, непонятно, кто из нас кто. Но я круче.

Так что как помощника я ChatGPT вполне рассматриваю. И применяю уже. Четвёртая версия сильно круче версии 3.5, однозначно. Но... Не друг. Не товарищ. Инструмент. И фиг она меня сковырнёт с пьедестала венца творения 😜

Длинно сегодня получилось, да?

Обнимаю.

Ваш Пал Саныч Рябчиков