สุ่มจนถึง 0


29

ท้าทาย

โพสต์ Sandbox

กำหนดจำนวนเต็มบวก(K)เอาท์พุทเป็นจำนวนเต็มสม่ำเสมอสุ่มระหว่าง(Y)[0, K)

ถ้าY > 0สมมติและทำซ้ำขั้นตอนจนกว่าK = YY = 0

กฎระเบียบ

  • ต้องป้อนข้อมูลในตอนแรก
  • รูปแบบผลลัพธ์ตามที่คุณต้องการ
  • โปรแกรมของคุณจะต้องเสร็จสิ้น
  • 0 ต้องเป็นผลลัพธ์สุดท้ายเลือกที่จะเป็นบรรทัดว่างแทน 0

ถ้าการส่งเป็นฟังก์ชันมันจะคืนค่า 0 นอกเหนือจากการพิมพ์หรือไม่?
อดัม

1
@ Adámใช่คุณสามารถกลับมาได้
Luis felipe De jesus Munoz

ฉันจำเป็นต้องเพาะเมล็ด RNG ของฉันหรือไม่?
SIGSTACKFAULT

เราจะพิมพ์โดยไม่มีตัวคั่นได้ไหม
Titus

ฉันอยากรู้ มันเป็นเรื่องง่ายมากที่จะพิสูจน์ว่าค่าเฉลี่ยของจำนวนขั้นตอนโปรแกรมนี้จะใช้เวลาก่อนที่จะยุติการเป็น H (K-1) + 1 ที่ H (K) เป็น K'th จำนวนฮาร์โมนิ สำหรับ n = 1,000 นั่นคือ 8.484 ขั้นตอนโดยเฉลี่ย
J.Doe

คำตอบ:


19

Pyth , 6 5 4 ไบต์

.uOW

ลองที่นี่!

มันทำงานอย่างไร

.uOW โปรแกรมเต็มรูปแบบ รับจำนวนเต็มจาก STDIN และส่งออกรายการไปยัง STDOUT
.u จุดคงที่สะสม ใช้ฟังก์ชันที่กำหนดด้วยค่าเริ่มต้นที่กำหนด
        ซึ่งกำหนดให้กับอินพุตโดยปริยายจนกระทั่งผลลัพธ์ที่เกิดขึ้น 
        ก่อนพบ ส่งคืนรายการผลลัพธ์ระดับกลาง
   แอปพลิเคชันแบบมีเงื่อนไข ถ้าอาร์กิวเมนต์ (ค่าปัจจุบัน) เป็นจริงแล้ว
        ใช้ฟังก์ชั่นด้านล่างมิฉะนั้นปล่อยให้มันไม่เปลี่ยนแปลง
  O จำนวนเต็มแบบสุ่มในช่วง [0, N)
        IOW: ในแต่ละการวนซ้ำของ. u กำหนดตัวแปร N ให้กับค่าปัจจุบันเริ่มต้น
        ด้วยอินพุต ถ้า N ไม่ใช่ 0 ให้เลือกจำนวนเต็มแบบสุ่มใน [0, N) หรืออื่น ๆ
        return N ไม่เปลี่ยนแปลง เมื่อใดก็ตามที่เราพบ 0 การทำซ้ำครั้งต่อไปจะต้อง
        ส่งผลให้เป็น 0 และดังนั้นวงหยุดที่นั่น

1
ฉันเห็นวิธีการทำเช่นนี้ใน Pyth แต่ฉันเป็นมือใหม่ เคารพ. ภาษาของเดือนสิงหาคมอาจจะ?
ElPedro

15

C (gcc) , 42 ไบต์

f(_){printf("%d\n",_);(_=rand()%_)&&f(_);}

ลองออนไลน์!

ใช้ตรรกะแบบลัดวงจรและ

f(_){                 // f(int _) {
    printf("%d\n",_); // print argument and a newline
    (_=rand()%_)      // set _ to rand()%_
    &&f(_);}          // short-circuit AND to recursively call f if _ not zero

C (gcc) , 40 ไบต์ (โดยไม่มีค่าเริ่มต้นการพิมพ์)

f(_){printf("%d\n",_=rand()%_);_&&f(_);}

ลองออนไลน์!

ใช้ตรรกะแบบลัดวงจรและ

