Dado el anuncio muy, muy, muy retrasado del lanzamiento inminente de Rebol como software de código abierto , volví a mi dialecto favorito para resolver este problema de Bingo . Es posible que pronto pueda distribuir Rebmu como su propio paquete GPL para adolescentes. :)
Rebmu 88 caracteres
En la notación compacta:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
El dialecto usa un truco que llamo mushing, que se explica en la página Rebmu . Es "legítimo" en el sentido de que no engaña al analizador; este es Rebol válido ... y en realidad se puede mezclar libremente con código ordinario así como (ejem) Rebmu "de forma larga" ... que por cierto sería 141 caracteres:
[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!"]
(Dado que afirmo que la compresión es un truco que uno puede hacer sin la ayuda de la automatización o la compilación, en realidad desarrollo el código en forma desordenada. No es difícil).
En realidad es bastante simple, nada especial: estoy seguro de que otros programadores de Rebol podrían afeitarse. Alguna fuente comentada está en GitHub , pero el truco principal que uso es construir todas las soluciones posibles en una serie larga ("lista", "matriz", lo que tienes). Construyo las soluciones diagonales durante el ciclo de entrada, ya que se necesitan cinco inserciones en la cabeza y cinco se agregan en la cola para hacerlas ... y ya hay un ciclo de cinco iteraciones en progreso.
Todo esto se asigna fácilmente al código Rebol, y todavía no he lanzado ninguna "biblioteca de matriz" a Rebmu con transposición u otros trucos que parecen surgir a menudo. Algún día lo haré, pero por ahora solo estoy tratando de trabajar relativamente cerca del medio de Rebol. Cosas de aspecto críptico como:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... son bastante 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 '*
]
Nota: Paréntesis agregados arriba para mayor claridad. Pero los programadores de Rebol (como los angloparlantes) generalmente evitan la aplicación de llamadas estructurales adicionales para indicar la gramática en la comunicación ... en lugar de guardarlas para otras aplicaciones ...
Solo como una ventaja adicional para mostrar lo interesante que es en realidad, agregaré una combinación de código normal para sumar el tablero. Los estilos de programación son en realidad ... 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!"
Eso también es válido para Rebmu, y te dará una buena suma de tablero antes de jugar Bingo contigo. En el ejemplo dado, dice Hey grandma, the board sum is 912
. Lo cual probablemente sea correcto. Pero usted consigue el punto. :)
row
por un nombre de un personaje. No probado: intentei in'*'*5]
y reemplace[x=='*']
con[x==i]
.APL (82)
{
...}¨⍳5
: hacer 5 veces:⍎(K,K)[⍞⍳⍨K←11↑⎕D]
: lee una línea (⍞
) y asigna todos los caracteres que no son dígitos o espacio0
, luego evalúa la línea.B←↑
: conviértalo en una matriz (5x5 si la entrada fue correcta) y almacene en B.{
...}0=B
: el tablero inicial tiene un 1 en el espacio libre (0) y 0 en los otros espacios.(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵
: si se llena una línea, una columna o una diagonal:'BINGO!'
: luego salidaBINGO
∇⍵∨B=⍎1↓⎕←⍞
: de lo contrario, lea una línea (⍞
), repítala (⎕←
), suelte el primer carácter (1↓
), evalúelo para obtener un número (⍎
), vea dónde aparece en el tablero (B=
), márquelo (⍵∨
) e intente nuevamente (∇
) .fuente
K, 114
Dado el tablero
b
y las llamadasc
.
fuente