เลือกหมายเลขลอตเตอรี่!


34

ลอตเตอรี่เป็นหวยอเมริกันที่เพิ่งได้รับความสนใจเนื่องจากแจ็คพอตปัจจุบัน (ณ วันที่ 11 มกราคม 2016) เป็นรางวัลล็อตโต้ที่ใหญ่ที่สุดในประวัติศาสตร์ประมาณ 1.5 พันล้านเหรียญสหรัฐ ( USD )

ผู้เล่น Powerball เลือก 5 หมายเลขที่แตกต่างกันจากลูกบอลสีขาว 69 หมายเลขและ 1 "Powerball" หมายเลขหนึ่งจากลูกบอลสีแดง 26 หมายเลข พวกเขาชนะรางวัลแจ็คพอตหากลูกบอลสีขาวห้าลูกเลือกตรงกับสิ่งที่วาดตามลำดับใด ๆและหากพวกเขาเลือกหมายเลข "Powerball" ที่ถูกต้อง

โอกาสชนะแจ็คพอตคือ 1 ใน(69 choose 5)*(26 choose 1)หรือ((69*68*67*66*65)/(5*4*3*2*1))*26เท่ากับ1 ใน 292,201,338

ไม่มีใครชนะแจ็คพอตในการจับรางวัลครั้งล่าสุดเมื่อวันที่ 9 มกราคม 2016 แต่บางทีใครบางคนอาจจะชนะการจับรางวัลครั้งต่อไปในวันที่ 13 มกราคม 2016, 22:59 น. ET

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่เลียนแบบการวาด Powerball โดยไม่ต้องป้อนข้อมูล แต่ให้ส่ง 5 หมายเลขสุ่มที่แตกต่างกันจาก 1 ถึง 69 และจากนั้นหนึ่งหมายเลข "Powerball" สุ่มจาก 1 ถึง 26 รวม (ซึ่งอาจเป็นการซ้ำหนึ่งใน 5 ตัวเลขเริ่มต้น)

หมายเลข "Powerball" ควรเป็นหมายเลขสุดท้ายในผลลัพธ์เสมอมิฉะนั้นคำสั่งของหมายเลข 5 ตัวแรกนั้นไม่สำคัญ

ตัวเลข 6 ตัวควรเป็นเอาต์พุตในรูปแบบทศนิยมคั่นด้วยช่องว่างหรือขึ้นบรรทัดใหม่ด้วยการขึ้นบรรทัดใหม่แบบตัวเลือกเดียว ไม่อนุญาตให้ใช้เครื่องหมายจุลภาควงเล็บและอักขระอื่นในเอาต์พุต

ดังนั้นสิ่งเหล่านี้จะเป็นผลลัพธ์ที่ถูกต้อง (ใช้ตัวเลขจากรูปวาดล่าสุด ):

32 16 19 57 34 13
32
16
19
57
34
13

ผลลัพธ์ที่เป็นไปได้ทั้งหมด 292201338 ควรเป็นไปได้ด้วยความน่าจะเป็นแบบเดียวกัน คุณสามารถใช้ตัวสร้างตัวเลขสุ่มหลอกในตัวและถือว่าพวกมันตรงตามมาตรฐานนี้

นี่คือการใช้งานอ้างอิงแบบไม่ถูกปรับแต่งที่ทำงานใน Python 2 หรือ 3:

import random
print(' '.join(map(str, random.sample(range(1,70), 5) + [random.randint(1, 26)])))

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


โปรดทราบว่าฉันไม่มีส่วนเกี่ยวข้องกับ Powerball และไม่แนะนำให้คุณเล่น แต่ถ้าคุณชนะรางวัลใด ๆ จากตัวเลขที่เกิดจากหนึ่งในโปรแกรมที่นี่ฉันแน่ใจว่าเรายินดีที่จะรับฟัง : D


12
พลาดโอกาสในการรับส่วนแบ่งของเงินรางวัลหากมีคนที่นี่รับแจ็คพอต
อเล็กซ์ A.

ตัวเลข 5 ตัวต้องเป็นไปตามลำดับหรือไม่
Neil

@Neil "หมายเลข" Powerball "ควรเป็นหมายเลขสุดท้ายในผลลัพธ์เสมอมิฉะนั้นหมายเลข 5 ตัวแรกนั้นไม่สำคัญ
งานอดิเรกของ Calvin

