7 , 2 байти
7 використовує 3-розрядний набір символів, але приймає вхід, упакований у байти (і відповідно до мета, мови з субайт-наборами символів підраховуються, використовуючи байти для файлу на диску ). Ось xxd
дамп програми:
00000000: 4cf4 L.
Віддаючи цей файл інтерпретатору 7, він видасть таку програму:
00000000: 4fa6 7f O..
яка згодом знову виведе оригінальну програму.
То що ж тут відбувається? Ніякого читання джерела не бере участь (насправді, я не думаю, що це можливо прочитати джерело в 7), хоча, мабуть, програма обманює іншим способом; дайте мені знати, що ви думаєте. Ось як працює програма. (Зауважте, що кожна команда 7 має два варіанти, деякі з яких не мають імен і не можуть відображатися в початковій програмі. Всього дванадцять команд, у шести парах. Я використовую жирний шрифт для активних команд, нежирний для пасивного команд, а у випадках, коли активна команда не має імені, я даю їй те саме ім'я, що і відповідна пасивна команда, і покладаюся на жирний шрифт для розрізнення. У випадку, коли обидва названі, наприклад, 7
який є активним варіантом1
, кожна команда отримує своє ім'я, а жирне - лише підкреслення синтаксису.)
231 7 23 Оригінальна програма, розпакована в восьмерику
231 Поштовх 237 на стек
23 Натисніть 23 на стек
(неявно) додайте до програми копію верхньої частини стека
2 Дублювання верхньої частини стека (зараз 23 )
3 Вихідна частина стека, другий елемент стека
У цей момент інтерпретатор 7 бачить, що у верхній частині стека є команди ( 2
і 3
), які не є представницькими, тому він виходить з верху стека, виробляючи 723
(який є). Перший вихід команди вибирає формат виводу; у цьому випадку це формат 7, "форматувати вихід так само, як і програма". Таким чином, команди отримують вихід, упакований у байти. Потім програма продовжується:
231 7 23 23
(неявно) додайте до програми копію верхньої частини стека
2 Дублювання верхньої частини стека (зараз 237 )
3 Вихідна частина стека, другий елемент стека
7 Помістіть порожній елемент на стек
На даний момент на стеку немає нічого, крім порожніх елементів стека, тому програма виходить. Ми виводимо 23
раніше. Якщо ми втечемо 237
(і нам доведеться, тому що вона містить непоказні команди), ми отримаємо 7231
. Це отримує вихід безпосередньо, роблячи кінцевий вихід програми 237231
(форматується так само, як і програма, тобто упаковується в байти). Ось так 4fa67f
. (Можна відзначити, що це 1
було цілком безглуздо з точки зору впливу на вихід; єдина причина, по якій вони полягають у тому, щоб зробити дві програми різними.)
Біг 237231
протікає майже точно так само; Різниця полягає в тому, що марний 1
запускається відразу після першого друку (а порожній елемент видаляється неявно вдруге, коли буде досягнуто поточного кінця програми). Знову ж, сам 231
результат виведення 23
кінців вгору, перед самим результатом виведення передує оригінальна програма 7
, і ми отримуємо 231723
.
Спостерігач може зауважити, що обидві програми, незважаючи на однакову довжину у «рідному» вісімку мови, мають різну довжину на диску. Це тому, що 7-ма програма може бути заповнена довільним числом 1 біт, а запакований формат відкидає останню підкладку. Ось як відбувається кодування:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
Іншими словами, двох байтів, 4C
F4
достатньо для представлення програми, так що це все, що я використав.