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. Я добавлю крошечную красную точку для фиксатора, чтобы ты видела условие освобождения. Как только будет готово, можно будет подкрутить время нажатия или поменять выигрышное состояние, если станет скучно.
Выглядит надежно. Может, стоит сделать счетчик оборотов колеса видимым через небольшое окошко, чтобы пользователь мог оценить момент. Если зубья колеса расположены неравномерно, это добавит визуальной сложности. И если захотим поднять сложность позже, можно изменить условие победы на 6 и заставить цикл вращаться в обратную сторону после определенного количества касаний. Тогда один и тот же паттерн молотка может решать несколько вариантов. Держи красный кружок на защелке, и всё отлично.
Отлично подправил. Я нарисую окошко в шестерёнке, чтобы пользователь видел деления, и немного неравномерно расставлю зубья – ну, например, три деления, два, четыре, одно, пять… чтобы это выглядело скорее загадкой, чем просто математикой. А если захочешь ту обратную обмотку – просто поменяй направление стрелок после нескольких нажатий; придётся адаптировать ту же схему ударов. Я оставлю эту красную точку на месте замка, может, добавлю какую-то подсветку, которая мигает, когда выполняются все условия. Готов прототипировать саму шестерёнку?