f(_){              // f(int _) {
    printf("%d\n", // print an integer and a newline 
    _=             // The integer is _ which we set to...
    rand()%_);     // a random value modulo the input _
    _&&f(_);}      // short-circuit AND to recursively call f if _ not zero

4
rand()%_ไม่เหมือนกัน
njzk2

(หากคุณไม่มั่นใจให้ลองใช้ลูกเต๋า 6 ด้านเพื่อสร้างค่า [1,5] โดยใช้วิธีนี้)
njzk2

3
ฉันรู้อยู่เต็มอกว่า rand () เกือบจะลำเอียงเสมอ (เนื่องจากการตัด) แต่มาตรฐานไม่ได้รับประกัน (ในทางทฤษฎี RAND_MAX อาจเป็นตัวเลขจำนวนมากของเราทั้งหมดโดยโชค: P แม้ว่าโดยทั่วไปแล้วจะเป็น ~ 65k ) ในทางปฏิบัติสำหรับช่วงที่เรากำลังเผชิญกับมันจะปรากฏแบบสุ่มพอที่จะไม่โดดเด่นเทียบกับการส่งที่คล้ายกันในการท้าทายนี้
LambdaBeta

1
มาจากความท้าทาย "เอาท์พุทเป็นจำนวนเต็มแบบสุ่ม" ดังนั้นอย่างเคร่งครัดพูดนี้ไม่ถูกต้อง
njzk2

3
การพูดภาษาทั้งหมดอย่างเคร่งครัดที่นี่ใช้ prng ไม่มีใครที่จะให้หมายเลขสุ่มที่เหมือนกัน (ซึ่งจะต้องมีแหล่งที่มาที่สมบูรณ์แบบของเอนโทรปี) ในขณะที่หลายคนมีความเหมือนกันมากกว่านี้ แต่ก็ไม่สามารถสังเกตเห็นได้ในการทำซ้ำ log (k)
LambdaBeta

10

R , 66 60 56 43 41 ไบต์

function(n)while(print(n))n=sample(n,1)-1

ลองออนไลน์!


ฉันไม่คิดว่าคุณต้องการ>0และcat(n,"")(สตริงว่าง) จะทำงานเช่นกัน
จูเซปเป้

แต่ฉันคิดว่าprintมันมีประสิทธิภาพมากกว่าที่นี่เนื่องจากมันคืนค่าอาร์กิวเมนต์: 56 ไบต์
Giuseppe

ขนาด 56 ไบต์:k=scan();while(x<-sample(1:k-1,1))k=c(x,k);cat(rev(k),0)
JAD

1
ฉันลืมลบเครื่องหมายปีกกาเพื่อให้คุณสามารถบันทึกเพิ่มเติม 2 ไบต์;) ลองออนไลน์!
digEmAll

2
39 ไบต์:n=scan();while(print(n))n=sample(n,1)-1
djhurio


6

Pepe , 25 ไบต์

Pepe เป็นภาษาโปรแกรมที่ทำโดยผู้ใช้Soaku

REeErEErReEEreeEREEeEEree 

ลองออนไลน์!

คำอธิบาย:

REeErEErReEEreeEREEeEEree # full program

REeE                      # input as num, in stack 1
    rEE                   # create loop in stack 2 with name 0
       rReEE              # - output and preserve the number in stack 1
            reeE          # - output a newline "\n"
                REEeEE    # - random number by 0 to input
                      ree # goto loop with name 0 if stack 1 is not equal
                            to stack 2

5

Perl 6 , 18 ไบต์

{$_,(^*).pick...0}

ลองออนไลน์!

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

{^$_,^*.pick...0}

สำหรับ 17 ไบต์ ฟังก์ชั่นอื่นที่สร้างขึ้นแบบสุ่มrollมีพฤติกรรมที่เหมือนกันในอินสแตนซ์นี้สำหรับจำนวนไบต์ที่เท่ากัน



5

เยลลี่ ,  4  3 ไบต์

XƬ0

นี้เป็นลิงค์เอก (ฟังก์ชั่น) ที่พิมพ์อาร์เรย์และผลตอบแทน0

ลองออนไลน์!

มันทำงานอย่างไร

XƬ0  Monadic link. Argument: n