3
ฉันแน่ใจว่าไม่มีใครสับสน แต่จริง ๆ แล้วคุณหมายถึงจำนวนเต็มในการท้าทาย
jpmc26

1
@CanadianLuke ลำดับของ 5 หมายเลขแรกไม่สำคัญ มี5! = 5*4*3*2*1วิธีการจัดเรียง 5 สิ่งเพื่อให้คุณแยกตัวประกอบ
งานอดิเรกของ Calvin

คำตอบ:


29

Dyalog APL ขนาด 10 ไบต์

(5?69),?26

Dyadic ?คือ numbers ตัวเลขสุ่มที่แตกต่างกันใน [1, ⍵] และ monadic ?เป็นตัวเลขสุ่มเดียว

ลองมันนี่


เกือบจะเหมือนกันใน J ยกเว้นคุณต้องเพิ่ม 1 เนื่องจากการจัดทำดัชนีตาม 1+(5?69),?260:
Randomra

13

CJam, 16 ไบต์

69,mr5<26mr+:)S*
69,   range(69)
mr    shuffle the generated array
5<    first 5 elements
26mr  random number 0..25
+     concat to array
:)    increment each array element
S*    join with spaces

ลองออนไลน์


1
ฉันชอบที่:)ทำให้สิ่งต่าง ๆ ยิ่งใหญ่ขึ้นเพียงเล็กน้อยเช่นเดียวกับที่รอยยิ้มของคนแปลกหน้าสามารถทำให้คุณมีความสุขมากขึ้นได้
Nic Hartley

1
ฉันคิดว่าฉันจะสวย:)ถ้าฉันได้รับลอตเตอรี +1
Arcturus

9

MATL 10 ไบต์

69 5Zr26Yr

ใช้เวอร์ชันปัจจุบัน (9.2.0)ของภาษา / คอมไพเลอร์

ตัวอย่าง

ด้วยคอมไพเลอร์ทำงานบน Matlab:

>> matl
 > 69 5Zr26Yr
 > 
66
59
64
56
29
12

ด้วยคอมไพเลอร์ทำงานบน Octave:

>> matl
 > 69 5Zr26Yr
 >
2 69 41 44 23
22

ตัวเลขห้าตัวแรกถูกคั่นด้วยช่องว่างไม่ใช่ด้วยการขึ้นบรรทัดใหม่ นี่คือสาเหตุที่randsampleฟังก์ชั่นพื้นฐานของ Octave ทำงานแตกต่างจาก Matlab (และได้รับการแก้ไขในคอมไพเลอร์เวอร์ชั่นใหม่) อย่างไรก็ตามการขึ้นบรรทัดใหม่และพื้นที่ได้รับอนุญาตจากความท้าทาย

แก้ไข (4 เมษายน 2016) : ลองออนไลน์!

คำอธิบาย

69 5Zr    % randsample(69,5), without replacement by default. Gives a 5x1 column vector
26Yr      % randi(26). Gives single number
          % implicit display

ดูฟังก์ชั่นที่เกี่ยวข้อง Matlab: และrandsamplerandi


7

ทับทิม, 33 32

p *[*1..69].sample(5),rand(26)+1

ทับทิมมีวิธีการตัวอย่างในตัวที่เลือกค่าสุ่มจากอาร์เรย์โดยไม่มีการแทนที่ ขอบคุณ QPaysTaxes ที่ชี้ให้เห็นว่าฉันไม่จำเป็นต้องมี parens


คุณแน่ใจหรือว่าต้องการวงเล็บ ฉันคิดว่าคุณสามารถตัดทอนไบต์ด้วยการปล่อยสิบและมีช่องว่างระหว่าง p และ * ฉันกำลังตรวจสอบตอนนี้ แก้ไข: ทดสอบและ AFAICT แล้วใช้งานได้
Nic Hartley

ฮ่ามันขอบคุณ ฉันได้รับการทดสอบในอินสแตนซ์ของ irb ที่ฉันได้รับมอบหมายpในบางจุดซึ่งอันที่จริงแล้วการแยกวิเคราะห์ไวยากรณ์สำหรับเวอร์ชันนั้น
ชำนาญวิชาประวัติศาสตร์

