7 , 2 bajty
7 używa 3-bitowego zestawu znaków, ale pobiera dane wejściowe spakowane w bajtach (i zgodnie z meta, języki z podtaktowymi zestawami znaków są liczone za pomocą bajtów pliku na dysku ). Oto xxd
zrzut programu:
00000000: 4cf4 L.
Podając ten plik do interpretera 7, wyświetli następujący program:
00000000: 4fa6 7f O..
który z kolei ponownie wyświetli oryginalny program.
Co się tu dzieje? Nie ma potrzeby czytania źródła (tak naprawdę nie sądzę, że można odczytać źródło w 7), chociaż program prawdopodobnie oszukuje w inny sposób; Powiedz mi co myślisz. Oto jak działa program. (Zauważ, że każde 7 poleceń ma dwa warianty, z których niektóre nie mają nazw i nie mogą pojawić się w oryginalnym programie. W sumie jest 12 poleceń w sześciu parach. Używam pogrubienia dla poleceń aktywnych, niepogrubionego dla pasywnego polecenia, a w przypadkach, gdy aktywne polecenie nie ma nazwy, nadaję mu taką samą nazwę jak odpowiadające mu polecenie pasywne i polegam na pogrubieniu, aby je rozróżnić. W przypadku, gdy oba są nazwane, np. 7
który jest aktywnym wariantem 1
, każde polecenie otrzymuje własną nazwę, a pogrubienie to tylko wyróżnianie składni).
231 7 23 Oryginalny program, rozpakowany do formatu ósemkowego
231 Wciśnij 237 na stos
23 Wciśnij 23 na stos
(niejawnie) dołącz do programu kopię góry stosu
2 Duplikat góry stosu (obecnie 23 )
3 Wyjście góry stosu, pop drugi element stosu
W tym momencie 7 interpreter widzi, że góra stosu zawiera polecenia ( 2
i 3
), które nie są reprezentowalne, więc ucieka z góry stosu, tworząc 723
(co jest). Pierwsze wyjście polecenia wybiera format wyjściowy; w tym przypadku jest to format 7, „formatuj dane wyjściowe w taki sam sposób jak program”. Tak więc polecenia są pakowane w bajty. Następnie program kontynuuje:
231 7 23 23
(niejawnie) dołącz do programu kopię góry stosu
2 Duplikat góry stosu (obecnie 237 )
3 Wyjście góry stosu, pop drugi element stosu
7 Wciśnij pusty element na stos
W tym momencie na stosie nie ma nic oprócz pustych elementów stosu, więc program kończy pracę. Wyprowadzamy 23
wcześniej. Jeśli uciekniemy 237
(i musimy, ponieważ zawiera niereprezentatywne polecenia), otrzymamy 7231
. To pobiera dane wyjściowe bezpośrednio, tworząc ostateczne dane wyjściowe programu 237231
(sformatowane w taki sam sposób jak program, tj. Spakowane w bajty). To 4fa67f
. (Można zauważyć, że 1
było to całkowicie bezcelowe pod względem wpływu na wynik; jedynym powodem jest to, że oba programy różnią się.)
Bieganie 237231
przebiega prawie dokładnie w ten sam sposób; różnica polega na tym, że bezużyteczne 1
uruchamia się zaraz po pierwszym wydruku (a pusty element jest domyślnie usuwany przy drugim osiągnięciu bieżącego końca programu). Ponownie, w 231
końcu sam się wyprowadza, w 23
końcu sam się wyprowadza poprzedzony 7
, i otrzymujemy 231723
, oryginalny program.
Spostrzegawczy może zauważyć, że oba programy, mimo że mają tę samą długość w „natywnej” ósemce języka, mają różne długości na dysku. Jest tak, ponieważ program 7 można uzupełnić dowolną liczbą 1 bitów, a spakowany format odrzuca dopełnianie końcowe. Oto jak odbywa się kodowanie:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
Innymi słowy, dwa bajty 4C
F4
wystarczają do przedstawienia programu, więc to wszystko, czego użyłem.