ゴルフビンゴをコード化!


14

あなたが与えられているビンゴボードとコールのリスト。BINGOを印刷する必要があります!ボードがゲームに勝利するとすぐに。

ビンゴボードは次のようになります。

ここに画像の説明を入力してください

これらは次のように指定されます。

14 29 38 52 74
4 18 33 46 62
7 16 * 60 71
9 27 44 51 67
12 23 35 47 73

ボードのすぐ後に、次のような呼び出しがあります。

B7
I29
G60
G51
O71
I23
I16
N38

勝者となるコール(行、列、または5つの長い対角線をすべて塗りつぶす)の直後まで、コールを標準出力にエコーし、次にprintする必要がありますBINGO!

上記の例では、次を印刷します。

B7
I29
G60
G51
O71
I23
I16
BINGO!

ルール

標準のコードゴルフ規則、最短コードが勝ちます。

詳細

ビンゴを保証するのに十分な電話が常にあります。ボードには重複した番号はなく、重複した呼び出しもありません。ボードには、呼び出しと同様に、常に正しく一致する数字と文字Bが含まれます(列には1〜15 Iのみが含まれ、列には16〜30のみが含まれます)。唯一の空き領域は常に中央*にあり、数字ではなくマークが付けられます。勝者の呼び出しが許可された後の標準入力からの呼び出しの消費と破棄は許可されますが、必須ではありません。

独自のテストケースを作成してください!

回答:


3

Perl、122 120文字

$b=join'. .
',map~~<>,0..4;while(<>){/(\d+)/;$b=~s/\b$1\b/*/;print;
$b=~/(\*\s(\S+\s){$_}){4}\*/&&die"BINGO!
"for 0..7}

$bジャンキーカラムを2つ追加して、カードを組み込みます。カードで呼び出される番号を置き換え、着信番号を*印刷します。次に、*ボード上に5つの等間隔のs がある場合、最後の正規表現はtrueと評価されます。


4

C#– 536

(OK、これはおそらくこれに最適な言語ではありませんが、とにかく…)

using System;using System.Collections.Generic;using System.Linq;class C{static void Main(){var s=Enumerable.Range(1,12).Select(_=>new HashSet<string>()).ToList();var b=Enumerable.Range(1,5).Select(_=>Console.ReadLine().Split(' ')).ToList();int i;for(i=0;i<5;++i){for(int j=0;j<5;++j){s[i].Add(b[i][j]);s[i+5].Add(b[j][i]);}s[10].Add(b[i][i]);s[11].Add(b[4-i][i]);}while(i>0){var l=Console.ReadLine();Console.WriteLine(l);l=l.Substring(1);foreach(var x in s){x.Remove("*");x.Remove(l);if(x.Count==0){Console.WriteLine("BINGO!");i=0;}}}}}

フォーマットおよびコメント:

using System;
using System.Collections.Generic;
using System.Linq;

class C
{
    static void Main()
    {
        // all possible winnable five-item sets – any one of them need to be emptied to win
        var s = Enumerable.Range(1, 12).Select(_ => new HashSet<string>()).ToList();
        // read the board from input to a list of arrays of numbers
        var b = Enumerable.Range(1, 5).Select(_ => Console.ReadLine().Split(' ')).ToList();
        int i;
        // split the board into the winnable sets
        for (i = 0; i < 5; ++i)
        {
            for (int j = 0; j < 5; ++j)
            {
                // sets 0–4 represent rows
                s[i].Add(b[i][j]);
                // sets 5–9 represent columns
                s[i + 5].Add(b[j][i]);
            }
            // set 10 represent one diagonal
            s[10].Add(b[i][i]);
            // set 11 represent the other diagonal
            s[11].Add(b[4 - i][i]);
        }
        while (i > 0)
        {
            // read and echo another input
            var l = Console.ReadLine();
            Console.WriteLine(l);
            // ignore the initial letter – we are guaranteed it is correct, anyway
            l = l.Substring(1);
            // remove the number from all sets
            foreach (var x in s)
            {
                x.Remove(l);
                // also remove the center * (inside the loop just to shave off a few characters)
                x.Remove("*");
                // if any set became empty, we won!
                if (x.Count == 0)
                {
                    Console.WriteLine("BINGO!");
                    // ensure the loop will stop (might not be necessary per the rules, but anyway)
                    i = 0;
                }
            }
        }
    }
}

4

ルビー1.9(194、130)

これはおそらく空の列をチェックするための最も賢明な方法ではありませんが、私が最初に試してみたのはそれでした!特に、それに#transposeは多くの費用がかかります。

ボードを宣言するときにボードと数字または固定幅フィールドの間に空白行を入れると、多くの文字が節約されます。正確に5行を読み取るための本当に良い方法は考えられませんでした。

