}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous to 8-bitowy język z wartościami reprezentowanymi tylko przez kulki w maszynie podobnej do Rube Goldberg, więc nie było to bardzo łatwe. To podejście jest w przybliżeniu równoważne z następującym pseudokodem:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
ponieważ maksymalna wartość to 256 (reprezentowana przez 0 w programie Marbleous, który jest obsługiwany w różnych miejscach w różny sposób) funkcja rekurencyjna (1) zostanie nazwana w sumie 256!*512^256
równą około 10^1200
, wystarczająco łatwo, aby przeżyć wszechświat.
Marbelous nie ma bardzo szybkiego interpretera, wygląda na to, że może obsługiwać 10^11
wywołania tej funkcji rocznie, co oznacza, że patrzymy na środowisko wykonawcze 10^1189
lat.
Dalsze objaśnienie tablicy Marbelous
00@0
--/\=0
\\@0&0
00
jest dosłownym językiem (lub marmurem), reprezentowanym w systemie szesnastkowym (więc 0). Ten marmur spada na --
, który zmniejsza każdy marmur o 1 (00 owija się i zamienia w FF lub 255 w systemie dziesiętnym). Marmur o wartości FF spada teraz na ten, \\
który przesuwa go o jedną kolumnę w prawo, na niższy @0
. To jest portal i teleportuje marmur do drugiego @0
urządzenia. Tam marmur ląduje na /\
urządzeniu, które jest powielaczem, umieszcza jedną kopię marmuru po --
lewej stronie (ten marmur będzie się ciągle pętli między portalami i ulegał zmniejszeniu w każdej pętli), a drugi po =0
prawej stronie.=0
porównuje marmur do wartości zero i pozwala, aby marmur spadł, jeśli jest równy, i popchnie go w prawo, jeśli nie. Jeśli marmur ma wartość 0, wyląduje na &0
synchonizerze, który wyjaśnię później.
Podsumowując, zaczyna się to od marmuru o wartości 0 w pętli i zmniejsza go, aż osiągnie ponownie 0, następnie umieszcza ten marmur o wartości 0 w synchronizatorze i kontynuuje zapętlanie w tym samym czasie.
}0@1
&0/\>0!!
--
@1
}0
jest urządzeniem wejściowym, początkowo n-te (podstawa 0) wejście wiersza poleceń podczas wywoływania programu jest umieszczane w każdym }n
urządzeniu. Więc jeśli wywołasz ten program z wejściem wiersza poleceń 2, marmur o wartości 02 zastąpi to }0
. Ten marmur następnie wpada do &0
urządzenia, inny synchronizator, &n
synchronizatory trzymają kulki, aż wszystkie inne odpowiednie również &n
zostaną złożone. Marmur jest następnie zmniejszany, teleportowany i duplikowany podobnie jak w poprzednio wyjaśnionej pętli. Odpowiednia kopia jest następnie sprawdzana pod kątem nierówności z wartością zero ( >0
), jeśli nie jest równa 0, to przechodzi. Jeśli wynosi 0, zostaje popchnięty w prawo i ląduje !!
, co kończy planszę.
Okay, do tej pory mamy pętlę, która odlicza w sposób ciągły od 255 do 0 i pozwala kolejnej, podobnej pętli (zasilanej przez dane z wiersza poleceń) uruchomić raz za każdym razem, gdy osiągnie 0. Kiedy ta druga pętla uruchomi się n razy (maksymalnie 256 ) program kończy się. To jest maksymalnie 65536 przebiegów pętli. Niewystarczająco, by przeżyć wszechświat.
}0
--@2
@2/\=0MB
Powinno to zacząć wyglądać znajomo, dane wejściowe są zmniejszane raz, a następnie ta wartość zapętla się i jest kopiowana (zauważ, że marmur zmniejsza się tylko raz, a nie przy każdym uruchomieniu pętli). Następnie jest sprawdzany pod kątem równości do 0 i jeśli nie jest to zero, ląduje dalej MB
. Jest to funkcja w Marbelous, każdy plik może zawierać kilka tablic, a każda tablica jest funkcją, każda funkcja musi zostać nazwana przez poprzedzenie siatki :[name]
. Każda funkcja z wyjątkiem pierwszej funkcji w pliku, która ma standardową nazwę: MB. Więc ta pętla ciągle wywołuje ponownie płytę główną z wartością, n - 1
gdzie n jest wartością, z którą wywołano to wystąpienie funkcji.
Więc dlaczego n*512
?
Cóż, pierwsza pętla działa z 4 tyknięciami (i 256 razy), a druga pętla biegnie n razy przed zakończeniem płytki. Oznacza to, że tablica działa na około n*4*256
tyknięcia. Ostatnia pętla (która wywołuje funkcję rekurencyjną) jest złożona i działa z 2 tikami, co oznacza, że udaje się wywołać n*4*256/2 = n*512
czasy funkcji .
O jakich symbolach nie wspomniałeś?
\/
to kosz na śmieci, który usuwa kulki z planszy, dzięki czemu rozrzucone kulki nie kolidują z innymi kulkami, które zapętlają rundę i uniemożliwiają zakończenie programu.
Premia
Ponieważ kulki, które spadają z dolnej części cudownej płyty, są wysyłane do STDOUT, ten program wypisuje mnóstwo znaków ASCII podczas działania.