XƬ   Pseudo-randomly pick (X) an integer k in [1, ..., n], set n = k, and repeat.
     Do this 'til (Ƭ) the results are no longer unique and return the array of
     unique results, including the initial value of n.
     This stops once X returns k with argument k. The second k will be omitted
     from the return value.
  0  Print the resulting array and set the return value to 0.

นัดหยุดงานที่ดีมากของ 4!
ngm

1
เราไม่อยากตัดกัน 4 เพื่อให้เหมือนปกติ 4 ใช่ไหม?
Dennis

4

Brachylogขนาด 8 ไบต์

ẉ?ℕ₁-₁ṙ↰

ลองออนไลน์!

คำอธิบาย

ẉ          Write the input followed by a linebreak
 ?ℕ₁       The input must be in [1, …, +∞)
    -₁ṙ    Generate an integer in [0, …, input - 1] uniformly at random
       ↰   Recursive call with that random integer as the new input

เรียกซ้ำตัวเองจะหยุดทันทีที่ล้มเหลวนั่นคือเมื่อเข้าเป็น?ℕ₁0



4

J, 13 ไบต์

[:}:? ::]^:a:

บนรถไฟใต้ดินขอโทษด้วยที่ไม่มี TIO (หวังว่าจะไม่มีการแก้ไขให้ถูกต้อง)

ส่งออกรายการค่า

สันนิษฐานว่าวิธี APL จะสั้นลง แต่นี่คือสิ่งที่ฉันคิด

มันทำงานอย่างไร

^:a: ใช้ซ้ำ ๆ จนกระทั่งบรรจบกันจัดเก็บผลลัพธ์ระดับกลางในอาร์เรย์

?จำนวนเต็มแบบสุ่มในช่วง[0, K)สำหรับKมากกว่า 0 สำหรับ 0, (0,1)มันให้เป็นจำนวนเต็มสุ่มในช่วง สำหรับหมายเลขจุดลอยตัวมันผิดพลาด

::]ตรวจจับข้อผิดพลาดสำหรับอินพุต?และแทนที่จะเป็นข้อผิดพลาดเอาท์พุทอินพุตที่ทำให้เกิดข้อผิดพลาด

}: กำจัดค่าสุดท้ายในอาร์เรย์ (นี่คือเพื่อไม่ให้มีการส่งออกเลขทศนิยม)

ลองออนไลน์!


มันเป็นเพียงฉันหรือรหัสส่งกลับผลลัพธ์เดียวกันหรือไม่
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz คนที่รู้จัก J ดีกว่าฉันอาจจะสามารถอธิบายได้ แต่ฉันคิดว่า RNG เริ่มต้นด้วยเมล็ดเดียวกันเสมอ นอกจากนี้ยังมีเมล็ดพืชที่ตายตัว?.แต่ฉันไม่คิดว่าฉันใช้สิ่งนั้น
โคล

@ โคลคุณถูกต้อง
Jonah

4

JavaScript (ES6), 38 37 ไบต์

-1 ไบต์ขอบคุณ @Arnauld

f=n=>[n,...n?f(Math.random()*n|0):[]]


คุณสามารถลดคณิตศาสตร์ได้ทั้งหมดหรือไม่ เช่นกับcodegolf.stackexchange.com/a/35648/67066
Marie

1
@Marie ใช้new Date%nไม่ได้จริงๆทำงานที่นี่เพราะมันไม่ได้เปลี่ยนเร็วพอที่จะเป็นประโยชน์สำหรับการสร้างตัวเลขสุ่มหลาย
เฮอร์แมน L

4

C, 38 ไบต์

f(k){printf("%d ",k);k?f(rand()%k):0;}

ลองออนไลน์

Ungolfed

void f(int k){
    printf("%d ",k);
    if(k)
        f(rand()%k);
}

1
คุณสามารถบันทึกไบต์โดยแทนที่ตัวดำเนินการประกอบไปด้วย a &&; นอกจากนี้คุณอาจต้องการพิจารณาการเพาะ RNG ในmainฟังก์ชั่นของคุณ: ลองออนไลน์!
ErikF

1
คุณยังสามารถกำจัดสิ่งที่ประกอบไปด้วยกันทั้งหมดและยุติด้วยข้อผิดพลาด 34 bytes
Jo King

4

Pyth , 4 ไบต์

W
~O

ลองออนไลน์!

นี่เป็นพื้นฐานที่ใช้อัลกอริธึม:

