Dado o anúncio, muito, muito atrasado, do lançamento iminente da Rebol como software de código aberto , voltei ao meu dialeto de estimação para resolver esse problema do Bingo . Em breve, poderei distribuir o Rebmu como seu próprio pacote GPL pequenino. :)
Rebmu 88 caracteres
Na notação compacta:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
O dialeto usa um truque que chamo de mushing, explicado na página Rebmu . É "legítimo" no sentido de que não engana o analisador; isso é Rebol válido ... e pode realmente ser livremente misturado com código comum, bem como (ahem) "forma longa" Rebmu ... que BTW teria 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 a compactação é um truque que se pode fazer sem a ajuda da automação ou compilação, na verdade desenvolvo o código na forma simplificada. Não é difícil.)
Na verdade, é bastante simples, nada de especial - tenho certeza de que outros programadores da Rebol poderiam raspar as coisas. Alguma fonte comentada está no GitHub , mas o principal truque que utilizo é criar todas as soluções possíveis em uma longa série ("lista", "matriz", o que você tem). Eu construo as soluções diagonais durante o loop de entrada, pois são necessárias cinco inserções na cabeça e cinco anexos na cauda para fazê-las ... e já existe um loop de cinco iterações em andamento.
A coisa toda é facilmente mapeada para o código Rebol, e ainda não joguei nenhuma "biblioteca de matriz" no Rebmu com transposição ou outros truques que parecem surgir com frequência. Um dia farei isso, mas por enquanto estou apenas tentando trabalhar relativamente próximo ao meio da própria Rebol. Aparências enigmáticas como:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... são 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ênteses adicionados acima para maior clareza. Mas os programadores da Rebol (como falantes de inglês) geralmente evitam a aplicação de textos explicativos extras para indicar a gramática na comunicação ... em vez disso, os salva para outras aplicações ...
Apenas como um bônus a mais para mostrar o quão interessante isso realmente é, eu jogarei uma mistura de código normal para somar o quadro. Os estilos de programação são realmente ... compatíveis:
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!"
Também é válido o Rebmu, e ele lhe dará uma boa soma no tabuleiro antes de jogar o Bingo com você. No exemplo dado, ele diz Hey grandma, the board sum is 912
. O que provavelmente está certo. Mas você entendeu. :)
row
por um nome de um caractere. Não testado: tentei in'*'*5]
substituir[x=='*']
por[x==i]
.APL (82)
{
...}¨⍳5
: faça 5 vezes:⍎(K,K)[⍞⍳⍨K←11↑⎕D]
: leia uma linha (⍞
) e mapeie todos os caracteres que não têm dígitos ou espaço0
, e avalie a linha.B←↑
: transformá-lo em uma matriz (5x5 se a entrada estiver correta) e armazene em B.{
...}0=B
: o quadro inicial possui 1 no espaço livre (0) e 0 nos outros espaços.(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵
: se uma linha, coluna ou diagonal estiver preenchida:'BINGO!'
: então saídaBINGO
∇⍵∨B=⍎1↓⎕←⍞
: caso contrário, leia uma linha (⍞
), faça eco (⎕←
), solte o primeiro caractere (1↓
), avalie-o para obter um número (⍎
), veja onde isso ocorre no quadro (B=
), marque-o (⍵∨
) e tente novamente (∇
) .fonte
K, 114
Dada a diretoria
b
e as ligaçõesc
.
fonte