บิงโกรหัสกอล์ฟ!


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

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ด้วยคอลัมน์ขยะสองคอลัมน์เพิ่มเติม แทนที่หมายเลขที่เรียกบนการ์ดด้วย*และพิมพ์หมายเลขที่เรียก จากนั้นนิพจน์ทั่วไปสุดท้ายจะประเมินเป็นจริงเมื่อมีเว้นระยะ 5 *บนกระดานเป็นประจำ


4

C # - 536

(ตกลงนี่อาจจะไม่ใช่ภาษาที่เหมาะสมที่สุดสำหรับเรื่องนั้น แต่อย่างไรก็ตาม…)

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}}}

แก้ไข:โซลูชันตัวละคร 130 ตัวโดยใช้เทคนิคการแสดงออกปกติจากคำตอบของ perl ของ mob:

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!"

ภาษาที่ใช้เป็นเคล็ดลับที่ฉันโทรmushingซึ่งจะมีการอธิบายในหน้า Rebmu มัน "ถูกต้อง" ในแง่ที่ว่ามันไม่ได้โกง parser นี่เป็น Rebol ที่ถูกต้อง ... และจริง ๆ แล้วสามารถผสมกับรหัสปกติได้อย่างอิสระรวมทั้ง (ahem) "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แต่เคล็ดลับหลักที่ฉันใช้คือการสร้างโซลูชันที่เป็นไปได้ทั้งหมดในชุดยาว ("รายการ", "อาร์เรย์" สิ่งที่มีคุณ) ฉันสร้างวิธีแก้ปัญหาแนวทแยงในระหว่างลูปอินพุทเนื่องจากมันใช้เวลาห้าครั้งในการแทรกที่ส่วนหัวและอีกห้าส่วนท้ายที่จะทำให้พวกเขา ... และมีการวนรอบวนซ้ำห้าครั้ง

ทุกอย่างแมปไปยังรหัส Rebol อย่างง่ายดายและฉันยังไม่ได้โยน "matrix matrix" ใด ๆ ลงใน 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!

คุณสามารถแทนที่rowด้วยชื่อองค์กร ยังไม่ทดลอง: ลองi in'*'*5]และแทนที่ด้วย[x=='*'] [x==i]
Reinstate 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 : กระดานเริ่มต้นมี 1 ในพื้นที่ว่าง (0) และ 0 ในช่องว่างอื่น ๆ
  • (D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵: หากบรรทัดคอลัมน์หรือเส้นทแยงมุมถูกเติมเต็ม:
  • 'BINGO!': จากนั้นเอาท์พุท BINGO
  • ∇⍵∨B=⍎1↓⎕←⍞: ไม่เช่นนั้นอ่านบรรทัด ( ), echo it ( ⎕←), ปล่อยอักขระตัวแรก ( 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.