b=(R=0..4).map{gets}.join.scan /\d+|\*/
loop{gets
puts$_
~/\d+/
(e=b.index$&)&&b[e]=?*
R.map{|y|$><<:BINGO!&&exit if R.map{|x|[b[5*x+y],b[5*y+x],b[y<1?x*6:4*x+4]]}.transpose.any?{|a|a==[?*]*5}}}

編集:暴徒のperlの答えから正規表現技術を使用して130文字のソリューション:

b=(0..4).map{gets}*'~ ~ '
loop{gets
puts$_
~/\d+/
b[/\b#$&\b/]=?*
7.times{|i|$><<:BINGO!&&exit if b=~/(\*\s(\S+\s){#{i}}){4}\*/m}}

4

Rebolのオープンソースソフトウェアとして差し迫ったリリースの長い、長い、延滞の発表を考慮して、私はこのビンゴ問題を解決するために私の方言に戻りました。Rebmuを独自の小さなGPLパッケージとしてすぐに配布できるようになるかもしれません。:)


Rebmu 88文字

コンパクト表記では:

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ます。おそらく正しいでしょう。しかし、あなたはポイントを得る。:)


2

Mathematica 250

開示:入力はMathematicaで使用するのにはるかに自然なリストで与えられたと仮定した。それで、bボードをc代表し、コールを代表して、

b//Grid
c//Column

入力

入力が文字列である場合、コードは約30文字増加します。(後でそのバリエーションを含めます。)

コード

y = ReplacePart[ConstantArray[0, {5, 5}], {3, 3} -> 1]; d = Diagonal;
t := Tr[BitAnd @@@ Join[y, Transpose@y, {d@y}, {d[Reverse /@ y]}]] > 0;
r@i_ :=(y = ReplacePart[y, Position[x, ToExpression@StringDrop[i, 1]][[1]] -> 1]; 
Print@If[t, Column[{i, "BINGO!"}], i])
n = 1; While[! t, r@c[[n]]; n++]

B7

I29

G60

G51

O71

I23

I16

ビンゴ!


2

Python 249

R=raw_input;F=B=[[[x,0][x=='*']for x in row]for row in[R().split()for i in'11111']];A=any
while all([all(map(A,B)),all(map(A,zip(*B))),A(F[::6]),A(F[4:24:4])]):c=R();print c;C=c[1:];B=[[[x,0][x==C]for x in row]for row in B];F=sum(B,[])
print'BINGO!'

使用法:

$ ./bingo.py < bingo.txt
B7
I29
G60
G51
O71
I23
I16
BINGO!

row1文字の名前に置き換えることができます。未テスト:i in'*'*5]で置き換え[x=='*']てみてください[x==i]
モニカを

2

APL(82)

{(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵:'BINGO!'⋄∇⍵∨B=⍎1↓⎕←⍞}0=B←↑{⍎(K,K)[⍞⍳⍨K←11↑⎕D]}¨⍳5
  • {... }¨⍳5:5回行います:
  • ⍎(K,K)[⍞⍳⍨K←11↑⎕D]:行()を読み取り、数字またはスペース以外のすべての文字をにマップしてから0、行を評価します。
  • B←↑:行列(入力が正しい場合は5x5)に変換し、Bに保存します。
  • {... }0=B:開始ボードには、空きスペース(0)に1があり、他のスペースに0があります。
  • (D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵:行、列、または対角線が塗りつぶされている場合:
  • 'BINGO!':次に出力 BINGO
  • ∇⍵∨B=⍎1↓⎕←⍞:それ以外の場合、行を読む()、エコーする(⎕←)、最初の文字をドロップする(1↓)、数値を得るために評価する()、ボード上のどこで発生するかを見る(B=)、マークする(⍵∨)、再試行する() 。

0

K、114

ボードbとコールを考えるとc

b{-1@y;a:(5*!5)_@[,/x;&(,/x)~\:1_y;:;"*"];$[max{max@min'"*"=,/'x}@/:(a;a ./:/:+:'(r;)'(r;|:r:!5));'"BINGO!";];a}/c

k)b
"14" "29" "38" "52" "74"
,"4" "18" "33" "46" "62"
,"7" "16" ,"*" "60" "71"
,"9" "27" "44" "51" "67"
"12" "23" "35" "47" "73"
k)c
"B7"
"I29"
"G60"
"G51"
"O71"
"I23"
"I16"
"N38"
k)b{-1@y;a:(5*!5)_@[,/x;&(,/x)~\:1_y;:;"*"];$[max{max@min'"*"=,/'x}@/:(a;a ./:/:+:'(r;)'(r;|:r:!5));'"BINGO!";];a}/c
B7
I29
G60
G51
O71
I23
I16
'BINGO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.