`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
@ MartinBüttner ve Labirent spektrumunun daha çılgınca yüzlerinde başka bir kolaj - ilk defa dört ^>v<
programın hepsinde bir tane var . Çevrimiçi deneyin!
açıklama
Bir döngüde çalışan genel algoritma aşağıdaki gibidir:
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
Açıklamayı küçük tutmak için, kabaca programın her bir bölümünün yukarıdaki sözde koduna nasıl karşılık geldiği:
İşte ilginç kısımlar.
Labirentte rastgele olma
Labirent'te rastlantısallık elde etmenin tek bir yolu var ve bu IP'nin ileriye doğru gitmeye çalıştığı zaman ama 1) ne ileriye ne de geriye doğru bir yol var ve 2) sola ve sağa uygun yollar var. Bu durumda IP, rastgele sol ve sağ yollar arasında seçim yapar.
Bu yalnızca satır / sütunu 1 ile ^>v<
açan n
ve kaydıran operatörleri kullanarak mümkündür. n
Örneğin, program ( Çevrimiçi deneyin! )
" 1
""v!@
2
!@
1 veya 2 çıktısını rasgele çıkarır, çünkü v
sütunu ofset 0 ile değiştirir (yani IP'nin açık olduğu sütun), 1
"
""1!@
v
2!@
IP sağa dönük ve ileriye doğru gitmeye çalışır (yığının üstü sıfırdır) ancak yapamaz. Ayrıca geriye doğru hareket edemez, bu yüzden rastgele sola veya sağa seçer.
Golf hileci
Program, ilk sıradan başlar ve aslında 6. adım olduğunu fark edersiniz. Ancak, boş bir Labirent yığınından atlamak, 0 verir; bu nedenle, adım 10 ve 14 gerçekleşir ve sıfır olan yardımcı yığına geçer. hayır op.
Her bir yinelemeden sonra ana yığın etkili bir şekilde boştur, bu da kod düzenini en alttaki gizli sıfırları kullanarak >
ve kullanarak <
kodlamamızı sağlar. >
Etrafında çok alt sola sağ alt IP hareket eder ve bu alt satır sarar <
kaymalar satır geri. IP daha sonra döngüye devam etmek için soldaki sütunu mutlu bir şekilde taşır.
Labirent'teki rakamlar açılır n
ve basılır 10*n + <digit>
. Ayrıca, çıkışlardan önce chars modulo 256 alınır. Bu ikisini bir araya getirmek, bize `33
, çünkü çalışan 32'ye (boşluk) kadar 95 (alt çizgi) çıktı vermemizi sağlar -3233 % 256 = 95
. 32'yi 95'e çevirmenin ( ;95
en kolay olan) başka yolları olsa da, burada negatif bir sayıyla çalışmak, kodu biraz sola döndürerek sıkıştırmamızı sağlar.