เครื่องกำเนิดบัตรบิงโก


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

นี่เป็นเอาต์พุตเดียวกันกับตัวอย่างที่ 1 ยกเว้นในความยาวคงที่


ฉันเป็นคนเดียวที่ไม่เคยได้ยินเกี่ยวกับบิงโก แต่เป็นเพียงแค่ของ Bullshit Bingo?
Joey

ใช่ แค่นั้นแหละ! ความคิดของฉันคือการหารายชื่อ 75 คำขึ้นไปและเติมข้อมูลการ์ดด้วย SELECT * จากรายการเรียงลำดับตาม NEWID ()
Phillip Senn

คำตอบ:


2

PHP, 86

for($o=[];25>$i=count($o);){$n=rand(1,15)+($i-$i%5)*3;$o[$n]=$n;}echo implode(",",$o);

ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี c:
Rod

ขอบคุณฉันเพิ่งสังเกตุช้าไปหน่อยว่าคำถามนี้อายุ 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);
JörgHülsermann


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


วิธีการเวกเตอร์ที่ฉันลองใช้นั้นสั้นกว่านี้เล็กน้อย cat(sapply(list(15,16:30,31:45,46:60,61:75),sample,5))แก้ไข: ไม่ต้องสนใจการพิมพ์เพิ่ม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))

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)]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.