Generator kart Bingo

10

Karta Bingo składa się z pięciu kolumn po pięć kwadratów każda, a środkowy kwadrat oznaczony jest jako „DARMOWY”. Liczby nie mogą się powielać.

Pięć kolumn jest wypełnionych następującym zakresem liczb:

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

W jak najmniejszej liczbie znaków wypisz ciąg znaków, który można interpretować jako losową kartę Bingo. Na przykład:

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

Ten przykład nie jest losowy, więc mogę pokazać, że kolumna 1 jest wypełniona 1,2,3,4,5. Zauważ też, że wolne miejsce nie zostało specjalnie potraktowane, ponieważ interfejs, który interpretuje ten ciąg, pominie go.

Innym przykładem może być:

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

W tym przykładzie dane wyjściowe są według wiersza zamiast według kolumny.

Trzecim przykładem może być:

01020304051617181920313233343546474849506162636465

Jest to ten sam wynik jak w pierwszym przykładzie, z wyjątkiem stałej długości.

Phillip Senn
źródło
Czy jestem jedynym, który nigdy nie słyszał o Bingo, ale zamiast o Bullshit Bingo?
Joey,
Tak! Otóż ​​to! Moim pomysłem jest stworzenie listy zawierającej 75 lub więcej słów i wypełnienie karty WYBIERZ * Z LISTY ZAMÓW PRZEZ NEWID ()
Phillip Senn

Odpowiedzi:

2

PHP, 86

for($o=[];25>$i=count($o);){$n=rand(1,15)+($i-$i%5)*3;$o[$n]=$n;}echo implode(",",$o);
chocochaos
źródło
Witamy w PPCG, fajna pierwsza odpowiedź c:
Rod
Dzięki, właśnie zauważyłem trochę za późno, że to pytanie ma 5 lat ... xD Nie jestem pewien, czy to ma znaczenie
chocochaos
joinjest aliasem dla ìmplodei możesz umieścić przypisanie w pętli końcowej. for($o=[];25>$i=count($o);$o[$n]=$n)$n=rand(1,15)+($i-$i%5)*3;echo join(",",$o);
Skróci
1

Ruby 1.9, 48 znaków

$><<(0..4).map{|i|[*1..75][15*i,15].sample 5}*?,
Ventero
źródło
1

Windows PowerShell, 51 54

Nie jestem jednak pewien, czy poprawnie zrozumiałem twoje zadanie.

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

Przykładowe wyniki:

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
Joey
źródło
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);

Nie jestem pewien, czy poprawnie zrozumiałem problem ... Czy możesz podać bardziej szczegółowe wyjaśnienie?

Alberto Fernández
źródło
Dane wyjściowe są niepoprawne. Zawsze musisz
wypisać
1

R, 63 51 50 49 45 bajtów

Dzięki Billywob za bieżące sugestie i zachęcanie do mojej rywalizacji.

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
źródło
Wektoryzowane podejście, które wypróbowałem, jest nieco krótsze. cat(sapply(list(15,16:30,31:45,46:60,61:75),sample,5))Edycja: nie cat
wspominając
@Billywob Dzięki, to świetna odpowiedź! Od tamtej pory znalazłem jeszcze krótszy. (Niestety nie wektoryzowane.)
rturnbull
1
Okazuje można zrobić jeszcze lepiej: cat(sapply(split(1:75,ceiling(1:75/15)),sample,5)). Działa poprzez podzielenie wektora 1:75na listę, w której każdy element jest wektorem długości 15zamiast używania list()do przekazywania obiektów sapply.
Billywob,
Bardzo dobrze! Wysłałem twoje rozwiązanie na kilka sekund, ale potem wymyśliłem, jak cię obezwładnić jednym bajtem.
rturnbull
Hah! Nawet lepiej. Ale nie sądzę, że potrzebujesz takiej labels = FALSEopcji cut. Ponieważ wszystko, co się liczy, to 5powtarzające się czynniki przekazywane do funkcji podziału, niezależnie od nazw.
Billywob,
0

Clojure - 52 znaki

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

Przykładowe dane wyjściowe (należy pamiętać, że zawiera osobne wiersze jako listy podrzędne):

((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
źródło
0

Python 2, 84 bajtów

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

Jeśli dane wyjściowe jako lista, jeśli listy są w porządku, istnieje rozwiązanie 75 bajtów :

from random import*
print[sample(range(1+i*15,16+i*15),5)for i in range(5)]
Karl Napf
źródło