Бинго-генератор карт

10

Карта Бинго - это пять столбцов по пять квадратов в каждом, средний квадрат которых обозначен как «БЕСПЛАТНО». Числа не могут дублироваться.

Пять столбцов заполнены следующим диапазоном чисел:

  • B: 1-15
  • I: 16-30
  • N: 31-45
  • G: 46-60
  • O: 61-75

Как можно меньше символов выведите строку, которую можно интерпретировать как рандомизированную карту Бинго. Например:

1,2,3,4,5,16,17,18,19,20,31,32,33,34,35,46,47,48,49,50,61,62,63,64,65

Этот пример не рандомизирован, поэтому я могу показать, что столбец 1 заполнен 1,2,3,4,5. Также обратите внимание, что свободному пространству не было предоставлено никакой специальной обработки, потому что интерфейс, который интерпретирует эту строку, пропустит ее.

Другой пример будет:

1,16,31,46,61,2,17,32,47,62 ...

В этом примере выводом является строка, а не столбец.

Третий пример может быть:

01020304051617181920313233343546474849506162636465

Это тот же вывод, что и в первом примере, за исключением фиксированной длины.

Филипп Сенн
источник
Разве я единственный, кто никогда не слышал о Бинго, а только о Бредовом Бинго?
Джои,
Да! Это оно! Моя идея состоит в том, чтобы придумать список из 75 или более слов и заполнить карточку SELECT * FROM List ORDER BY NEWID ()
Филипп Сенн

Ответы:

2

PHP, 86

for($o=[];25>$i=count($o);){$n=rand(1,15)+($i-$i%5)*3;$o[$n]=$n;}echo implode(",",$o);
chocochaos
источник
Добро пожаловать в PPCG, хороший первый ответ c:
Род
Спасибо, я только что заметил, что слишком поздно, что этому вопросу 5 лет ... xD Не уверен, что это важно, хотя
chocochaos
joinэто псевдоним для, ìmplodeи вы можете поместить назначение в цикл после. Это сократит вашу идею доfor($o=[];25>$i=count($o);$o[$n]=$n)$n=rand(1,15)+($i-$i%5)*3;echo join(",",$o);
Йорг Хюльсерманн
1

Ruby 1.9, 48 символов

$><<(0..4).map{|i|[*1..75][15*i,15].sample 5}*?,
Ventero
источник
1

Windows PowerShell, 51 54

Я не уверен, правильно ли я понял вашу задачу.

(0..4|%{($x=15*$_+1)..($x+14)|random -c 5})-join','

Пример выходов:

5,9,1,7,13,26,18,23,17,22,37,33,34,41,44,50,53,59,60,58,73,72,64,69,66
14,10,13,5,1,24,29,26,17,30,34,33,43,41,38,59,50,60,49,56,71,61,72,70,68
3,11,4,5,13,27,16,25,26,22,43,34,42,32,38,51,52,49,58,54,61,70,73,71,62
1,9,13,12,4,23,25,20,26,22,40,33,35,44,37,55,47,52,59,53,74,70,75,64,69
8,6,7,1,9,16,21,23,18,17,35,41,37,38,34,60,50,57,51,59,66,75,73,74,71
11,6,13,4,1,29,27,24,22,18,40,35,41,32,43,51,54,57,58,53,74,71,69,66,64
детеныш
источник
1

PHP 106

<?$z=1;for($i=0;$i<5;$i++){for($j=0;$j<rand(1,5);$j++){$o[]=rand($z,$z+15);}$z+=15;}echo implode(",", $o);

Я не уверен, что правильно понял проблему ... Можете ли вы дать более подробное объяснение?

Альберто Фернандес
источник
Вывод неверный. Вам всегда нужно вывести все 25 квадратов :)
chocochaos
1

R, 63 51 50 49 45 байт

Спасибо Billywob за постоянные предложения и поддержку моей конкурентной борьбы.

cat(sapply(split(n<-1:75,cut(n,5)),sample,5))

5 14 15 3 1 20 30 28 18 27 32 45 42 43 41 49 54 50 56 47 68 66 64 73 71

rturnbull
источник
Векторизованный подход, который я попробовал, немного короче. cat(sapply(list(15,16:30,31:45,46:60,61:75),sample,5))Edit: не говоря уже о печати, добавил catвместо
Billywob
@Billywob Спасибо, это отличный ответ! С тех пор я нашел тот, который еще короче. (Не векторизовано, к сожалению.)
rturnbull
1
Повороты вы можете сделать еще лучше cat(sapply(split(1:75,ceiling(1:75/15)),sample,5)). Работает, разбивая вектор 1:75на список, где каждый элемент является вектором длины, 15а не используется list()для передачи объектов sapply.
Billywob
Очень хорошо! Я опубликовал ваше решение на несколько секунд, но потом я понял, как превзойти вас на один байт.
rturnbull
Хах! Даже лучше. Но я не думаю, что вам нужен labels = FALSEвариант для cut. Потому что все, что имеет значение, это то, что 5в функцию разделения передаются повторяющиеся факторы, независимо от имен.
Billywob
0

Clojure - 52 символа

(map #(take 5(shuffle %))(partition 15(range 1 76)))

Пример вывода (обратите внимание, что он предоставляет отдельные строки в виде подсписков):

((4 1 12 10 2) (25 23 21 16 27) (39 33 45 44 43) (48 53 59 54 47) (73 71 61 64 63))
mikera
источник
0

Python 2, 84 байта

from random import*
print sum([sample(range(1+i*15,16+i*15),5)for i in range(5)],[])

Если вывод в виде списка, если списки в порядке, есть 75-байтовое решение:

from random import*
print[sample(range(1+i*15,16+i*15),5)for i in range(5)]
Карл Напф
источник