Кодовый замок (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.
Составление программы для перебора вариантов может ускорить решение задачи и даёт возможность проверить сделанные выводы.
Условие задачи из архива олимпиады по криптографии