У цій програмі повно недрукуваних символів, тож ось шістнадцятковий набір:
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
виводить відповідний елемент стека (і з'являється порожній елемент стека, який є частиною початкового стека за замовчуванням). Його значення обчислюється, беручи число 1
s і 7
s, і віднімаючи число 0
s і 6
s. (У 2
середині в більшості випадків ігнорується; якщо він знаходиться в кінці рядка, він замість того, щоб його ігнорувати, перетвориться на новий рядок, але правила PPCG це не хвилюють.) Таким чином, вихід є оригінальним вхід плюс 2.
На даний момент у стеку немає нічого корисного і нічого в програмі, тому програма виходить.
Як ми це повернемо? Це проста проблема зміни 11
на 00
, щоб ми передбачили символи до входу, що робить його на 2 нижче, а не на 2 вище. У програмі є додатково 00
приховані вісім восьмеричних цифр (щоб восьмеричні цифри та байти вирівнювалися один з одним), тому ми можемо просто поміняти їх 11
на початок.