Golf Bingo kod!


14

Size bir Bingo kartı ve çağrı listesi verilir . BINGO yazdırmalısınız! tahta oyunu kazanır kazanmaz.

Bingo tahtaları şöyle görünür:

resim açıklamasını buraya girin

Bunlar şu şekilde belirtilecektir:

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

Kurulun hemen ardından aşağıdaki gibi çağrılar yapılacaktır:

B7
I29
G60
G51
O71
I23
I16
N38

Çağrıları, kazanmanızı sağlayan çağrıdan (sıra, sütun veya 5-uzun diyagonal olsun) tamamlanana kadar standart çıktıya yankılamanız ve ardından yazdırmanız gerekir BINGO!.

Yukarıdaki örnek için şunu yazdırın:

B7
I29
G60
G51
O71
I23
I16
BINGO!

kurallar

Standart kod golf kuralları, en kısa kod kazanır.

ayrıntılar

Size bir Bingo garanti etmek için her zaman yeterli çağrı olacaktır. Kartta yinelenen numaralar ve yinelenen aramalar olmayacaktır. Kartlarda her zaman doğru eşleşen sayılar ve harfler bulunur ( Bsütun yalnızca 1-15, Isütun yalnızca 16-30 içerir, vb.). Bir ve tek boş alan her zaman ortada, *sayı yerine ile işaretlenir . Kazanan aramaya izin verildikten sonra standart girişten gelen çağrıları tüketme ve atma, ancak gerekli değildir.

Kendi test durumlarınızı yapın!

Yanıtlar:


3

Perl, 122120 karakter

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

Kartı $biki ek önemsiz sütunla oluşturun. Kartta aranan numaraları değiştirin ve *aranan numarayı yazdırın. Daha sonra *tahta üzerinde düzenli aralıklarla 5 boşluk olduğunda son düzenli ifade doğru olarak değerlendirilir .


4

C # - 536

(Tamam, bu muhtemelen bunun için en uygun dil değil, her neyse…)

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

Biçimlendirilmiş ve yorumlanmış:

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

Yakut 1.9 (194, 130)

Bu muhtemelen boş sütunları kontrol etmenin en mantıklı yolu değil, ama denemeyi düşündüğüm ilk şeydi! Özellikle, bu #transposeçok pahalı.

Panoyu bildirirken pano ile sayılar arasındaki boş satır veya sabit genişlik alanları çok fazla karakter kaydeder. Tam olarak 5 satır okumak için gerçekten güzel bir yol düşünemedim.

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

EDIT: mafya perl cevap düzenli ifade tekniği kullanılarak 130 karakter çözümü:

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'un açık kaynaklı yazılım olarak yakında çıkacak olan uzun, uzun, gecikmiş duyurusu göz önüne alındığında, bu Bingo sorununu çözmek için evcil hayvan lehçeme geri döndüm . Yakında Rebmu'yu kendi gençlik GPL paketi olarak dağıtabilirim. :)


Rebmu 88 karakter

Kompakt gösterimde:

rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"

Ağız , Rebmu sayfasında açıklanan, mantar dediğim bir numara kullanır . Ayrıştırıcıyı aldatmaması anlamında "yasal"; bu geçerli Rebol ... ve aslında sıradan kod ile serbestçe karıştırılabilir yanı sıra (ahem) "uzun biçimli" Rebmu ... BTW 141 karakter olurdu:

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

(Sıkıştırma, otomasyon veya derleme yardımı olmadan yapabileceğiniz bir hile olduğunu iddia ettiğim için, aslında kodu mantar formunda geliştiriyorum. Zor değil.)

Aslında oldukça basit, özel bir şey yok - eminim diğer Rebol programcıları şeyleri tıraş edebilir. Yorumlanan bazı kaynaklar GitHub'da , ancak kullandığım ana hile uzun bir dizi ("liste", "dizi", ne var) tüm olası çözümleri oluşturmaktır. Giriş döngüsü sırasında diyagonal çözümleri oluşturuyorum, çünkü kafada beş ekleme ve onları yapmak için kuyruğa beş ekleme ... ve zaten devam eden beş iterasyon döngüsü var.

Her şey Rebol koduyla kolayca eşleşiyor ve henüz transpozisyon veya sık sık ortaya çıkan diğer hile ile herhangi bir "matris kütüphanesi" Rebmu'ya atmadım. Bir gün bunu yapacağım ama şimdilik sadece Rebol'un ortamına nispeten yakın çalışmaya çalışıyorum. Cryptic görünümlü şeyler gibi:

 [g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]

... oldukça basit:

 [
     ; 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 '*
 ]

Not: Netlik için yukarıda parantez eklenmiştir. Ancak Rebol programcıları (İngilizce konuşanlar gibi) genellikle iletişimdeki dilbilgisini göstermek için ekstra yapısal ek bilgilerden kaçınırlar ... onları diğer uygulamalar için saklarlar ...

Bunun gerçekten ne kadar ilginç olduğunu göstermek için bir avantaj olarak, tahtayı toplamak için normal kodun bir karışımını atacağım. Programlama stilleri aslında ... uyumludur:

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

Bu da geçerli Rebmu ve sizinle Bingo oynamadan önce size güzel bir tahta toplamı verecek. Verilen örnekte diyor Hey grandma, the board sum is 912. Bu muhtemelen doğru. Ama anlıyorsunuz. :)


2

Mathematica 250

Açıklama: Girişin Mathematica için kullanımı çok daha doğal olan listelerde verildiğini varsaydım. Yani, bkurulu ctemsil etmek ve çağrıları temsil etmekle,

b//Grid
c//Column

giriş

Giriş dizgide olacaksa, kod yaklaşık 30 karakter artar. (Daha sonra bu varyasyonu ekleyeceğim.)

kod

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

BİNGO!


2

Piton 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!'

Kullanımı:

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

Tek rowkarakterlik bir adla değiştirebilirsiniz. Test edilmemiş: deneyin i in'*'*5]ve değiştirme [x=='*']ile [x==i].
Monica

2

APL (82)

{(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵:'BINGO!'⋄∇⍵∨B=⍎1↓⎕←⍞}0=B←↑{⍎(K,K)[⍞⍳⍨K←11↑⎕D]}¨⍳5
  • {... }¨⍳5: 5 kez yapın:
  • ⍎(K,K)[⍞⍳⍨K←11↑⎕D]: bir satırı ( ) okuyun ve basamak veya boşluk olmayan tüm karakterleri eşleyin 0, ardından satırı değerlendirin.
  • B←↑: bir matrise çevirin (giriş doğruysa 5x5) ve B'de saklayın.
  • {... }0=B: başlangıç ​​kartında boş alanda 1 ve diğer alanlarda 0 vardır.
  • (D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵: bir çizgi, sütun veya köşegen doldurulmuşsa:
  • 'BINGO!': sonra çıktı BINGO
  • ∇⍵∨B=⍎1↓⎕←⍞: aksi takdirde, bir satır ( ) okuyun , yankılayın ( ⎕←), ilk karakteri bırakın ( 1↓), sayı ( ) elde etmek için değerlendirin , tahtada ( B=) nerede göründüğüne bakın , işaretleyin ( ⍵∨) ve tekrar deneyin ( ) .

0

K, 114

Yönetim kurulu bve çağrılar verildic

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.