6

R, 30 29 ไบต์

cat((s=sample)(69,5),s(26,1))

sampleฟังก์ชั่นดำเนินการสุ่มตัวอย่างแบบง่ายจากการป้อนข้อมูล ถ้าจำนวนเต็มเดียวได้รับเป็นอาร์กิวเมนต์แรกการสุ่มตัวอย่างจะทำจาก 1 ถึงอาร์กิวเมนต์ ขนาดตัวอย่างคืออาร์กิวเมนต์ที่สอง เราใช้ตัวเลือกเริ่มต้นของการสุ่มตัวอย่างโดยไม่มีการแทนที่

ลองออนไลน์


คุณสามารถบันทึกทั้งสองไบต์ได้โดยใช้cแทนcat
Dean MacGregor

@DeanMacGregor ขอบคุณสำหรับคำแนะนำ แต่การส่งที่นี่ต้องเป็นโปรแกรมเต็มรูปแบบที่เขียนถึง STDOUT หรือฟังก์ชั่นที่ส่งคืนค่า ในกรณีนี้ฉันเลือกที่จะเป็นอดีต ถ้าฉันจะใช้cนี่จะเป็นตัวอย่างเท่านั้นซึ่งไม่ได้รับอนุญาตโดยค่าเริ่มต้น
Alex A.

อ่าฉันเข้าใจแล้ว ฉันไม่ใช่นักกอล์ฟตัวยงดังนั้นฉันจึงไม่คุ้นเคยกับสิ่งนั้น
Dean MacGregor

@DeanMacGregor ไม่มีปัญหา ขอบคุณสำหรับคำแนะนำต่อไป :)
อเล็กซ์ A.

6

Python 3.5, 63 ไบต์

from random import*
print(*sample(range(1,70),5),randint(1,26))

มันเป็นพื้นฐานการดำเนินการอ้างอิงกอล์ฟ โปรดทราบว่า 3.5 เป็นสิ่งที่จำเป็นในการทำเครื่องหมายในอาร์กิวเมนต์ที่ไม่ใช่ครั้งสุดท้าย


6

ระดับเสียงคู่35 35ไบต์

งานอดิเรกของ Calvin ยืนยันว่าใช้ได้ans =เมื่อใช้ฟังก์ชั่นดังนั้น:

@()[randperm(69)(1:5),randi(26)]

มันมีความคล้ายคลึงกับคำตอบของ Memming แต่ใช้การทำดัชนีโดยตรงที่เป็นไปได้ใน Octave เท่านั้นและสั้นกว่า5 7 ไบต์ดังนั้นฉันจึงคิดว่ามันคุ้มค่าที่จะโพสต์อยู่ดี

randperm(69)สร้างรายการด้วยการเปลี่ยนลำดับแบบสุ่มของตัวเลข 1-69 มันเป็นไปได้ที่จะโดยตรงดัชนีรายการ (ไม่ได้ใน MATLAB) เพื่อจะได้รับ 5 (1;5)อันดับแรกเช่นนี้ รายการจะตามด้วยการrandi(26)ส่งคืนหมายเลขเดียวระหว่าง 1 ถึง 26

เก่า:

disp([randperm(69)(1:5),randi(26)])

dispรายการส่งผลให้มีการแสดงโดยใช้


6

PowerShell v2 +, 31 27 ไบต์

1..69|Random -c 5;Random 27

ต้องการเวอร์ชัน 2 หรือใหม่กว่าเนื่องจากGet-Randomไม่มีอยู่ใน v1 ( Get-โดยนัยและ-Maximumเป็นตำแหน่ง) เอาท์พุทคั่นบรรทัดใหม่

Ungolfed:

Get-Random -InputObject (1..69) -Count 5
Get-Random -Maximum 27

Random -ma 27ก็สามารถจะRandom 27เป็น-Maximumจะถูกจับคู่โดยตำแหน่ง 0
แมตต์

@ Matt ขอบคุณ - ฉันลืมไปแล้ว
AdmBorkBork


4

MATLAB, 40

x=randperm(69);disp([x(1:5) randi(26)])

ฉันรู้ว่า. มันเป็นทางออกที่น่าเบื่อ


4

PHP, 69 ไบต์

