Biorąc pod uwagę długą, długą i długo spóźnioną informację o zbliżającej się premierze Rebola jako oprogramowania typu open source , wróciłem do mojego zwierzaka, aby rozwiązać ten problem Bingo . Być może wkrótce będę mógł dystrybuować Rebmu jako swój własny pakiet dla nastolatków GPL. :)
W zwartej notacji:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Dialekt używa sztuczki, którą nazywam mushingiem, która jest wyjaśniona na stronie Rebmu . Jest „legalny” w tym sensie, że nie oszukuje parsera; jest to poprawne Rebol ... i może faktycznie być dowolnie mieszane ze zwykłym kodem, a także (ahem) „długim” Rebmu ... który BTW będzie 141 znaków:
[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!"]
(Biorąc pod uwagę, że twierdzę, że kompresja jest sztuczką, którą można zrobić bez pomocy automatyzacji lub kompilacji, faktycznie opracowuję kod w zamyślonej formie. Nie jest to trudne).
To w rzeczywistości dość proste, nic specjalnego - jestem pewien, że inni programiści Rebol mogliby się zgolić. Niektóre skomentowane źródło znajduje się na GitHub , ale główną sztuczką, której używam, jest zbudowanie wszystkich możliwych rozwiązań w długiej serii („lista”, „tablica”, co masz). Rozwiązania diagonalne buduję podczas pętli wejściowej, ponieważ potrzeba pięciu wstawek na głowie i pięciu dołączeń na ogonie, aby je wykonać ... i już trwa pętla pięciokrotna.
Całość z łatwością mapuje się na kod Rebol, a ja jeszcze nie wrzuciłem żadnych „bibliotek macierzy” do Rebmu z transpozycją lub innymi sztuczkami, które wydają się często pojawiać. Pewnego dnia to zrobię, ale na razie staram się pracować stosunkowo blisko samego Rebola. Zagadkowe rzeczy, takie jak:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... są raczej proste:
[
; 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 '*
]
Uwaga: Nawiasy dodane powyżej dla przejrzystości. Ale programiści Rebol (podobnie jak anglojęzyczni) generalnie unikają stosowania dodatkowych objaśnień strukturalnych w celu wskazania gramatyki w komunikacji ... raczej zachowują je dla innych aplikacji ...
Jako dodatkowy bonus pokazujący, jak interesujące jest to, dodam mieszankę normalnego kodu, aby podsumować planszę. Style programowania są w rzeczywistości ... kompatybilne:
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!"
To również jest ważne Rebmu i da ci niezłą sumę planszy przed graniem w Bingo z tobą. W podanym przykładzie jest napisane Hey grandma, the board sum is 912. Co prawdopodobnie jest słuszne. Ale rozumiesz. :)
rowje jednoznakowym imieniem. Niesprawdzone: spróbowaći in'*'*5]i zamienić[x=='*']z[x==i].