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 xxdzrzut 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. 7któ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 ( 2i 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 23wcześ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 1było to całkowicie bezcelowe pod względem wpływu na wynik; jedynym powodem jest to, że oba programy różnią się.)
Bieganie 237231przebiega prawie dokładnie w ten sam sposób; różnica polega na tym, że bezużyteczne 1uruchamia się zaraz po pierwszym wydruku (a pusty element jest domyślnie usuwany przy drugim osiągnięciu bieżącego końca programu). Ponownie, w 231końcu sam się wyprowadza, w 23koń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 F4wystarczają do przedstawienia programu, więc to wszystko, czego użyłem.