`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
Kolejna współpraca z @ MartinBüttner i po bardziej szalonej stronie spektrum Labiryntu - po raz pierwszy mamy wszystkie cztery ^>v<
w jednym programie. Wypróbuj online!
Wyjaśnienie
Ogólny algorytm działający w pętli wygląda następująco:
1. Read a char
2. If EOF:
3. Move all digits from auxiliary stack to main
4. Output all digits on main stack
5. Halt
Otherwise:
6. If char is a letter (c >= 64):
7. If random turns left:
8. Output char XOR 32
Otherwise:
9. Output char
Otherwise:
10. Shift char to auxiliary stack
11. If char is space (c-32 == 0):
12. Pull char back from auxiliary stack
13. Output underscore
Otherwise:
14. Continue loop
Aby zachować zwięzłe wyjaśnienie, oto z grubsza, w jaki sposób każda część programu odpowiada powyższemu pseudokodowi:
Oto interesujące części.
Zdobywanie losowości w Labiryncie
Jest tylko jeden sposób na uzyskanie losowości w Labiryncie, i wtedy, gdy IP próbuje iść naprzód, ale 1) nie ma ścieżki do przodu ani do tyłu i 2) są ścieżki dostępne po lewej i prawej stronie. W takim przypadku adres IP losowo wybiera między lewą a prawą trasą.
Jest to możliwe tylko przy użyciu ^>v<
operatorów, które n
przesuwają wiersz / kolumnę n
o 1. Na przykład program ( Wypróbuj online! )
" 1
""v!@
2
!@
wyprowadza losowo 1 lub 2, ponieważ v
przesuwa kolumnę z przesunięciem 0 (tj. kolumna, w której IP jest włączony) o 1, dając
"
""1!@
v
2!@
Adres IP jest skierowany w prawo i próbuje iść do przodu (górna część stosu wynosi zero), ale nie może. Nie może się również poruszać do tyłu, więc losowo wybiera między lewą a prawą.
Sztuczki golfowe
Program rozpoczyna się od pierwszego znaku w kolejności odczytu, który faktycznie jest krokiem 6. Jednak wyskakiwanie z pustego stosu Labiryntu daje 0, więc występują kroki 10 i 14, przesuwając zero na stos pomocniczy, który jest efektywny brak op.
Główny stos jest praktycznie pusty po każdej iteracji, co pozwala nam sprawdzać układ kodu za pomocą >
i <
na ukrytych zerach na dole. >
Owija się wokół dolny wiersz tak, że porusza IP z prawym dolnym rogu do dolnego lewego, i <
przesunięcia powrót wiersz. IP następnie szczęśliwie przesuwa się w górę lewej kolumny, aby kontynuować pętlę.
Cyfry w labiryncie pop n
i push 10*n + <digit>
. Ponadto znaki są pobierane modulo 256 przed wysłaniem. Połączenie tych dwóch razem daje nam wynik 95 (podkreślenie), wykonując `33
do 32 (spacja), co działa, ponieważ -3233 % 256 = 95
. Mimo że istnieją inne sposoby przekształcenia 32 w 95 ( ;95
najłatwiejsze), praca z liczbą ujemną pozwala nam nieco skompresować kod za pomocą skrętów w lewo.