`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
Un'altra collaborazione con @ MartinBüttner e sul lato più folle dello spettro Labyrinth - per la prima volta abbiamo tutti e quattro ^>v<
in un unico programma. Provalo online!
Spiegazione
L'algoritmo generale, che viene eseguito in un ciclo, è il seguente:
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
Per mantenere la spiegazione compatta, ecco approssimativamente come ogni parte del programma corrisponde allo pseudocodice sopra:
Ecco le parti interessanti.
Ottenere casualità in Labyrinth
C'è solo un modo per ottenere casualità in Labyrinth, ed è quando l'IP cerca di andare avanti ma 1) non c'è né un percorso in avanti né indietro e 2) ci sono percorsi disponibili a destra e a sinistra. In questo caso, l'IP sceglie casualmente tra le rotte sinistra e destra.
Questo è possibile solo usando gli ^>v<
operatori, che pop n
e spostano la riga / colonna n
di 1. Per esempio, il programma ( Provalo online! )
" 1
""v!@
2
!@
genera 1 o 2 in modo casuale, poiché v
sposta la colonna con offset 0 (ovvero la colonna su cui si trova l'IP) di 1, ottenendo
"
""1!@
v
2!@
L'IP è rivolto a destra e cerca di andare avanti (la parte superiore dello stack è zero) ma non ci riesce. Inoltre, non può spostarsi all'indietro, quindi sceglie casualmente tra sinistra o destra.
Trucchi da golf
Il programma inizia dal primo carattere in ordine di lettura, che noterai in realtà è il passaggio 6. Tuttavia, spuntare da uno stack Labyrinth vuoto produce 0, quindi si verificano i passaggi 10 e 14, spostando uno zero nello stack ausiliario, che è effettivamente un no-op.
Lo stack principale è effettivamente vuoto dopo ogni iterazione, il che ci consente di giocare a golf con il layout del codice usando >
e <
sugli zero impliciti in basso. Il >
avvolge la riga in basso intorno in modo che le mosse IP dal basso a destra in basso a sinistra, e gli <
spostamenti sul retro fila. L'IP si sposta quindi felicemente verso l'alto nella colonna di sinistra per continuare il ciclo.
Le cifre in Labyrinth pop n
e push 10*n + <digit>
. Inoltre, i caratteri sono presi modulo 256 prima di essere emessi. Mettere insieme questi due ci permette di produrre 95 (trattino basso) facendo `33
32 (spazio), che funziona perché -3233 % 256 = 95
. Anche se ci sono altri modi per trasformare 32 in 95 ( ;95
essendo il più semplice), lavorare con un numero negativo qui ci consente di compattare un po 'il codice con le svolte a sinistra.