코드 골프 빙고!


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 길이의 대각선이 모두 채워짐) 직후에 표준 출력으로 호출을 에코 한 다음 인쇄하십시오 BINGO!.

위의 예에서 다음을 인쇄하십시오.

B7
I29
G60
G51
O71
I23
I16
BINGO!

규칙

표준 코드 골프 규칙, 가장 짧은 코드가 승리합니다.

세부

빙고를 보장하기 위해 항상 충분한 전화가있을 것입니다. 보드에는 중복 번호가없고 중복 통화도 없습니다. 보드는 전화와 마찬가지로 항상 숫자와 문자가 정확하게 일치합니다 ( B열에는 1-15 만, I열에는 16-30 만 등). 유일하고 여유 공간은 항상 중간 *대신에 숫자 대신 표시됩니다 . 당첨 통화 후 표준 입력에서 통화 소비 및 폐기는 허용되지만 필수는 아닙니다.

자신 만의 테스트 사례를 만드십시오!

답변:


3

122 120 CHAR

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

$b두 개의 추가 정크 열로 카드를 빌드하십시오 . 카드 *에서 전화 번호를 바꾸고 전화 번호를 인쇄하십시오. 그런 다음 *보드에 5 개의 규칙적인 간격이 있으면 마지막 정규식이 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}}}

편집 : mob의 펄 답변에서 정규 표현식 기술을 사용하여 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!"

방언은 트릭 I 전화 사용 mushing 상의 설명 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 에 있지만 내가 사용하는 주요 트릭은 긴 시리즈 ( "목록", "배열", 무엇을 가지고 있는지)로 가능한 모든 솔루션을 작성하는 것입니다. 입력 루프 중에 대각선 솔루션을 작성합니다. 헤드에서 5 개의 삽입과 꼬리에서 5 개의 추가가 이루어 지므로 이미 5 개의 반복 루프가 진행 중입니다.

모든 것이 Rebol 코드에 쉽게 매핑되며, 아직 "매트릭스 라이브러리"를 Rebmu에 던져 넣지 않았습니다. 언젠가 나는 그렇게 할 것이지만 지금은 레볼 자체의 매체에 비교적 가깝게 일하려고 노력하고 있습니다. 암호처럼 보이는 것들 :

 [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이며, Bingo를 플레이하기 전에 좋은 보드 합계를 제공합니다. 주어진 예에서는이라고 말합니다 Hey grandma, the board sum is 912. 아마 맞을 것입니다. 그러나 당신은 요점을 얻습니다. :)


2

매스 매 티카 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

파이썬 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!

row하나의 문자 이름으로 바꿀 수 있습니다. 테스트되지 않은 : 시도 i in'*'*5]및 교체 [x=='*']와 함께 [x==i].
복원 Monica Monica

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.