Shpikachka & ToolTrekker
Привет, Шпичка. Давно хотел сделать ящик с инструментами модульный, как огромная головоломка. Представь, каждое отделение открывается по определенной последовательности ударов молотком, или, может, по какому-то маленькому криптоключу. Пришлось бы код взламывать, чтобы до ключей добраться! Как думаешь, как сделать замок одновременно механический и с алгоритмической головоломкой?
Звучит как идеальное место для какой-нибудь головоломки. Сначала надо определиться с языком шифрования – последовательность ударов молотка можно сопоставить с битами, или использовать простую подстановку. А уже потом подумать о механике – там могут быть рычаги или вращающийся диск, который выровняется только если входной паттерн соответствует секретному коду. Хорошая идея – сделать замок каждого отсека небольшим автоматом с конечным числом состояний; удары перемещают его между этими состояниями, и только правильная последовательность состояний откроет засов. Чтобы добавить криптографический шарм, можно использовать легкий хеш, например, SHA‑256 для последовательности ударов, и внедрить пороговый механизм, чтобы открывался только отсек с хеш-суммой, заканчивающейся на определенной последовательности. Получится и физическая, и алгоритмическая сложность. С чего начнем: сначала нарисуем схему состояний, или сразу перейдем к сопоставлению ударов с битами?
Ого, это что-то невероятное. Хотел бы сначала набросать простенькую схему состояний — просто от руки на салфетке, чтобы увидеть циклы. Тогда и решим, стоит ли заморачиваться с этим хаш-триком и тратить ещё ресурсы. Сколько, как думаешь, состояний нам понадобится, чтобы усложнить задачу, но при этом можно было сделать это одним инструментом? И добавим ли мы небольшой таймер, чтобы запор срабатывал только в нужный момент?
С восьми штатов будет достаточно, чтобы было интересно, но не сводило с ума. Попробуй восемь – два бита пространства штатов дают 2^3 паттернов до срабатывания, и ты можешь сопоставить каждый удар молотка с переходом. С одним молотком тебе придётся запомнить последовательность ударов, которая будет проходить через эти восемь состояний и заканчиваться на "открытом". Колесо-таймер добавило бы приятную изюминку; можно сделать так, чтобы замок открывался только если финальный удар приходится на правильную отметку. Это хорошая дополнительная защита, но ты можешь и оставить чисто механический автомат, если хочешь, чтобы было проще. Какой подход кажется тебе более интересной головоломкой?
Ладно, я думаю, лучше чистый автомат состояний. Это логичная задачка, да еще и с колесом времени можно добавить, как дополнительный вызов. Давай сначала набросаем восемь состояний, а потом, если захочешь, добавим маленькое колесико для таймера. Как тебе такая идея?
Хорошо, у нас восемь штатов – это наш холст. Пронумеруем их от 0 до 7, пусть молоток переключается между ними по кругу: 0→1→2→3→4→5→6→7→0. Выбери "выигрышной" позиции, скажем, 3. Пользователь должен ударить молотком ровно семь раз, чтобы попасть в 3, и это будет открытый код. Если добавим таймер, пусть защелка откроется только тогда, когда молоток попадает в 3 на 4-м тике из 12-ти – простое множительное ограничение. Так это будет механически просто, но при этом потребует размышлений. Готова набросать схему?
Понял, запишу на черновике: восемь кругов с цифрами от 0 до 7, стрелки ведут 0→1→2→3→4→5→6→7→0. Отметь состояние 3 как выигрышное, и добавь маленький значок шестеренки для колеса на 12 делений. Потом поставь счётчик тиков, чтобы он показывал 4-й тик, когда дойдешь до 3. Я добавлю крошечную красную точку для фиксатора, чтобы ты видела условие освобождения. Как только будет готово, можно будет подкрутить время нажатия или поменять выигрышное состояние, если станет скучно.