Кодовый замок (Python)

Как при помощи двух команд открыть кодовый замок за минимально возможное время.

  • условие
  • решение

На кодовом замке имеется круглый диск с риской. Вокруг диска нанесены числа от 0 до 99 по часовой стрелке. Для управления замком служат две кнопки: “вправо” и “влево”. При нажатии на кнопку “вправо” диск вращается на 43 деления по часовой стрелке, при нажатии на кнопку “влево” – на 20 делений против часовой стрелки. Каждая из этих операций выполняется за 1 секунду. Изначально замок установлен на число 0. Замок открывается при его установке на число 50 – ключ замка.
За какое наименьшее время можно открыть замок при данном ключе 50?

Сколько бы мы ни вращали диск, риска всегда будет напротив числа из диапазона от 0 до 99. Можно сказать, что она всегда будет показывать результат целочисленного деления на 100.

Обозначим количество нажатий кнопки “вправо” – a, а количество нажатий кнопки “влево” – b.

Тогда, результат целочисленного деления (43 * a – 20 * b) на сто должен равняться пятидесяти.

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

Напишем небольшую программу и посмотрим, какие значения переменных подходят.

Выведем значения переменных, а также наименьшее время – наименьшую сумму переменных. Первоначально, как минимальное укажем значение, которое в дальнейшем явно должно измениться. Например, 1000. Диапазон значений переменных укажем, например, от 0 до 59 (in range(60)). Форматирование вывода – для удобства просмотра.

Получаем:

Или же для быстроты можно просто вывести значения переменных:

К такому же ответу можно прийти путём рассуждений.

На какое бы число мы не умножили 20, результат будет заканчиваться на 0. Значит, чтобы получить 50, 43 * a тоже должно заканчиваться на 0. Это может быть 10, 20, 30 и т.д. Из получившегося числа нужно вычесть 20 * b так, чтобы получившееся число заканчивалось на 50.

43 * 10 = 430

Ближайшее число, заканчивающееся на 50 – это 350. Чтобы получить 350, из 430 нужно вычесть 80. То есть:

43 * 10 – 20 * 4 = 350

Время: 10 + 4 = 14 секунд.

Следующие возможные варианты не дадут минимального значения, так как подходящие для 43 множители превышают 14.

Составление программы для перебора вариантов может ускорить решение задачи и даёт возможность проверить сделанные выводы.

Условие задачи из архива олимпиады по криптографии