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. :)
row
je jednoznakowym imieniem. Niesprawdzone: spróbowaći in'*'*5]
i zamienić[x=='*']
z[x==i]
.APL (82)
{
...}¨⍳5
: wykonaj 5 razy:⍎(K,K)[⍞⍳⍨K←11↑⎕D]
: przeczytaj wiersz (⍞
) i zamapuj wszystkie znaki, które nie są cyframi ani spacjami0
, a następnie oceń linię.B←↑
: zamień go w macierz (5x5, jeśli dane wejściowe były prawidłowe) i zapisz w B.{
...}0=B
: tablica startowa ma 1 w wolnym polu (0) i 0 w pozostałych polach.(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵
: jeśli linia, kolumna lub przekątna są wypełnione:'BINGO!'
: następnie wyjścieBINGO
∇⍵∨B=⍎1↓⎕←⍞
: w przeciwnym razie przeczytaj wiersz (⍞
), wypowiedz go (⎕←
), upuść pierwszy znak (1↓
), oceń go, aby uzyskać liczbę (⍎
), zobacz, gdzie występuje na tablicy (B=
), zaznacz go (⍵∨
) i spróbuj ponownie (∇
) .źródło
K, 114
Biorąc pod uwagę zarząd
b
i połączeniac
.
źródło