Код Гольф Бінго!


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 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 регулярно розташованих s.


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

EDIT: Розв’язання символів 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. :)


Ребму 88 символів

У компактних позначеннях:

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

Діалект використовує трюк, який я називаю 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 , але головна хитрість, яку я використовую, - це зібрати всі можливі рішення з тривалої серії ("список", "масив", "що-у вас є"). Я будую діагональні рішення під час вхідного циклу, оскільки для їх виготовлення потрібно п’ять вставок на голові та п’ять додатків у хвіст ... і вже триває цикл п’яти ітерацій.

Вся справа легко перетворюється на код 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!"

Це також дійсний Ребму, і він дасть вам гарну суму на дошці, перш ніж грати з Бінго з вами. У наведеному прикладі йдеться 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++]

В7

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].
Відновіть Моніку

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↓⎕←⍞: в іншому випадку прочитайте рядок ( ), відлучіть його ( ⎕←), опустіть перший символ ( 1↓), оцініть його, щоб отримати число ( ), подивіться, де він зустрічається на дошці ( B=), позначте його ( ⍵∨) та повторіть спробу ( ) .

0

К, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.