ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Wypróbuj online!
To sprawiło, że było to piekielne święto.
Jak to działa:
Program jest zbiorem instrukcji put, które składają wokół siebie Program B, który następnie drukuje dwukrotnie bajt źródłowy przesunięty dwukrotnie.
Program składa się w rzeczywistości z 2 kopii programu o długości 1300 bajtów, dzięki czemu cały program o długości 1300 bajtów jest uruchamiany jako całość.
Lepsze wyjaśnienie:
Każdy befunge-98 Quine musi zawierać symbole taki @
lub q
a ,
Problem : Żaden z tych symboli są dobrym punktem wyjścia Especialy od @
i q
zakończyć program natychmiast.
Rozwiązanie : Pozbądź się tych znaków w kodzie źródłowym
Problem : jak?
Rozwiązanie : Użyj p
poleceń (wstaw), aby zmodyfikować kod źródłowy, tak aby zawierał wymagane znaki, które wydrukują zawartość kodu źródłowego przesuniętego o jeden bajt i nie używaj g
polecenia oszukiwającego.
Problem : (wzdycha, kiedy się to skończy)
Polecenie put wyskakuje z 3 wartości, n x y
które określają znak, współrzędną x, współrzędną y, jednak gdy inicjalizacja tych wartości jest podzielona na pół, może zapisać złe znaki na początku kodu źródłowego, co czyni go bezużytecznym do quiningu.
Rozwiązanie : (ostatni obiecuję)
Użyj 2 kopii kodu źródłowego, przy czym ten ostatni jest „poprawny”, to przypadkowo rozwiązuje inny problem, którym jest to, że instrukcja put (polecenie p + stałe inicjalizatory), która jest podzielona na pół nie można wykonać, jest to naprawione przez posiadanie 2 kopii każdej instrukcji. Ostatnią rzeczą, którą musi to działać, jest to, jak zrobić cały kod źródłowy z połowy?
Odpowiedź :
Jest to wizualny dowód na to, dlaczego dwie kopie ciągu bajtowego przesunięto == Dwie kopie ciągu bajtowego przesunięto. Oznacza to, że możemy wziąć połowę kodu, przesunąć bajt, a następnie wydrukować dwa razy (LUB wziąć połowę kodu, przesunąć bajt, wydrukować, powtórzyć [Tak się właściwie dzieje])
Jak to jest realizowane : Załóżmy, że źródłem jest 0123456789abcdef
Pseudokod Befunge:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS oznacza Print Stack (nie jest to prawdziwa instrukcja). Pchamy połowę kodu źródłowego w odwrotnej kolejności na stosie, ""
następnie drukujemy stos, a następnie pobieramy ( '
polecenie) pierwszy znak, 0
który poruszamy przed'
i drukujemy go na końcu, co powoduje przesunięcie bajtu, a następnie powtarzamy cykl jeszcze raz, aby wydrukować drugą kopię. Jedną z technik, którymi należy się zająć, są symbole wewnątrz źródła, może to powodować problemy, jeśli napiszemy go podczas wykonywania kodu źródłowego, obejdę to, dodając więcej instrukcji put, które zajmują się nim zewnętrznie.
To sprawia, że kod wygląda mniej więcej tak:
Objaśnienie :
Zielona podświetlenie: Kod, który zajmuje się dodawaniem znaków do źródła
Szare litery (przeprasza za słabą widoczność): Kod, który dodaje zielony kod
Czerwony Podświetlenie: Kod, który przenosi pierwszy znak drugiej połowy kodu źródłowego do obszaru Niebieskiego .
Niebieskie wyróżnienie: Zobacz Czerwone wyróżnienie
Pomarańczowe wyróżnienie: Kod, który gwarantuje, że zakończymy pracę po napisaniu 2-bajtowych przesuniętych kopii poprzez umieszczenie @
polecenia (zakończ) w Żółtym obszarze.
Mamy nadzieję, że strzałki powinny wyjaśnić, jak przebiega przepływ kodu.
Oto ostatnia trudna część:
skąd pochodzi kod źródłowy niemowląt ?
Krótka odpowiedź: C # Magic
Długa odpowiedź: ponad 100 fragmentów kodu Befunge wykonanych ręcznie, skompilowanych przez kod C #. Ręcznie napisałem około 100 stałych inicjatorów (fragment kodu befunge, który wypycha pewną liczbę do stosu) ręcznie, a następnie użyłem niestandardowego programu C # do skompilowania go do 1300 bajtowego wyjścia Befunge, które następnie skopiowałem i wkleiłem dwa razy program.
Nadal tu jesteś? Świetnie dziękuję za przeczytanie! (lub przynajmniej przewijanie do końca)
Mam nadzieję, że moje złe dowcipy były zabawne i nie denerwujące.
Uwaga: Żadna instrukcja put w tym kodzie nie tworzy komendy ag, która oszukuje.
EDYCJA: Sprawdziłem kod za pomocą następującego kodu JavaScript w TIO przy użyciu narzędzi programistycznych
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);