Angesichts der langen, langen, überfälligen Ankündigung der bevorstehenden Veröffentlichung von Rebol als Open-Source-Software kehrte ich zu meinem Lieblingsdialekt zurück, um dieses Bingo-Problem zu lösen . Möglicherweise kann ich Rebmu bald als eigenes, teensy GPL-Paket vertreiben. :)
Rebmu 88 Zeichen
In der kompakten Notation:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Der Dialekt verwendet einen Trick, den ich Mushing nenne und der auf der Rebmu-Seite erklärt wird . Es ist "echt" in dem Sinne, dass es den Parser nicht betrügt; Dies ist ein gültiger Rebol ... und kann tatsächlich frei mit gewöhnlichem Code sowie (ahem) "Langform" -Rebmu ... gemischt werden, der übrigens 141 Zeichen umfassen würde:
[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!"]
(Da ich behaupte, dass die Komprimierung ein Trick ist, den man ohne die Hilfe von Automatisierung oder Kompilierung machen kann, entwickle ich den Code tatsächlich in muskulöser Form. Es ist nicht schwierig.)
Es ist eigentlich ganz einfach, nichts Besonderes - ich bin sicher, andere Rebol-Programmierer könnten die Dinge abschneiden. Einige kommentierte Quellen sind auf GitHub , aber der Haupttrick, den ich verwende, besteht darin, alle möglichen Lösungen in einer langen Reihe zu erstellen ("Liste", "Array", What-Have-You). Ich erstelle die diagonalen Lösungen während der Eingabeschleife, da fünf Einfügungen am Kopf und fünf Anhänge am Schwanz erforderlich sind, um sie zu erstellen ... und es wird bereits eine Schleife mit fünf Iterationen ausgeführt.
Das Ganze ist leicht zu Rebol-Code zuzuordnen, und ich habe noch keine "Matrix-Bibliotheken" in Rebmu mit Transposition oder anderen Gimmicks geworfen, die anscheinend häufig auftauchen. Eines Tages werde ich das tun, aber im Moment versuche ich nur, dem Medium Rebol selbst relativ nahe zu kommen. Kryptisch aussehende Dinge wie:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... sind eher einfach:
[
; 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 '*
]
Hinweis: Die obigen Klammern dienen der Verdeutlichung. Aber Rebol-Programmierer (wie Englisch sprechende) verzichten im Allgemeinen auf zusätzliche strukturelle Beschriftungen, um die Grammatik in der Kommunikation anzuzeigen ... sondern speichern sie für andere Anwendungen ...
Nur als zusätzlichen Bonus, um zu zeigen, wie interessant dies tatsächlich ist, werde ich eine Mischung aus normalem Code einwerfen, um das Board zusammenzufassen. Die Programmierstile sind eigentlich ... kompatibel:
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!"
Das ist auch gültiger Rebmu, und er gibt dir eine nette Brettsumme, bevor du mit dir Bingo spielst. In dem gegebenen Beispiel heißt es Hey grandma, the board sum is 912
. Welches ist wahrscheinlich richtig. Aber du verstehst den Punkt. :)
row
durch einen Ein-Zeichen-Namen ersetzen . Ungetestet: versucheni in'*'*5]
und ersetzen[x=='*']
durch[x==i]
.APL (82)
{
...}¨⍳5
: mache 5 mal:⍎(K,K)[⍞⍳⍨K←11↑⎕D]
: Lies eine Zeile (⍞
) und ordne alle Zeichen zu, die keine Ziffern oder Leerzeichen sind0
, und bewerte dann die Zeile.B←↑
: verwandle es in eine Matrix (5x5 wenn die Eingabe korrekt war) und speichere es in B.{
...}0=B
: Das Startbrett hat eine 1 im freien Feld (0) und 0 in den anderen Feldern.(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵
: wenn eine Zeile, eine Spalte oder eine Diagonale gefüllt ist:'BINGO!'
: dann ausgebenBINGO
∇⍵∨B=⍎1↓⎕←⍞
: Lesen Sie andernfalls eine Zeile (⍞
), wiederholen Sie sie (⎕←
) und lassen Sie das erste Zeichen fallen (1↓
) fallen, bewerte sie, um eine Zahl zu erhalten (⍎
), sieh nach, wo sie auf der Tafel vorkommt (B=
), markiere sie (⍵∨
) und versuche es erneut (∇
) .quelle
K, 114
Angesichts der Tafel
b
und der Anrufec
.
quelle