Dato il lungo, molto, tanto atteso annuncio dell'imminente rilascio di Rebol come software open source , sono tornato al mio dialetto per risolvere questo problema del Bingo . Potrei presto essere in grado di distribuire Rebmu come suo pacchetto GPL per adolescenti. :)
Rebmu 88 caratteri
Nella notazione compatta:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Il dialetto usa un trucco che io chiamo mushing che è spiegato nella pagina Rebmu . È "legittimo", nel senso che non imbroglia il parser; questo è Rebol valido ... e può effettivamente essere mescolato liberamente con il codice ordinario così come (ahem) Rebmu "long-form" ... che BTW sarebbe di 141 caratteri:
[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!"]
(Dato che sostengo che la compressione è un trucco che si può fare senza l'aiuto dell'automazione o della compilazione, in realtà sviluppo il codice in forma confusa. Non è difficile.)
In realtà è abbastanza semplice, niente di speciale: sono sicuro che altri programmatori Rebol potrebbero radere le cose. Alcuni fonti commentate sono su GitHub , ma il trucco principale che uso è costruire tutte le possibili soluzioni in una lunga serie ("list", "array", what-have-you). Costruisco le soluzioni diagonali durante il ciclo di input, poiché sono necessarie cinque inserzioni in testa e cinque in coda per realizzarle ... e c'è già un ciclo di cinque iterazioni in corso.
Il tutto si associa facilmente al codice di Rebol, e non ho ancora gettato nessuna "libreria di matrici" in Rebmu con trasposizione o altri espedienti che sembrano emergere spesso. Un giorno lo farò, ma per ora sto solo cercando di lavorare relativamente vicino al mezzo di Rebol stesso. Cose dall'aspetto criptico come:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... sono piuttosto semplici:
[
; 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 '*
]
Nota: le parentesi aggiunte sopra per chiarezza. Ma i programmatori Rebol (come chi parla inglese) generalmente evitano l'applicazione di callout strutturali extra per indicare la grammatica nella comunicazione ... piuttosto salvarli per altre applicazioni ...
Proprio come un ulteriore bonus per mostrare quanto questo sia davvero interessante, aggiungerò un po 'di codice normale per sommare il tabellone. Gli stili di programmazione sono in realtà ... compatibili:
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!"
È valido anche Rebmu e ti darà una bella somma di bordo prima di giocare a Bingo con te. Nell'esempio fornito, dice Hey grandma, the board sum is 912. Che probabilmente è giusto. Ma ottieni il punto. :)
rowcon un nome con un carattere. Non testato: prova ai in'*'*5]sostituirlo[x=='*']con[x==i].