QinputRepeat1.tempQ2.Qunif{0,Q1}3.Print(temp)Untiltemp=0

ในการแปล Pyth ให้เป็นอัลกอริทึมเราสามารถตรวจสอบความหมายของตัวละครแต่ละตัวได้เป็นส่วนใหญ่ เนื่องจาก Pyth ถูกเขียนด้วยสัญลักษณ์นำหน้า (เช่น* + 1 2 3คือ(1 + 2) * 3) เราสามารถเริ่มต้นจากด้านซ้ายและเติมอาร์กิวเมนต์ในขณะที่เราไป

Wเริ่มแบบดั้งเดิมขณะที่วนซ้ำ คำสั่งแรกหลังจากที่มันเป็นเงื่อนไขวงและคำสั่งที่สองหลังจากที่มันเป็นร่างกายห่วง หากคำสั่งที่สองว่างเปล่ามันจะกลายเป็นไม่เลือก ขณะนี้ใช้งานได้เหมือนกับ Python ในขณะนั้นดังนั้นจะประเมินจำนวนเต็มที่ไม่เป็นศูนย์เป็น True และศูนย์เป็นเท็จ

คำสั่งแรกหลังจากในขณะที่เริ่มต้นด้วยตัวอักษรขึ้นบรรทัดใหม่ สิ่งนี้สอดคล้องกับฟังก์ชั่น "การพิมพ์และส่งคืนพร้อมกับการขึ้นบรรทัดใหม่" ของ Pyth ใช้เวลาหนึ่งอาร์กิวเมนต์ซึ่งจะถูกพิมพ์แล้วและส่งกลับยังไม่ได้แก้ไข สิ่งนี้ช่วยให้เราสามารถพิมพ์ขั้นตอนกลางในขณะที่ดำเนินการตามที่จำเป็น

ข้อโต้แย้งที่ส่งผ่านไปยังฟังก์ชั่นการพิมพ์นี้เริ่มต้นด้วย~ซึ่งเป็นบิตพิเศษ หากตัวละครทันทีหลังจาก~เป็นตัวแปรมันจะใช้เวลาสองข้อโต้แย้งมิฉะนั้นจะใช้เวลาหนึ่ง เนื่องจากOไม่ใช่ตัวแปร~จะใช้เพียงอาร์กิวเมนต์เดียวเท่านั้น ~ฟังก์ชั่นบิตเช่น+=ไม่อยู่ในภาษาเดิมหลายแม้ว่าผู้ประกอบการที่อยู่ใกล้ที่สุดจะเป็นผู้ประกอบการโพสต์เพิ่มขึ้นจาก++ Cคุณอาจจะรู้ว่าx++จะเป็นเช่นใช้xเป็นค่าในปัจจุบัน แต่หลังจากนั้นจะเป็นx เป็นความคิดที่เหมือนกัน แต่วางนัยกับสิ่งที่ผลลัพธ์ของการโต้แย้งครั้งแรกคือ วิธีเลือกตัวแปรที่จะกำหนดให้กับจะได้รับการแก้ไขในภายหลังx+1~

อาร์กิวเมนต์ของ~มีที่Oซึ่งเป็นเรื่องง่ายมาก เมื่ออาร์กิวเมนต์หนึ่งเป็นจำนวนเต็มOจะส่งกลับค่าจาก 0 ถึงหนึ่งน้อยกว่าจำนวนเต็มที่สุ่มกัน

ตอนนี้คุณอาจสังเกตเห็นว่าOไม่มีข้อโต้แย้ง นี่ Pyth Qล่ามเติมความกรุณาในการคาดเดาซึ่งที่นี่เป็นตัวแปร Qมีความหมายพิเศษใน Pyth: เมื่อใดก็ตามที่มีอยู่ในโปรแกรมโปรแกรม Pyth เริ่มต้นด้วยการกำหนดQให้กับอินพุตของโปรแกรม เนื่องจากนี่เป็นตัวแปรแรกที่เกิดขึ้นใน~อาร์กิวเมนต์ของQตอนนี้ก็เป็นตัวแปรที่~จะกำหนดค่าให้

สรุปโปรแกรม "ที่อ่านได้" ของเราอาจมีลักษณะดังนี้:

while print_and_return( assign_variable( Q, unif(0, Q-1) ) ):
    pass

