@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Działa tylko dla wartości poniżej 256, ponieważ Marbelous jest językiem 8-bitowym.
Jak to działa
Marbelous to język 2D z wartościami reprezentowanymi przez 8-bitowe kulki, które spadają po jednej komórce na każdym tiku, chyba że jakieś urządzenie zapobiega ich upadkowi. Ten program Marbelous składa się z 3 plansz; zacznijmy od najłatwiejszego:
:O
}0
+Z
+C
{0
:Oto nazwa tablicy (a dokładniej, O to nazwa i: mówi interpretowanemu, że ta linia jest nazwą. Nadając tablicom nazwę, inne tablice mogą na nich wywoływać,
}0jest urządzeniem wejściowym, można to postrzegać jako argument tej funkcji. Ta komórka zostanie zastąpiona przez marmur wejściowy (wartość), gdy funkcja zostanie wywołana.
+Zdodaje 35 do każdego marmuru, który przechodzi nad nim i pozwala mu spaść. +Crobi to samo, ale tylko dodaje 12. {0jest komórką wyjściową , gdy marmur dotrze do tej komórki, funkcja wyjdzie i zwróci wartość w tym urządzeniu wyjściowym.
Tak więc razem ta tablica przyjmuje jedną wartość, a następnie dodaje do niej 47. Dla nas oznacza to, że zamienia każdą pojedynczą cyfrę w kod ascii cyfry -1 (będzie to oczywiście działało również dla 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Ta tablica wygląda na nieco bardziej skomplikowaną. Powinieneś być w stanie zidentyfikować się :Ijako nazwa płyty i zauważyłeś niektóre urządzenia wejściowe i wyjściowe. Zauważysz, że mamy dwa różne urządzenia wejściowe }0i }1. Oznacza to, że ta funkcja przyjmuje 2 wejścia. Zauważysz również, że istnieją dwa wystąpienia }1urządzenia. Po wywołaniu funkcji obie te komórki będą zawierały tę samą wartość. Urządzenie }0wejściowe znajduje się bezpośrednio nad \/urządzeniem, działa jak kosz na śmieci i natychmiast usuwa marmur, który na niego spadnie.
Rzućmy okiem na to, co dzieje się z jedną z kul umieszczonych na płycie przez }1urządzenia wejściowe:
}1
=9 &1
&0
{>
Upadnie przy pierwszym tiku i uderzy w =9urządzenie. Porównuje to wartość marmuru do 9 i pozwala, aby marmur wypadł, jeśli oświadczenie=9 oceni to. Marmur zostaje przesunięty w prawo, jeśli nie. &0i &1są synchronizatorami. Trzymają kulki, które na nie spadają, dopóki wszystkie inne &nsynchronizatory również nie zostaną wypełnione. Jak można się spodziewać, warunkowo spowoduje to inne zachowanie w innej części planszy.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Jeśli powiem ci, że ++to inkrementor, powinieneś już być w stanie powiedzieć, czym zostaną wypełnione różne synchronizatory. Lewa strona &1będzie zawierała wartość wejściową }1+ 1, a &0obok niej będzie 0 (00 literał językowy, reprezentowany w systemie szesnastkowym). Drugi &1będzie zawierał wartość 1, a prawy &0zostanie wypełniony F7znakiem, który odejmuje 9 od wartości, ponieważ dodawanie w Marbelous jest modulo 256.
// jest urządzeniem odchylającym, które popycha każdy marmur w lewo zamiast upuszczać.
Połączenie tego wszystkiego daje ci to: jeśli marmur }1ma 9, &0synchronizatory się zapełniają. Spowoduje to, że wartość 0 spadnie na {0wyjście i F7(lub -9) na {1wyjście. Jeśli }1nie jest 9, {0zostanie wypełnione }1+ 1 i {0będzie zawierało 1. Istnieje również {>urządzenie, jest to specjalne wyjście, które wyrzuca marmur obok płyty zamiast pod nią. Zostanie to wypełnione}1 jeśli będzie równe 9.
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Dobra, teraz duża. Ta tablica nie ma wyraźnej nazwy, ponieważ jest główną płytą pliku. Jego domyślna nazwa to Mb. Powinieneś być w stanie rozpoznać niektóre komórki. Istnieje urządzenie wejściowe, niektóre literały językowe ( 00iFF ). Istnieje kilka synchronizatorów i deflektor. przejdźmy krok po kroku przez ten kawałek.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Tak więc wartość wejściowa (wejście wiersza poleceń, ponieważ jest to płyta główna) zaczyna się od drugiej komórki od góry, gdzie }0się znajduje. Opadnie i dosięgnie >0urządzenia, które jest kolejnym urządzeniem porównawczym. każdy marmur większy niż 0 wpada, każdy inny marmur zostaje popchnięty w prawo. (ponieważ zmienne Marbelous są niepodpisane, tylko dokładnie 0 zostanie przesunięte w prawo). Ten marmur o zerowej wartości trafi następnie@6 urządzenie. To jest portal, który przenosi marmur do innego odpowiedniego portalu, w tym przypadku tuż nad nim. Marmur 0 dotrze wtedy do &0synchronizatora i wyzwoli niektóre rzeczy w innym miejscu.
Jeśli marmur nie jest równy 0, upada, zostaje odbity w prawo przez \\uderzenia, --które zmniejsza go o jeden, a następnie spada na/\ klonera. To urządzenie bierze marmur i wysyła jedną jego kopię w prawo, a drugą w lewo. Lewy zostanie przeniesiony w górę do drugiego, @0gdzie marmur ponownie przejdzie tę samą sekwencję. Lewy zostanie zabrany gdzie indziej. To daje nam pętlę, która zmniejsza wartość wiersza poleceń raz na pętlę i wyzwala pewne zachowanie w każdej pętli, aż osiągnie 0. Następnie wyzwala inne zachowanie.
Zobaczmy, co dzieje się z marmurem wciskanym w @4każdą pętlę.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Są tutaj 3 literały językowe ( FF), które natychmiast popadną w portale. Portale te zabiorą je do trzech IIurządzeń. IIodnosi się do tablicy, :Iktórą zdefiniowaliśmy w dalszej części pliku. Ponieważ :Ima 2 różne urządzenia wejściowe, jego reprezentacja na innej płycie musi mieć szerokość 2 komórek. Ponieważ mamy 6 komórek zawierającychII , kamera informuje, że mamy 3 instancje tej funkcji na płycie.
FF(Lub 256 lub -1 jeśli będzie) marmury zasiądzie w komórkach wejściowych :Ifunkcji czekając aż istnieją wystarczająco marmurowe wejście STO uruchomić funkcję (jeden bardziej, że jest). Tam właśnie @4wchodzi portal. Kopia zmniejszonego wejścia wiersza poleceń przepływa tam przez każdą pętlę. Spowoduje to uruchomienie lewej :Iplanszy. Początkowo z wartościami 256 (lub -1) i bez względu na wejście wiersza poleceń było -1. Lewy marmur zostanie umieszczony w }0urządzeniach :Iplanszy, a prawy do }1. Jeśli przypomnisz sobie, co zrobiła ta tablica, będziesz w stanie powiedzieć, jaki to ma wynik. Wyprowadzi zwiększoną wersję prawego wejścia na lewym wyjściu (i zamienia 9 w 0, a nie 10) i wyprowadza albo 1 albo -9 po prawej.
Zwiększona wartość zostanie przeniesiona z powrotem do właściwej komórki wejściowej przez portal, a wartość po prawej stronie spadnie do synchronizatora. Jeśli synchronizator już trzyma marmur, dwie kulki zderzą się. Kolumny zderzające są dodawane razem modulo 256. Tak więc wartości w synchronizatorach wykonają następujące czynności: Zaczynają puste, a następnie zmieniają się na 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, a następnie na 1 ponownie (od 247 dodaje się modulo 256).
Możesz również pamiętać, że marmur zostaje wyprowadzony w prawo, gdy wartość wejściowa zapętla się z powrotem do 0. Ponieważ :Iplansze znajdują się obok siebie, thsi raz aktywuje tablicę po prawej stronie. Spowoduje to wypełnienie trzech synchronizatorów wartościami, które są o jeden wyższe niż powinny być, aby były krótką reprezentacją wejścia wiersza poleceń, do czasu zapętlenia do 0.
Możesz także pamiętać, że :Ofunkcja przekształca wartość w wartość ascii cyfry reprezentującej wartość -1. Wyjście tych OOkomórek spadnie następnie z płyty, co drukuje odpowiadające im znaki ascii do STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Więc co się stanie, gdy marmur wiersza poleceń osiągnie 0 i wypełni te &0synchronizatory? Cóż, kilka kul o wartości 0 spada i wyzwala trzy synchronizatory, które trzymają cyfry (+ 1) numeru shortlex na dole planszy. &3jest uruchamiany jako pierwszy, ponieważ zawiera najbardziej znaczącą cyfrę, a następnie &2następuje &1. Ten marmur zostaje następnie teleportowany do drugiego @5urządzenia, zanim ostatecznie trafi do !!komórki, która kończy planszę.
19, 20, 21, 22w mapach dziesiętnych do08, 09, 10, 11krótkich. Dlatego użyłem tego mylić100 -> 89!