Rebolのオープンソースソフトウェアとしての差し迫ったリリースの長い、長い、延滞の発表を考慮して、私はこのビンゴ問題を解決するために私の方言に戻りました。Rebmuを独自の小さなGPLパッケージとしてすぐに配布できるようになるかもしれません。:)
コンパクト表記では:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
方言は、Rebmuページで説明されている、私がミュージングと呼ぶトリックを使用しています。パーサーをだまさないという意味で「合法」です。これは有効なRebol ...であり、実際には通常のコードと(長文)Rebmuを自由に混在させることができます。BTWは141文字です。
[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!"]
(圧縮は自動化やコンパイルの助けを借りずにできるトリックだと思うので、実際にはコードをマッシュ形式で開発します。難しくはありません。)
実際には非常に単純で、特別なものはありません。他のRebolプログラマーが物を剃ることができると確信しています。コメントされたソースの一部 はGitHubにありますが、私が使用する主なトリックは、すべての可能なソリューションを長いシリーズ(「リスト」、「アレイ」、what-have-you)で構築することです。入力ループ中に対角ソリューションを構築します。これは、先頭で5回の挿入と末尾で5回の追加が必要になるためです...そして、すでに5回の反復ループが進行中です。
全体がRebolコードに簡単にマッピングされますが、転置やその他のギミックが頻繁に発生すると思われる「マトリックスライブラリ」をRebmuにまだ投入していません。いつかそうするつもりですが、今のところは、Rebolの媒体に比較的近いところで作業しようとしています。次のような不可解なもの:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
...かなりシンプルです:
[
; 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 '*
]
注:明確にするために上に括弧を追加しました。しかし、Rebolプログラマー(英語を話す人など)は一般に、コミュニケーションの文法を示すための追加の構造的なコールアウトの適用を避けます...むしろ、他のアプリケーションのためにそれらを保存します...
これが実際にどれだけ面白いかを示すための追加のボーナスとして、ボードを合計するために通常のコードのいくつかのミックスを投入します。プログラミングスタイルは実際に...互換性があります:
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!"
それも同様に有効なRebmuであり、ビンゴをプレイする前に素敵なボードサムを提供します。与えられた例では、それは言いHey grandma, the board sum is 912ます。おそらく正しいでしょう。しかし、あなたはポイントを得る。:)
row1文字の名前に置き換えることができます。未テスト:i in'*'*5]で置き換え[x=='*']てみてください[x==i]。