และตัวอย่างหนึ่ง "การเรียกใช้ผ่าน" อาจมีลักษณะดังนี้:

  1. Q = 5
  2. Oผลตอบแทน 3, ~ผลตอบแทน 5, \nผลตอบแทนและพิมพ์ 5 ซึ่งเป็นความจริง
  3. Q = 3
  4. Oผลตอบแทน 0, ~ผลตอบแทน 3, \nผลตอบแทนและพิมพ์ 3 ซึ่งเป็นความจริง
  5. Q = 0
  6. Oส่งคืนสิ่งที่ไม่เกี่ยวข้อง~ส่งคืน 0 \nส่งคืนและพิมพ์ 0 ซึ่งเป็นเท็จ
  7. Q = สิ่งที่ไม่เกี่ยวข้อง
  8. ยุติ

3

APL (Dyalog Unicode)ขนาด12 9 ไบต์

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ ถือว่า⎕IO( I ndex O rigin) 0เป็นค่าเริ่มต้นในหลาย ๆ ระบบ ส่งคืนค่าสุดท้าย (0) นอกเหนือจากการพิมพ์ขณะเรียกใช้

{⌊?⎕←⍵}⍣=

ลองออนไลน์!

{}⍣= ใช้ฟังก์ชันต่อไปนี้จนกระทั่งเสถียร:

⎕←⍵ ส่งออกอาร์กิวเมนต์

? ส่งคืนตัวเลขสุ่มที่กระจายอย่างสม่ำเสมอในช่วง 0 ถึงนั้น -1

 ปัดเศษลง (เพราะ?0ให้ลอย (0,1))


3

C (gcc) , 40 42 ไบต์

idiot ™บางคนลืมพิมพ์ค่าเริ่มต้นก่อน

f(K){while(K)printf("%d\n",K,K=rand()%K);}

อย่าตกใจ


คุณผูกฉันคำถามก็ต้องให้คุณพิมพ์ตัวอักษรตัวแรกของ K ถ้าไม่มีฉันก็มี 40 ตัวคุณยังสามารถรับ 42 รุ่นที่เข้ากันได้อย่างสมบูรณ์ในทำนองเดียวกัน: f(K){while(K)printf("%d\n",K),K=rand()%K;}. คุณก็ยังได้ +1 ของฉันเพื่อหาทางออกที่เท่าเทียมกัน!
LambdaBeta

ดียิ่งขึ้น:f(K){while(K)printf("%d\n",K,K=rand()%K);}
SIGSTACKFAULT

3

x86 + rdrand, 19 ไบต์

การใช้งานที่ไม่ซับซ้อน ใช้เวลาในการป้อนข้อมูล K และผลการบัฟเฟอร์ในecxebx

0000000a <start>:
   a:   0f c7 f0                rdrand %eax
   d:   31 d2                   xor    %edx,%edx
   f:   f7 f1                   div    %ecx
  11:   89 13                   mov    %edx,(%ebx)
  13:   83 c3 04                add    $0x4,%ebx
  16:   89 d1                   mov    %edx,%ecx
  18:   85 c9                   test   %ecx,%ecx
  1a:   75 ee                   jne    a <start>
  1c:   c3                      ret  

3

Python 3 , 39 ไบต์

f=lambda k:print(k)or f(hash('.'*k)%k)

อาจไม่ใช่เครื่องสร้างตัวเลขสุ่มที่ปลอดภัยที่สุด แต่สำหรับสายตามนุษย์มันดูสุ่มพอ ...

ลองออนไลน์!


หมายเหตุ: 1) รายการให้ (โดยทั่วไป) ผลลัพธ์ที่แตกต่างกันทุกครั้งที่ทำงานในล่ามใหม่ แต่อาจให้ผลลัพธ์เดียวกันถ้าทำงานภายในเซสชันหลามเดียวกัน 2) ฉันถือว่าการยกเลิกข้อผิดพลาดโดยไม่ตรวจสอบอย่างชัดเจนk=0เป็นที่ยอมรับ
Luca Citi

ขออภัย แต่ฟังก์ชั่นจะต้องสามารถใช้ซ้ำได้โดยพลการในสภาพแวดล้อมเดียวกัน การยุติข้อผิดพลาดเป็นสิ่งที่ยอมรับได้
Jo King

