Задание 5 ОГЭ по информатике: решайте с автопроверкой

В задании 5 у исполнителя две команды, например «прибавь b» и «умножь на 3». Дана программа из номеров команд. Нужно найти неизвестное b, результат программы, исходное число или самую короткую программу. Вычисления короткие, но в них легко сбиться, поэтому программа, которая повторяет исполнителя, хорошо проверяет ответ.

Решать задачи номера

Как решать программой

Программа исполнителя — это строка из цифр 1 и 2. Её легко выполнить циклом по символам: для «1» прибавляйте b, для «2» умножайте.

Неизвестное b находят перебором: для каждого b выполните программу и сравните результат с данным. Обычно подходит ровно одно b.

Самую короткую программу ищут перебором программ по возрастанию длины через itertools.product("12", repeat=k). Первая найденная и будет самой короткой.

Задачи на восстановление исходного числа решаются так же: переберите исходные числа и выполните программу для каждого. Когда команды обратимы, можно и пройти программу с конца, вычитая и деля.

Разбор примера

Исполнитель начинает с числа 5, выполняет программу 12121 и получает 136. Чему равно b?

start, program, result = 5, '12121', 136
for b in range(1, 1001):
    x = start
    for c in program:
        x = x + b if c == '1' else x * 3
    if x == result:
        print(b)

Программа печатает

7

При b = 7 число меняется так: 5, 12, 36, 43, 129, 136. Результат совпал с данным, а при других b он больше или меньше.

Решить эту задачу

Задачи к заданию 5

  • Найдите неизвестное bЛёгкаяРешать
  • Результат программы ВычислителяЛёгкаяРешать
  • Восстановите исходное числоЛёгкаяРешать
  • Самая короткая программаСредняяРешать
  • Вычитание и квадратЛёгкаяРешать
  • Сколько программ дают результатСредняяРешать

Бесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).

Вопросы и ответы

Можно ли найти b без перебора?
Да, уравнением: результат линейно зависит от b. Перебор проще и не даёт ошибок в алгебре.
Как перебрать программы длины k?
itertools.product("12", repeat=k) выдаёт все строки из единиц и двоек этой длины.
Что если подходят несколько b?
В задачах экзамена b единственное. Если программа печатает несколько, проверьте код.
Что если команды другие, например «вычти» и «раздели»?
Подход тот же: выполните программу по символам. Следите, чтобы деление было нацело, если так сказано в условии.