<?foreach(array_rand(range(1,69),5)as$k)echo$k+1," ";echo rand(1,26);

คำตอบที่ตรงไปตรงมาสวย สร้าง 1-69 rangeจากนั้นใช้array_randเพื่อคว้า 5 ปุ่มสุ่มจากอาร์เรย์และสะท้อน$k+1ค่า (ดัชนี 0) จากนั้นสะท้อน int สุ่มจาก 1-26


4

C #, 153 ไบต์ 140 ไบต์

ขอบคุณที่ "McKay":

string.Join(" ",Enumerable.Range(1,69).OrderBy(e=>Guid.NewGuid()).Take(5).Concat(Enumerable.Range(1,26).OrderBy(e=>Guid.NewGuid()).Take(1)))

โซลูชั่น 153 ไบต์:

string.Join(" ",Enumerable.Range(1,69).OrderBy(e=>Guid.NewGuid()).Take(5))+" "+string.Join(" ",Enumerable.Range(1,26).OrderBy(e=>Guid.NewGuid()).Take(1))

วิธีง่ายๆในการใช้ Linq และการสับโดยใช้ GUID


1
ไม่จำเป็นต้องใช้สตริงเข้าร่วมในส่วนหมายเลขลอตเตอรี่และคุณสามารถบันทึกไบต์ทั้งแคชคำสั่งโดยผู้รับมอบสิทธิ์หรืออีกมากมายโดยใช้การสุ่มสำหรับหมายเลขลอตเตอรี่
pinkfloydx33

และถ้าคุณต่อเนื่องลำดับแทนการต่อสายคุณไม่จำเป็นต้องระบุช่องว่าง 3 ครั้งก็จะมีประสิทธิภาพมากขึ้นเช่นกัน เช่นstring.Join(" ", ....take(5).Concat(....Take(1)))
แมคเคย์

4

Pyth - 13 14 13 ไบต์

การเล่นกอล์ฟที่สำคัญเป็นไปได้นี่เป็นเพียง FGITW

jb>5.SS69hO26

ลองมันออนไลน์ได้ที่นี่


คุณสามารถอธิบายรหัสเพื่อให้สามารถตรวจสอบได้ว่ามันเหมือนกันจริงหรือ
Masclins

คุณสามารถเปลี่ยนไป<... 5 >5...รหัสสุดท้ายjb>5.SS69hO26
Blue

2

Brachylogขนาด 40 ไบต์