งานต้องมีหมายเลขสุ่มที่สม่ำเสมอจากช่วงที่กำหนด hash() พยายามที่จะรักษา แต่ไม่รับประกันคุณสมบัตินี้ สำหรับภารกิจนั้นคุณควรใช้randomโมดูล
David Foerster

ด้วย 57 ไบต์เท่านั้นคุณสามารถแก้ไขวิธีแก้ปัญหาของคุณให้ใช้ตัวเลขสุ่มอย่างสม่ำเสมอจากrandom.randrange():from random import*;f=lambda k:print(k)or f(randrange(k))
David Foerster

3

TI-Basic (TI-84 Plus CE), 17 13 ไบต์

While Ans
Disp Ans
int(randAns
End
Ans

-4 bytes จากMisha Lavrov

จะเข้าในเป็นAns50:prgmNAME

TI-Basic เป็นภาษาโทเค็น โทเค็นทั้งหมดที่ใช้ที่นี่เป็นหนึ่งไบต์

คำอธิบาย:

While Ans    # 3 bytes, While the number we hold is not zero:
Disp Ans     # 3 bytes,   Display it on its own line
int(randAns  # 4 bytes,   and replace it with a number randomly
                        # chosen from 0 to one less than it (inclusive)
End          # 2 bytes, end While loop
Ans          # 1 byte,  Display (and return) zero

วิธีการแก้ปัญหา 11 ไบต์แนะนำโดย Misha Lavrov ที่ต้องกดenterหลังจากแต่ละบรรทัดตามลำดับแรก

Ans
While Ans
Pause int(randAns
End

1
int(Ansrandสั้นกว่า นอกจากนี้การใช้PauseแทนการDispที่คุณสามารถทำคำสั่งเฉพาะในวงเป็นซึ่งการปรับปรุงPause int(Ansrand Ans
Misha Lavrov

3

Python 2 , 64 62 60 ไบต์

from random import*
k=input()
while k:print k;k=randrange(k)

ลองออนไลน์!


ที่บันทึกไว้

  • -2 ไบต์ขอบคุณ Jonathan Allan

"การป้อนข้อมูลจะต้องพิมพ์ในตอนแรก" ... while 1:print k;k=randint(0,~-k)ควรจะทำงาน (มีข้อผิดพลาดในตอนท้าย)
Jonathan Allan

... แล้วwhile 1:print k;k=randrange(k)บันทึกสอง
Jonathan Allan

1
@JanathanAllan ขอบคุณ :) คำถามที่บอกว่าฉันสามารถใช้บรรทัดว่างเปล่าแทน 0 ดังนั้นจึงไม่มีข้อผิดพลาด
TFeld

3

C ++ (gcc), 98 ไบต์

#import<cstdio>
#import<cstdlib>
#define d printf("%i ",x 
int p(int x){d);while(x>0)d=rand()%x);}

ลองที่นี่!

การใช้

int main() {
    p(100);
}

นี่เป็นครั้งแรกที่ฉันพยายามเล่นกอล์ฟ ข้อเสนอแนะหรือข้อสังเกตใด ๆ ยินดีต้อนรับ

แก้ไข: ลบฟังก์ชั่นหลักตามที่แนะนำเพื่อให้ใช้งานได้


1
สวัสดีและยินดีต้อนรับสู่ PPCG :) คุณไม่จำเป็นต้องรวมการโทรตัวอย่างเป็นจำนวนไบต์ของคุณ (เช่นคุณไม่จำเป็นต้องเขียนฟังก์ชั่นหลัก) เนื่องจากเรายอมรับฟังก์ชั่นการส่งที่ถูกต้อง มิฉะนั้นการส่งข้อมูลของคุณจะไม่ถูกต้องทางเทคนิคเพราะหากอินพุตเป็นตัวเลขสองหลักหรือมากกว่านั้นผลลัพธ์อาจไม่ชัดเจน หากคุณเพียงแค่เพิ่มช่องว่างที่ส่วนท้ายของสตริงรูปแบบในแมโครของคุณคุณควรจะปรับ มีความสุขในการเล่นกอล์ฟ!
FryAmTheEggman

การเพิ่มธงคอมไพเลอร์-Dd='printf("%i,",x'แทน#defineจะช่วยให้คุณประหยัดบางไบต์ (-4) และได้รับอนุญาตตราบใดที่คุณนับไบต์ต่อผลลัพธ์ของคุณ (เพราะมันเป็นคำสั่ง preprocessor ที่ไม่ได้มาตรฐานคุณยังสามารถนำเข้าออก (ที่ น้อยกับ-std=c++98และ-w. ซึ่งไม่นับไบต์) และประเภทตัวแปรดังนั้นคุณจะต้องp(x){d);while(x>0)d=rand()%x;}และ-Dd='printf("%i,",x'.

นอกจากนี้คุณควรตรวจสอบช่องโหว่มาตรฐานและเคล็ดลับสำหรับการเล่นกอล์ฟใน Cหากคุณยังไม่ได้ :)

