_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
Sıfıra bölme hatasıyla sona erer (STDERR'de hata mesajı).
Çevrimiçi deneyin!
Düzen gerçekten verimsiz hissediyor, ancak şu anda golf oynamak için bir yol göremiyorum.
açıklama
Bu çözüm Dennis'in aritmetik numarasına dayanıyor: tüm karakter kodlarını al 8
, her iki uçtan bir çift ekle ve bölüştürdüğünden emin ol5
.
Labirent astar:
- Labirent rasgele hassas tamsayılar iki yığın sahiptir, ana ve yardımcı başlangıçta (örtük) sonsuz miktarda sıfır ile dolu (iliary) .
- Kaynak kod, bir labirenti andırır, burada talimat göstergesinin (IP) olabildiğince koridorları izlediği (hatta köşelerinde). Kod, okuma sırasındaki ilk geçerli karakterde başlar, yani bu durumda sol üst köşede. IP herhangi bir birleşme şekline geldiğinde (yani, geldiğine ek olarak birkaç bitişik hücre), ana yığının tepesine dayalı bir yön seçecektir. Temel kurallar şunlardır: negatifken sola dönün, sıfırda ilerlemeye devam edin, pozitifken sağa dönün. Ve bunlardan biri mümkün olmadığında, çünkü bir duvar var, o zaman IP ters yön alır. IP ayrıca ölü uçlara çarptığında da döner.
- Rakamlar ana yığının üst kısmı 10 ile çarpılarak ve sonra rakam eklenerek işlenir.
Kod, tüm giriş modülo 8'i okuyan küçük bir 2x2, saat yönünde döngü ile başlar:
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
Şimdi ;
atar -1
. Ana yığının üstünü (yani son karakter) aşağıya doğru hareket ettiren başka bir saat yönünde döngü giriyoruz:
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
Şimdi kısa bir doğrusal bit var:
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
IP şimdi bölünebilirliği 5 ile test etmek için bir dal gibi davranan bir kavşakta. Modülün sonucu sıfır değilse, girişin bir Watson-Crick palindrom olmadığını biliyoruz ve doğuya dönüyoruz:
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
Aksi takdirde, girişin geri kalanını kontrol etmeye devam etmemiz gerekir, böylece IP güneye devam eder. {
Geri kalan giriş alt kısmına çeker. Eğer girdiyi tükettikten sonra, bu bir 0
( aux'in altından ) olacak ve IP güneye doğru ilerlemeye devam edecektir:
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
Aksi takdirde, kontrol edilecek dizgede daha fazla karakter vardır. IP batıya döner ve büyük ölçüde no-ops içeren bir sonraki (saat yönünde) 2x2 döngüye geçer:
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
Bu döngüden sonra, ilk ve son karakter dışında ve üstte sıfır olmak üzere, ana yığında girişi tekrar elde ettik. ;
Atar 0
ve sonra =
yığınlarının tepelerini takaslar, ama bu sadece ilk iptal etmektir =
şimdi farklı bir konumda döngü giriyorsanız, çünkü döngü içinde. Durulayın ve tekrarlayın.