У цій програмі повно недрукуваних символів, тож ось шістнадцятковий набір:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Примітка: для цього використовується числовий режим введення, який не може вводити від’ємні числа, тому це подання обмежується лише негативними цілими числами.
Одна з проблем, пов’язаних із проблемами, пов’язаними з поліцейськими та грабіжниками, полягає в тому, що ви не пишете пояснень коду (щоб зробити його складніше зламати). З іншого боку, це означає, що мені тут не треба йти на біди.
Я вибрав 7 як мову, тому що, особливо в стислих її позначеннях, це досить важко читати, і я не розумію, чому саме мені доводиться переживати проблеми пересування 8-бітових фрагментів програм, написаних на 3-бітове кодування. Удачі!
Пояснення
Тепер, коли програма була зламана (грубою силою, на жаль, це небезпека завжди в цих коротких рішеннях), я можу також пояснити, до чого я потрапляв. Це насправді було досить вирішимим, прочитавши програму; Я міг би зробити це набагато складніше, але це відчувало себе поганою ідеєю, коли існують жорстокі тріщини.
Почнемо з представлення програми в більш природному кодуванні. Як завжди, напівжирний цифри показують команди , які виконуються негайно (не всі з яких подана в програмі, 6і 7є , але 2для 5не є), unbolded числа представляють їх вцілілі еквіваленти ( 0до 5, всі з яких подана у вихідній програмі, до відома що 0є втечею 6і 1є втечею 7):
112 7 1 7 34002 77 023 67 13303
Набір команд, наявний у програмному джерелі 7, означає, що це в основному просто літерал, який представляє оригінальний стек (нічого іншого, що можна зробити з щойно уникнутими командами, 6і 7) не можна. Отже, перше, що програма зробить - це натиснути купу матеріалів на стек. Ось як виглядає стек після запуску програми ( |відокремлює елементи стека, як зазвичай у 7):
772 | 7 | 34662 | 023 | 73363
Кінцевий елемент стека потім копіюється, щоб стати кодом для запуску (залишаючись у стеку). Як це буває, це єдина частина програми, кодом; все інше - лише дані. Ось що це означає:
73363
7 Помістіть порожній елемент на стек
3 Виведіть верхній елемент стека, відкиньте елемент нижче
73 Комбінований ефект із цього: відкиньте верхній елемент стека
3 Виведіть верхній елемент стека, відкиньте елемент нижче
6 Вийдіть з елемента верхнього стека, потім додайте його до елемента нижче
3 Виведіть елемент верхнього стека, відкиньте елемент внизу
Іншими словами, це здебільшого лише купа інструкцій вводу / виводу. Давайте детально проаналізуємо це:
73відкидає те, 73363що все ще знаходиться на вершині стека.
3виводить 023і відкидає 34662. Таким чином, видно, що 34662це коментар, який використовувався для зберігання потрібних байтів в іншій версії програми. Що стосується того, що 023робить при виході, він вибирає формат вводу / виводу 0 (цілі числа), то 23це директива, яка вимагає від реалізації ввести ціле число (в 7 ви вводите за допомогою виведення конкретних кодів, які вимагають введення). Введення робиться шляхом копіювання елемента стека внизу, наприклад, якщо ціле число введення дорівнює 10, наступним елементом стека (на даний момент 7) стане 7777777777. Таким чином, ми приймаємо дані від користувача у десятковій формі, але вони зберігаються як одинакові.
6виходить з верхнього елемента стека (змінюючи кожен екземпляр 7до 1; таким чином 7виводяться рядки, що складаються повністю з s), а потім додає його до елемента стека перед ( 772). Тож наші дані зараз щось подібне 7721111111111.
- Нарешті,
3виводить відповідний елемент стека (і з'являється порожній елемент стека, який є частиною початкового стека за замовчуванням). Його значення обчислюється, беручи число 1s і 7s, і віднімаючи число 0s і 6s. (У 2середині в більшості випадків ігнорується; якщо він знаходиться в кінці рядка, він замість того, щоб його ігнорувати, перетвориться на новий рядок, але правила PPCG це не хвилюють.) Таким чином, вихід є оригінальним вхід плюс 2.
На даний момент у стеку немає нічого корисного і нічого в програмі, тому програма виходить.
Як ми це повернемо? Це проста проблема зміни 11на 00, щоб ми передбачили символи до входу, що робить його на 2 нижче, а не на 2 вище. У програмі є додатково 00приховані вісім восьмеричних цифр (щоб восьмеричні цифри та байти вирівнювалися один з одним), тому ми можемо просто поміняти їх 11на початок.