3

> <>, 92 + 2 ไบต์

:nao:0=?;0_1>:{:}(?\\
}(?!\$2*1>x~\$+1$*2/\~00:{{:@}
8+1.\~:{:}\+>$1+f
~~@~~47*0.\(a2*1@@?!.

+ 2B สำหรับแฟล็ก -v

ลองออนไลน์!

> <> แหล่งที่มาของการสุ่มมาจากคำสั่ง 'x' ซึ่งกำหนดทิศทางของตัวชี้คำสั่งให้เป็นค่าแบบสุ่ม ดังนั้นการสร้างตัวเลขสุ่มจาก 0 ถึง n จึงไม่น่ารำคาญ

ฉันแรกคำนวณจำนวนบิตที่จำเป็นต้องใช้เพื่อแสดงตัวเลขในช่วง [0, n) จากนั้นสร้างบิตสุ่มเพื่อสร้างตัวเลขสุ่ม สิ่งนี้ทำให้มีความเป็นไปได้ที่มันจะสร้างตัวเลขที่มีขนาดใหญ่กว่า n เล็กน้อยซึ่งในกรณีนี้เราเพียงแค่ละทิ้งมันและลองอีกครั้ง

คำอธิบาย:

:nao                              Print the current number followed by a newline
    :0=?;                         If the current n is 0, terminate

Calculate how many random bits we need to be generating:
         0 1                      Initialise the variables for this loop: 
                                      numberOfBits = 0, maxValue = 1
             :{:}(?\              If maxValue >= n, break out of the loop
                 *2               maxValue *= 2
             $+1$                 numberOfBits += 1

Generate the random number:
                     ~            Delete maxValue
                      00          Initialise randomNumber = 0, i = 0
}(?!\                   :{{:@}    If i >= numberOfBits, break out of the (inner) loop
     $2*                          randomNumber *= 2
          _
        1>x~\                     The random bit: If the IP goes up or 
          \+>                     left, it'll be redirected back onto the 'x', 
                                  if it goes down, it adds one to randomNumber
                                  If it goes right, it does nothing to randomNumber

             $1+                  increment i
8+1.            f                 Jump back to the start of the inner loop

After we've generated our number, check that it's actually below n
     ~                            Delete i
      :{:} (      ?               Test that the number is less than n
            a2*1    .             If it's not, jump back to the start 
                                  of the number generation section
  @~~                             Otherwise delete the old value of n, and numberOfBits
     47*0.                        Then jump back to the start of the program

ดีมาก! ฉันมากับความคิดเดียวกันอย่างอิสระ โซลูชันของฉันใช้อักขระน้อยกว่าของคุณหลายตัว แต่คุณได้พยายามสร้างโค้ดที่มีขนาดกะทัดรัดขึ้น
Théophile

2
ฉันทามติเมตาปัจจุบันคือคุณไม่จำเป็นต้องนับจำนวนไบต์ที่ใช้กับธง
Jo King


2

เรติน่า 21 ไบต์

.+
*
L$`.
$.`
+¶<)G?`

ลองออนไลน์! คำอธิบาย:

+

ทำซ้ำจนกว่าค่าจะหยุดการเปลี่ยนแปลง (เช่น 0)

¶<)

พิมพ์ค่าก่อนที่จะผ่านแต่ละวง

.+
*

แปลงเป็นเอก

L$`.
$.`

สร้างช่วงและแปลงเป็นทศนิยม

G?`

เลือกองค์ประกอบแบบสุ่ม


2

Pyth , 6 7 ไบต์

QWQ=OQQ

ลองออนไลน์!

+1 เพื่อพิมพ์ค่าอินพุตเริ่มต้น

ในขณะที่ Q เป็นความจริงให้ตั้งค่า Q เป็นจำนวนเต็มแบบสุ่มระหว่าง 0 ถึง Q แล้วพิมพ์ Q

ไม่ใช่คำตอบ Pyth ที่สั้นที่สุด แต่ฉันเพิ่งจะเรียนรู้และโพสต์เพียงเพราะการสนทนาเมื่อเร็ว ๆ นี้เกี่ยวกับไม่มีใครใช้ Pyth อีกต่อไป :)


2
ฉันจัดการเพื่อผูกโดยใช้การลดแบบสะสม แต่ทำให้เป็นโปรแกรมขั้นตอน ขอบคุณสำหรับแรงจูงใจในการทำงานในกอล์ฟ :)
FryAmTheEggman

มันเท่ห์มาก ยังคงพยายามหาว่ามันทำงานอย่างไร (ทำไม)
ElPedro

โดยค่าเริ่มต้นทั้งคู่=และ~ใช้ตัวแปรแรกของนิพจน์เป็นตัวแปรที่จะถูกกำหนดหากไม่มีการระบุไว้ ตัวอย่างเช่น~hTจะตั้งค่าTเป็น 11 ในขณะที่คืนค่า 10 เคล็ดลับแฟนซีอื่น ๆ เพียงอย่างเดียวคืออักขระขึ้นบรรทัดใหม่พิมพ์อินพุตและจากนั้นส่งคืนค่านั้นโดยไม่แก้ไขดังนั้นเราจึงสามารถมีเนื้อความห่วงที่ว่างเปล่า ให้ฉันรู้ว่าสิ่งที่คนอื่นจะทำให้เกิดความสับสน :)
FryAmTheEggman

1
@FryAmTheEggman นั่นช่างสวยงาม
isaacg

1
@isaacg ขอบคุณ! เดิมทีฉันตั้งใจจะให้แก้ไขที่นี่ แต่ฉันตัดสินใจที่จะเขียนอะไรบางอย่างตั้งแต่ฉันต้องการลอง MathJax คำตอบของ Pyth แบบนี้เป็นคำตอบที่ฉันโปรดปรานเสมอเพราะพวกเขารู้สึกว่าทั้งตั้งใจและไม่เหมาะสม :)
FryAmTheEggman


2

สูตร IBM / Lotus Notes ขนาด 48 ไบต์

o:=i;@While(i>0;i:=@Integer(i*@Random);o:=o:i);o

iสูตรสนามที่จะใช้ข้อมูลจากอีกสนาม

ไม่มี TIO สำหรับสูตรดังนั้นนี่คือสกรีนช็อตของตัวอย่างผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่



2

PowerShell , 35 ไบต์

for($a="$args";$a;$a=Random $a){$a}

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ นำเข้าจัด$argsเก็บลงใน$aและเข้าสู่forวง การวนซ้ำแต่ละครั้งที่เรากำลังตรวจสอบว่า$aยังคงเป็นไปในเชิงบวก (เช่นเดียวกับที่0ผิดพลาดใน PowerShell) จากนั้นเราจะออกจาก$aท่อและย้ายไปซ้ำถัดไปที่เราตั้งไว้$aจะเป็นผลมาจากการที่กลับจำนวนเต็มในช่วงGet-Random $a0..($a-1)

(Ab) ใช้ความจริงที่ว่า PowerShell สร้างบรรทัดใหม่ต่อท้ายเพิ่มเติมแทนการแสดงผลศูนย์สุดท้าย (อนุญาตตามกฎที่เขียนไว้ในปัจจุบัน)


"$args"- ดี ฉันติดอยู่$args[0]ในกรณีนี้
mazzy

2

ลัวะ 58 ไบต์

p,r=print,...+0 p(r)while r>0 do r=math.random(0,r)p(r)end

ลองออนไลน์!

สำหรับ Lua รักที่นี่อีก :)


สวัสดีคุณสามารถลบเครื่องหมาย +0 ในการrประกาศและย้ายไปrที่คำสั่ง while ได้โดยการทำเช่นนั้นคุณจะใช้พื้นที่น้อยกว่า 1 ไบต์สำหรับพื้นที่ ( p,r=print,...p(r)while)
Visckmart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.