1:5e,68{I`random(I)+1=Z`Z=w,"
"w}\;25:1&

คำอธิบาย

Brachylog ไม่ได้มีในตัวสำหรับตัวเลขแบบสุ่ม (ยัง ... ) ดังนั้นเราจึงต้องใช้กริยา random/1SWI-เปิดฉากที่: เราสามารถป้อนรหัส SWI-Prolog ใน Brachylog โดยใช้ backquotes

1:5e,                             \  § Enumerate from 1 to 5 using \ (backtrack), which
                                     § evaluates to false and thus constructs a loop

     68{                         }   § Declare sub-predicate 1 and call it with 68 as input

        I`random(I)+1=Z`             § Z is the arithmetic expression 'random(I) + 1' where
                                     § I is the input of the sub-predicate

                        Z=w,         § Evaluate Z and write it
                            "\n"w    § Write a new line

;                                    § Else (we will reach this after the 5th iteration of
                                     § the enumeration, since \ is always false)

25:1&                                § Call the sub-predicate 1 with 25 as input

2

JavaScript (ES6), 106 86 84 ไบต์

F=(s=new Set,r=Math.random)=>s.size<5?F(s.add(r()*69+1|0)):[...s,r()*26|0+1].join` `

เนื่องจากเราไม่สามารถสุ่มตัวอย่าง randoms ใน JavaScript ได้อย่างไม่ซ้ำใครงานนี้ทำได้โดยการสร้าง Set (ซึ่งเก็บค่าที่ไม่ซ้ำกัน) ซ้ำเพิ่ม randoms (1-69) ซ้ำจนกว่าจะมี 5 อันที่ไม่ซ้ำกันผนวกหมายเลขสุ่ม (1-26) จากนั้นเข้าร่วมและคืนมันออกมาทั้งหมด


2

Elixir , 83 Bytes

Enum.reduce Enum.take_random(1..69,5)++[Enum.random(1..26)],fn(x,a)->"#{a} #{x}"end

เมื่อIO.putsใช้อาร์เรย์ของจำนวนเต็ม Elixir จะแปลจำนวนเต็มเป็นอักขระดังนั้นจึงส่งออกสตริงแทนตัวเลขลอตเตอรี่ที่ต้องการ ดังนั้นเราต้องลดจำนวนเต็มลงไปเป็นสตริง


2

Ruby, 47 43 39 ไบต์

puts *(1..69).to_a.sample(5),rand(26)+1

ฉันคิดว่ามันสามารถตีกอล์ฟได้มากกว่านี้ แต่ฉันจะทำอย่างนั้นเมื่อฉันได้ชื่นชมว่ารหัสนี้มีลักษณะอย่างไร

มันใช้งานได้ดีเช่นเดียวกับทุกอย่างอื่น: ใช้อาร์เรย์ของตัวเลข 1 ถึง 69 สลับสับเปลี่ยนรับห้าอันดับแรกเอาท์พุทเหล่านั้นออกแล้วส่งตัวเลขสุ่มระหว่าง 1 ถึง 26

ฉันผ่านการทำซ้ำสองสามครั้งก่อนโพสต์:

puts (1..69).to_a.shuffle.first(5).join(' ')+" #{rand(26)+1}"  #61
puts (1..69).to_a.shuffle[0..5].join(' ')+" #{rand(26)+1}"     #58
puts (1..69).to_a.shuffle[0..5].join('<newline>'),rand(26)+1   #52
puts *('1'..'69').to_a.shuffle[0..5],rand(26)+1                #47
puts *('1'..'69').to_a.sample(5),rand(26)+1                    #43

(โดย<newline>แทนที่ด้วยบรรทัดใหม่จริง)

แก้ไข: อ๊ะไม่เห็นคำตอบทับทิมที่มีมาก่อน ฉันสะดุดsampleและเลื่อนลงเพื่อแก้ไขคำตอบของฉัน แต่แล้วฉันก็เห็น ... คะแนนสุดท้ายของฉันคือ 43 ไบต์ แต่ฉันจะเล่นกอล์ฟต่อไปเล็กน้อยเพื่อดูว่าฉันทำได้ดีแค่ไหน


2

Mathematica, 64 ไบต์

StringRiffle@Append[Range@69~RandomSample~5,RandomInteger@25+1]&

ค่อนข้างง่าย


เอาต์พุตมีเครื่องหมายวงเล็บและเครื่องหมายจุลภาค
ชาร์ลส์

-1 ไม่ถูกต้องเนื่องจากเหตุผลด้านบน
CalculatorFeline

StringJoin=""<>##&
CalculatorFeline

@CatsAreFluffy แก้ไขจริงในเวลานี้ เพียงผสมฟังก์ชั่นของฉัน ...
LegionMammal978

ฉันคิดว่าคุณสามารถย่อให้สั้นลงได้ถ้าคุณใช้ Range / RandomSample และเปลี่ยนให้มากกว่าสองรายการแทนที่จะใช้ RandomInteger บางอย่างเช่น RandomSample [ช่วง [# 1], # 2] & @@@ {{69,5}, {26,1}}]
Xanderhall

1

Perl 5, 59 ไบต์

{say for(sort{-1+2*int rand 2}1..69)[0..5];say$==1+rand 25}

มันเป็นรูทีนย่อย ใช้เป็น:

perl -M5.010 -e'sub f{...}f'

คุณสามารถใช้-Eแทน-M5.010 -e
andlrc

ลาดเทคุณสามารถแทนที่-1+2*int rand 2ด้วยrand>.5?1:-1?
andlrc

และคุณไม่ควรที่จะประหยัดอีกสองสามอย่างด้วยการแทนที่;say$==ด้วย,$==
andlrc

@ dev-null ขอบคุณ! -M5.010ไม่นับอยู่แล้วดังนั้นผมจึงไม่ได้รำคาญย่อมัน ฉันคิดว่าฉันลองใช้เครื่องหมายจุลภาคแทนอีกอันหนึ่งsayแต่มันก็ใช้ไม่ได้ แต่กฎการจัดเรียงใหม่เป็นความคิดที่ดีขอบคุณ ฉันจะทดสอบเมื่อฉันมีโอกาสและแก้ไขมัน
msh210

1

PHP, 65 ไบต์

<?=join(' ',array_rand(array_flip(range(1,69)),5))." ".rand()%26;

ขอบคุณคำตอบ PHP อื่น ๆ ในหน้านี้ ฉันเขียนโปรแกรมด้วยตัวเองและกลายเป็นคำตอบเดียวกับที่เขียนโดย Samsquanch ซึ่งทำให้ฉันก้าวต่อไปอีกขั้นเพื่อประหยัดสองสามไบต์

หากทุกคนสามารถหาวิธีที่จะผนวกอาร์เรย์หนึ่งไปยังอีกแถวหนึ่งในที่นี่ซึ่งน้อยกว่า 5 ไบต์มันทำให้ฉันเข้าร่วมหมายเลขลอตเตอรี่เมื่อฉันอยากจะขอบคุณมากเพราะมันทำให้ฉันบ้า! สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือหลังจากarray_randและก่อนหน้าjoinนี้โดยมีคำสั่งบางอย่างที่เหมือน+[5=>rand()%25]กัน แต่นั่นเป็นไบต์พิเศษมากกว่าเพียงแค่เชื่อมต่อกันหลังจากนั้น

<?=                                                              // This represents an inline 'echo' statement
                                  range(1,69)                    // Get an array of all numbers from 1 to 69 inclusive
                       array_flip(           )                   // Swap the keys and values.
            array_rand(                       ,5)                // Get a random subset of five keys.
   join(' ',                                     ).rand()%26     // Concatenate the array with spaces, along with the powerball number

เรียกใช้ผ่านบรรทัดคำสั่ง ตัวอย่าง:

C:\(filepath)>php powerball.php

เอาท์พุท:

 12 24 33 67 69 4

1

PARI / GP, 71 70 ไบต์

apply(n->print(n),numtoperm(69,random(69!))[1..5]);print(random(26)+1)

มันสร้างการเปลี่ยนแปลงแบบสุ่มของ [1..69] จากนั้นใช้เวลา 5 ครั้งแรก

โชคไม่ดีที่นี่เป็นผู้ใช้ที่ไม่มีประสิทธิภาพของการสุ่มโดยมีค่าเฉลี่ย 87 ไบต์ของเอนโทรปีเมื่อเปรียบเทียบกับอุดมคติของข้อมูล - ทฤษฎี 3.5 นี่เป็นสาเหตุหลักเนื่องจากการเปลี่ยนแปลงทั้งหมดถูกสร้างขึ้นแทนที่จะเป็นสมาชิก 5 คนแรกเท่านั้นและยังเป็นเพราะการสั่งซื้อ perms (เสีย lg 5! = ~ 7 บิต) เพิ่มเติมrandomใช้กลยุทธ์การปฏิเสธมากกว่าการใช้การเข้ารหัสทางคณิตศาสตร์ (นี่เป็นเพราะ PARI ใช้ xorgen ของเบรนต์ซึ่งเร็วพอที่ค่าใช้จ่ายจากกลยุทธ์ที่ซับซ้อนมากขึ้นไม่ค่อยคุ้มค่า)

มีการเปลี่ยนแปลง 'ชัดเจน' สามรายการซึ่งไม่ทำงานภายใต้ gp รุ่นปัจจุบัน (2.8.0) randomและprintสามารถเก็บไว้ในตัวแปรและprintสามารถเรียกได้โดยตรงมากกว่าผ่าน->ฟังก์ชั่นนิรนาม:

r=random;apply(p=print,numtoperm(69,r(69!))[1..5]);p(r(26)+1)

ร่วมกันสิ่งเหล่านี้จะประหยัด 9 ไบต์ น่าเสียดายที่ฟังก์ชันทั้งสองนั้นใช้งานได้โดยไม่มีข้อโต้แย้งและด้วยเหตุนี้จึงมีการประเมินผลทันทีแทนที่จะเก็บไว้ดังนั้นสิ่งเหล่านี้จึงไม่คำนวณผลลัพธ์ที่ต้องการ


0

รหัสเครื่อง Intel x86 ขนาด 85 ไบต์

¿I ±‰ø1Ò»E ÷óB‰Ðè+ ‰þÑç÷ƒÇþÉ„Éuâ‰ø1Ò» ÷óB‰Ðè
 0ä͸ ͱëÆÔ
00†Äˆã´ÍˆØÍ° ÍÃ

บางครั้งมันก็พิมพ์ตัวเลขเดียวกันถ้าใช่ลองอีกครั้งโดยกดปุ่ม

รวบรวมกับ:

nasm file.asm -o file.bin

ตรวจสอบให้แน่ใจว่าได้ปรับให้เป็นขนาดฟลอปปี้ (เพิ่มศูนย์ท้าย) เพื่อติดตั้งกับ vm (ไม่จำเป็นต้องใช้ระบบปฏิบัติการใด ๆ )

ถอดชิ้นส่วน:

BITS 16
ORG 0x7c00

mov di,73 ;starting seed
mov cl,5 ;we need five numbers

loop:

mov ax,di

xor dx,dx
mov bx,69
div bx
inc dx
mov ax,dx

call print_rnd_number

mov si,di
shl di,1
add di,si
add di,7

dec cl

test cl,cl
jne loop

mov ax,di

xor dx,dx
mov bx,26
div bx
inc dx
mov ax,dx

call print_rnd_number

xor ah,ah
int 0x16
mov ax,0x0002
int 0x10
mov cl,5
jmp loop

print_rnd_number:
aam
add ax,0x3030
xchg al,ah
mov bl,ah
mov ah,0x0E
int 0x10
mov al,bl
int 0x10
mov al,' '
int 0x10
ret

6
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! การดูรหัสเครื่องนั้นน่าประทับใจอยู่เสมอ แต่ถ้าพิมพ์ตัวเลขซ้ำหลายครั้งฉันกลัวว่าการส่งของคุณจะไม่ถูกต้อง
Dennis

1
ใช่มันเป็น แต่ฉันเพียงแค่อยากจะแบ่งปันนี้ :)
ByteBit

2
ฉันเข้าใจ แต่เมื่อเร็ว ๆ นี้เราได้พูดถึงเรื่องนี้และความเห็นร่วมของชุมชนก็คือคำตอบที่ไม่ถูกต้องควรได้รับการแก้ไขหรือลบออก
Dennis

ฉันจะยกเลิกการลงคะแนนเสียงหากคุณแก้ไข โปรด ping ฉัน
lirtosiast

0

C, 142 ไบต์

i,x[6],n;main(j){for(srand(time(0));i<6;n-i?0:printf("%d ",x[i]),i++)for(x[n=j=i]=(69-i/5*43)*(rand()/2147483647.)+1;i<6&&j--;)i-=x[i]==x[j];}

ไม่มีความสุขมากกับโซลูชันนี้เพราะรู้สึกว่าควรมีโอกาสตีกอล์ฟมากขึ้น ฉันจะดูอีกครั้งในวันพรุ่งนี้ด้วยดวงตาที่สดใส ลองมันนี่


0

สวิฟท์, 165 ไบต์

import UIKit;var a=[Int]();for i in 0...5{func z()->Int{return Int(arc4random_uniform(i<5 ?68:25)+1)};var n=z();while i<5&&a.contains(n){n=z()};a.append(n);print(n)}

สามารถวิ่งได้อย่างรวดเร็วใน Xcode Playground

แก้ไข:ปัญหาปัจจุบันที่นี่คือมันเป็นไปได้ในทางทฤษฎีสำหรับสิ่งนี้ที่จะทำงานตลอดไปในขณะที่ลูปถ้า arc4random_uniform ยังคงดึงหมายเลขเดียวกัน อัตราต่อรองที่เกิดขึ้นในช่วงระยะเวลาที่สำคัญอาจจะดีกว่าอัตราต่อรองในการชนะ Powerball


มันรับประกันได้อย่างไรว่าจะไม่มีค่าซ้ำกัน
supercat

@supercat มันไม่ได้มาก่อน แต่ตอนนี้มันทำ
timgcarlson

0

Perl 6 ,  32   31 ไบต์

# space is necessary so that the parens denote a list
# rather than being part of the call to `put`
put (pick(5,1..69),(1..26).pick) # 32 bytes
# 25 35 57 67 62 24␤

เปลี่ยนเป็นฟังก์ชั่นที่ส่งคืนสตริงฉันสามารถลบ 4 ไบต์ ( put␠) ในขณะที่เพิ่มเพียง 3 ( {~ })

{~(pick(5,1..69),(1..26).pick)} # 31 bytes

การใช้งาน:

say {...}().perl; # use .perl to prove it returns a string
# "25 35 57 67 62 24"

หากฟังก์ชั่นได้รับอนุญาตให้ส่งกลับรายการค่าต่อไปนี้จะใช้งานได้

(ไม่เช่นนั้นจะเหมือนกับด้านบน แต่ภายใน{ })

  • ฟังก์ชั่นที่ส่งกลับรายการเดี่ยว

    {|pick(5,1..69),(1..26).pick} # 29 bytes
    # (25,35,57,67,62,24)
  • ฟังก์ชั่นที่ส่งกลับรายการที่มี 5 หมายเลขแรกในรายการย่อย

    {pick(5,1..69),(1..26).pick} # 28 bytes
    # ((25,35,57,67,62),24)
  • ฟังก์ชั่นที่ส่งกลับรายการที่มี 5 รายการแรกในรายการย่อยและ Powerball ในรายการย่อยอื่น

    {pick(5,1..69),pick 1,1..26} # 28 bytes
    # ((25,35,57,67,62),(24,))

0

อย่างจริงจัง 35 ไบต์

ความพยายามครั้งแรกของฉันที่คำตอบในภาษากอล์ฟ

รู้สึกนานกว่าที่ควรจะเป็น
การทำซ้ำอาจถูกลบด้วยWแต่ดูเหมือนว่าจะถูกทำลายในล่ามออนไลน์และฉันไม่ต้องการโพสต์รหัสที่ยังไม่ทดลอง

แย่มาก{ใช้งานไม่ได้กับรายการ

รหัส:

:70:1xi J{. J{. J{. J{. J{.:26:Ju.

การถ่ายโอนข้อมูล Hex:

3a37303a317869204a7b2e204a7b2e204a7b2e204a7b2e204a7b2e3a32363a4a752e7f

คำอธิบาย:

:70:1x                       # Push a list of the numbers 1-69
i                            # Explode list
 J{.                         # rotate stack random(len(stack)) times and pop/print
 J{. J{. J{. J{.             # same thing 4 more times
:26:Ju.                      # print random number in 1-26
                             # (7F) unprintable, terminate without explicit printing

ล่ามออนไลน์


0

Lua, 96 ไบต์

วิธีแก้ปัญหาอย่างง่ายโดยใช้ตารางเป็นชุดโดยการใส่ค่าลงในตารางtable[value]=truthy/falsyเพื่อให้สามารถตรวจสอบว่าอยู่ภายในหรือไม่

ฉันสูญเสีย 5 ไบต์เพราะฉันต้องตั้งค่าแรกของตารางของฉันมิฉะนั้นฉันจะไม่เข้าไปในwhile(o[n])วงและจะเอาท์พุทnก่อนที่จะใช้ฟังก์ชั่นแบบสุ่ม ในฐานะที่เป็น Lua ใช้ตารางที่ 1 ตามที่ฉันยังมีการบังคับให้ใส่ค่าแรกของเซลล์มิฉะนั้นผมไม่สามารถเอาท์พุท[0]1

m,n,o=math.random,0,{[0]=0}for i=1,5 do while(o[n])do n=m(69)end o[n]=0 print(n)end print(m(26))

Ungolfed:

m,n,o=math.random,0,{[0]=0}
for i=1,5
do
  while(o[n])
  do
    n=m(69)
  end
  o[n]=0
  print(n)
end
print(m(26))

0

C ++, 252 ไบต์

แข็งแรงเล่นกอล์ฟ:

#include<iostream>
#include <random>

int main(){std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1,69);for(int c=0;c<=5;c++){std::cout<<dis(gen)<<" ";}int x=dis(gen);while(x>26||x<1){x=dis(gen);}std::cout<<x;return 0;}

Ungolfed:

#include<iostream>
#include <random>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 69);
    for(int c = 0; c <= 5; c++){
        std::cout<<dis(gen)<<" ";
    }
    int x = dis(gen);
    while (x > 26 || x < 1){
        x = dis(gen);
    }
    std::cout<<x;
    return 0;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.