Rebol'un açık kaynaklı yazılım olarak yakında çıkacak olan uzun, uzun, gecikmiş duyurusu göz önüne alındığında, bu Bingo sorununu çözmek için evcil hayvan lehçeme geri döndüm . Yakında Rebmu'yu kendi gençlik GPL paketi olarak dağıtabilirim. :)
Rebmu 88 karakter
Kompakt gösterimde:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Ağız , Rebmu sayfasında açıklanan, mantar dediğim bir numara kullanır . Ayrıştırıcıyı aldatmaması anlamında "yasal"; bu geçerli Rebol ... ve aslında sıradan kod ile serbestçe karıştırılabilir yanı sıra (ahem) "uzun biçimli" Rebmu ... BTW 141 karakter olurdu:
[rt z 5 [g: is g pc r a z is g a ap g pc a sb 6 z ap v '*] l 5 [a: g l 5 [ap g f a sk+ a 5]] hd+ g u [ra g in- nt r m '* fis g v 5] p "BINGO!"]
(Sıkıştırma, otomasyon veya derleme yardımı olmadan yapabileceğiniz bir hile olduğunu iddia ettiğim için, aslında kodu mantar formunda geliştiriyorum. Zor değil.)
Aslında oldukça basit, özel bir şey yok - eminim diğer Rebol programcıları şeyleri tıraş edebilir. Yorumlanan bazı kaynaklar GitHub'da , ancak kullandığım ana hile uzun bir dizi ("liste", "dizi", ne var) tüm olası çözümleri oluşturmaktır. Giriş döngüsü sırasında diyagonal çözümleri oluşturuyorum, çünkü kafada beş ekleme ve onları yapmak için kuyruğa beş ekleme ... ve zaten devam eden beş iterasyon döngüsü var.
Her şey Rebol koduyla kolayca eşleşiyor ve henüz transpozisyon veya sık sık ortaya çıkan diğer hile ile herhangi bir "matris kütüphanesi" Rebmu'ya atmadım. Bir gün bunu yapacağım ama şimdilik sadece Rebol'un ortamına nispeten yakın çalışmaya çalışıyorum. Cryptic görünümlü şeyler gibi:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... oldukça basit:
[
; assign the series pointer "g" to the result of inserting
; the z'th element picked out of reading in some series
; from input that was stored in "a"...this pokes an element
; for the forward diagonal near the front of g
g: insert g (pick (readin-mu a) z)
; insert the read-in series "a" from above into "g" as well,
; but *after* the forward diagonal elements we've added...
insert g a
; for the reverse diagonal, subtract z from 6 and pick that
; (one-based) element out of the input that was stored in "a"
; so an element for the reverse diagonal is at the tail
append g (pick a (subtract 6 z))
; so long as we are counting to 5 anyway, go ahead and add an
; asterisk to a series we will use called "v" to search for
; a fulfilled solution later
append v '*
]
Not: Netlik için yukarıda parantez eklenmiştir. Ancak Rebol programcıları (İngilizce konuşanlar gibi) genellikle iletişimdeki dilbilgisini göstermek için ekstra yapısal ek bilgilerden kaçınırlar ... onları diğer uygulamalar için saklarlar ...
Bunun gerçekten ne kadar ilginç olduğunu göstermek için bir avantaj olarak, tahtayı toplamak için normal kodun bir karışımını atacağım. Programlama stilleri aslında ... uyumludur:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]
temp-series: g
sum: 0
loop 5 * 5 [
square: first temp-series
if integer! == type? square [
sum: sum + square
]
temp-series: next temp-series
]
print ["Hey grandma, the board sum is" sum]
l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Bu da geçerli Rebmu ve sizinle Bingo oynamadan önce size güzel bir tahta toplamı verecek. Verilen örnekte diyor Hey grandma, the board sum is 912. Bu muhtemelen doğru. Ama anlıyorsunuz. :)
rowkarakterlik bir adla değiştirebilirsiniz. Test edilmemiş: deneyini in'*'*5]ve değiştirme[x=='*']ile[x==i].