Compte tenu de l'annonce attendue depuis longtemps, très longtemps de la sortie imminente de Rebol en tant que logiciel open source , je suis retourné dans mon dialecte pour résoudre ce problème de bingo . Je pourrai bientôt distribuer Rebmu comme son propre package GPL pour adolescents. :)
Rebmu 88 caractères
Dans la notation compacte:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Le dialecte utilise une astuce que j'appelle mushing qui est expliquée sur la page Rebmu . C'est "légitime" dans le sens où il ne trompe pas l'analyseur; c'est Rebol valide ... et peut en fait être librement mélangé avec du code ordinaire ainsi que (ahem) Rebmu "longue forme" ... qui BTW serait de 141 caractères:
[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!"]
(Étant donné que je prétends que la compression est une astuce que l'on peut faire sans l'aide de l'automatisation ou de la compilation, je développe en fait le code sous la forme bouillonnée. Ce n'est pas difficile.)
C'est en fait assez simple, rien de spécial - je suis sûr que d'autres programmeurs Rebol pourraient raser les choses. Une source commentée est sur GitHub , mais l'astuce principale que j'utilise est de construire toutes les solutions possibles dans une longue série ("list", "array", what-have-you). Je construis les solutions diagonales pendant la boucle d'entrée, car il faut cinq insertions en tête et cinq annexes en queue pour les faire ... et il y a déjà une boucle de cinq itérations en cours.
Le tout est facilement mappé au code Rebol, et je n'ai pas encore lancé de "bibliothèques matricielles" dans Rebmu avec une transposition ou d'autres gadgets qui semblent souvent arriver. Un jour, je le ferai, mais pour l'instant j'essaie juste de travailler relativement près du milieu de Rebol lui-même. Des choses d'apparence cryptique comme:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... sont assez simples:
[
; 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 '*
]
Remarque: parenthèses ajoutées ci-dessus pour plus de clarté. Mais les programmeurs Rebol (comme les anglophones) évitent généralement l'application de légendes structurelles supplémentaires pour indiquer la grammaire de la communication ... plutôt les enregistrer pour d'autres applications ...
Juste comme un bonus supplémentaire pour montrer à quel point c'est intéressant, je vais ajouter un mélange de code normal pour résumer le tableau. Les styles de programmation sont en fait ... compatibles:
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!"
C'est aussi valable Rebmu, et cela vous donnera une belle somme de plateau avant de jouer au Bingo avec vous. Dans l'exemple donné, il est dit Hey grandma, the board sum is 912
. C'est probablement vrai. Mais vous comprenez. :)
row
par un nom à un caractère. Non testé: essayez de lei in'*'*5]
remplacer[x=='*']
par[x==i]
.