สิ่งนี้จะหยุด ...


41

รับสตริงอินพุตSพิมพ์Sตามด้วยตัวคั่นที่ไม่ว่างในวิธีต่อไปนี้:

  • ขั้นตอนที่ 1: Sมี1/2โอกาสถูกพิมพ์และ1/2โอกาสที่โปรแกรมจะยกเลิก

  • ขั้นตอนที่ 2: Sมี2/3โอกาสถูกพิมพ์และ1/3โอกาสที่โปรแกรมจะยกเลิก

  • ขั้นตอนที่ 3: Sมี3/4โอกาสถูกพิมพ์และ1/4โอกาสที่โปรแกรมจะยกเลิก

  • ...

  • ขั้นตอนn: Sมีn/(n+1)โอกาสพิมพ์และมี1/(n+1)โอกาสที่โปรแกรมจะยกเลิก

หมายเหตุ

  • สตริงอินพุตจะประกอบด้วยอักขระที่ยอมรับได้ในประเภทสตริงของภาษาของคุณเท่านั้น

  • ตัวคั่นที่ไม่ว่างใด ๆ สามารถใช้ได้ตราบใดที่มันยังคงเหมือนเดิม คาดว่าตัวคั่นจะถูกพิมพ์หลังจากการพิมพ์ครั้งสุดท้ายSก่อนที่โปรแกรมจะสิ้นสุด

  • โปรแกรมมี1/2โอกาสยกเลิกก่อนพิมพ์อะไรก็ได้

  • บรรทัดใหม่ต่อท้ายเป็นที่ยอมรับ

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

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


ตัวคั่นสามารถเป็นสตริงว่างได้หรือไม่?
rturnbull

16
@rtbull ไม่ดีเพราะในกรณีนั้นไม่มีตัวคั่น
ทำให้เสียชีวิต

เราต้องพิมพ์สิ่งเหล่านี้หลังจากที่อื่น ๆ หรือเราจะพิมพ์ทั้งหมดเมื่อโปรแกรมสิ้นสุดลง?
Dennis

@Dennis หนึ่งหลังจากอื่น ๆ
ทำให้เสียชีวิต

คำตอบ:


18

Pyth , 7 ไบต์

WOh=hZQ

ลองออนไลน์!

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

pseudocode:

while rand_int_below(1 + (Z += 1)):
    print(input)

Pyth ชนะ 05AB1E อีกครั้งใช่ไหม
Erik the Outgolfer

คำสั่งพิมพ์ไม่ต้องการความน่าจะเป็นของตัวเองพร้อมกับความน่าจะเป็นการเลิกจ้างหรือไม่?
tuskiomi

1
@tuskiomi Nah, n / (n + 1) มีค่าเพียง 1-1 / (n + 1) หรือ 1 - (ความน่าจะเป็นของการสิ้นสุด)
Adowrath

29

C #, 94 85 ไบต์

คำตอบแรกของฉัน!

using System;s=>{var r=new Random();for(var i=2;r.Next(i++)>0;)Console.Write(s+" ");}

ความพยายามก่อนหน้า (ฉันชอบที่goto):

using System;s=>{var i=2;var r=new Random();a:if(r.Next(i++)>0){Console.Write(s+" ");goto a;}}

Ungolfed:

using System;
class P
{
    static void Main()
    {
        Action<string> f = s =>
        {
            var r = new Random();
            for (var i = 2; r.Next(i++) > 0;) Console.Write(s + " ");
        };

        f("test");

        Console.ReadKey();
    }
}

หมายเหตุ: ใน C # Random.Next(N)เมธอดจะส่งคืนจำนวนเต็มที่ไม่ใช่ค่าลบในช่วง [0, N-1] ดังนั้นเราสามารถตรวจสอบได้ว่าจำนวนที่ส่งคืนนั้นมากกว่า 0


1
คุณต้องรวมusing System;เข้าไปในจำนวนไบต์ของคุณ คุณสามารถประกาศแบบอินไลน์ไม่จำเป็นต้องตั้งค่าให้ตัวแปร:r new Random().Next(i++)คุณไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคต่อท้าย func golfed
TheLethalCoder

1
โอ้และคำตอบแรกที่ดี! จะได้รับสั้นกว่าความพยายามของฉัน :)
TheLethalCoder

@TheLethalCoder ขอบคุณสำหรับความคิดเห็นของคุณ! ฉันพยายามที่จะใช้new Random().Next(i++)แต่เมื่อฉันพยายามที่จะดำเนินการนั้นผลก็คือโปรแกรมหยุดโดยไม่พิมพ์อะไรเลยหรือโปรแกรมก็ไม่เคยหยุดเลย เมื่อฉันประกาศr=new Random()และใช้rตัวแปรโปรแกรมจะหยุดสุ่มมากขึ้นเมื่อ OP ถาม
Charlie

Ahhh probs เพราะห่วงแน่นมาก
TheLethalCoder

2
@TheLethalCoder - ใช่แล้ว thight loop หมายถึงโอกาสที่เมล็ดของเครื่องกำเนิดไฟฟ้าจะเหมือนกัน ดู: msdn.microsoft.com/en-us/library/system.random.aspx#Instantiate
Erno

12

R, 47 46 43 ไบต์

43 ไบต์เนื่องจาก Robin Ryder ในความคิดเห็น

s=scan(,"")
while(sample(T<-T+1)-1)print(s)

ลองออนไลน์!

คำอธิบาย

s=scan(,"")  # Takes input from stdin.
             T<-T+1    # T is 1 by default, so this
                       # evaluates to 2, and will increment
                       # at each step.
      sample(T<-T+1)   # Take a sample of size 2, i.e. generate
                       # a list of integers from 1 to 2 in random order
      sample(T<-T+1)-1 # Subtract one from every element of this list.
while(sample(T<-T+1)-1)# while() will treat the first value in this list
                       # as a logical value, i.e. FALSE for zero and TRUE
                       # for nonzero values. The other elements of the list
                       # are ignored, triggering a warning.
                       print(s) # print s

สิ่งนี้สิ้นสุดลงหรือไม่?
mfloren

@mfloren ใช่เช่นเดียวกับคำตอบอื่น ๆ ทั้งหมดที่นี่มันเป็นแบบสุ่มโดยมีโอกาสในการยกเลิกลดลงเมื่อมันดำเนินไป แต่ในที่สุดมันก็จะยุติ มีโอกาส 0.5 มันจะพิมพ์อะไร! ลองใช้หลาย ๆ ครั้งและเปรียบเทียบผลลัพธ์
rturnbull

function(s)สั้นกว่าs=scan(,'');
JAD

1
และpryr::f(while(runif(1)<T/(T<-T+1))print(s))ยิ่งสั้น
JAD

1
@JarkoDubbeldam แต่น่าเสียดายที่คุณไม่สามารถ (ab) ใช้งานTและFมีฟังก์ชั่นที่ไม่ระบุชื่อเนื่องจากมันแก้ไขตัวแปรระดับโลกและหมายความว่าสามารถเรียกใช้ฟังก์ชันได้เพียงครั้งเดียว ดูที่นี่ : "ฟังก์ชั่นการแก้ปัญหาทำงานอย่างต่อเนื่องไม่ว่าจะถูกเรียกมาก่อนหน้านี้กี่ครั้งก็ตาม"
rturnbull

11

05AB1E , 8 ไบต์

[NÌL.R#,

ลองออนไลน์!

คำอธิบาย

[         # start loop
 NÌL      # push range [1 ... current_iteration+2]
    .R    # pick a random number
      #   # if true (1), exit loop
       ,  # print input

@ สรุป: มันทำเพื่อฉัน ลองเรียกใช้สองสามครั้ง มีโอกาส 50% ที่จะไม่แสดงผลใด ๆ ดังนั้นคุณอาจจะ "โชคร้าย"
Emigna

11
ปัญหาการสืบทอดของภารกิจสุ่ม บางครั้งอัตราเดิมพันทั้งหมดอยู่กับคุณ
J_F_B_M

@J_F_B_M โดยธรรมชาติ?
Leun Nun

1
@LeakyNun ไม่เป็น "รับปัญหา" (ความน่าจะเป็นของเหตุการณ์ไม่ได้สืบทอดจากเหตุการณ์ก่อนหน้านี้) J_F_B_M อ้างถึงการเข้าใจผิดของนักพนันอย่างชัดเจน
aebabis

11

Javascript, 60 58 54 ไบต์

f=(s,n=1)=>Math.random()<n/++n?console.log(s)+f(s,n):0

sสตริงส่งออกจะ seperator ที่ถูกพิมพ์ถ้าโปรแกรมยุติเป็นหรือNaN0

f=(s,n=1)=>Math.random()<n/++n?console.log(s)+f(s,n):0

f('test')

Math.random()ส่งกลับค่าระหว่าง 0 และ 1 หากค่านั้นอยู่ภายใต้n/(n+1)แล้วsจะถูก pritned

บันทึกได้ 4 ไบต์ด้วย @Neil


1
ทำไมไม่ใช้n/++n?
Neil

1
@Neil ขอบคุณบันทึก 4 ไบต์!
โทมัส W

2
หากสภาพแวดล้อมของคุณเป็นเบราว์เซอร์คุณสามารถใช้alertแทนconsole.logการบันทึก 6 ไบต์ - ตัวอย่างสามารถตั้งค่าalert = console.logให้แสดงผลลัพธ์ไม่เสือกถ้าต้องการ (ถ้าได้รับอนุญาต - ไม่บันทึกไบต์เพียงช่วยรักษาหนึ่งสติ)
Craig Ayre

10

Java 8, 72 62 61 ไบต์

s->{for(int n=2;Math.random()<1f/n++;System.out.println(s));}

-10 ไบต์ขอบคุณที่@cliffroot
-1 ขอบคุณไบต์@JollyJoker

ตัวคั่นเป็นบรรทัดใหม่

คำอธิบาย:

ลองที่นี่

s->{                          // Method with String parameter and no return-type
  for(                        //  Loop
    int n=2;                  //   Start `n` on 2
    Math.random()<1f/n++;     //   Continue loop as long as a random decimal (0.0-1.0)
                              //   is smaller than 1/`n` (and increase `n` by 1 afterwards)
    System.out.println(s)     //   Print the input-String
  );                          //  End of loop
}                             // End of method

2
ฉันไม่สามารถตรวจสอบได้ในขณะนี้ แต่ทำไมไม่วางifเงื่อนไขไว้ในforบล็อกสภาพ
หน้าผา

@cliffroot มันอยู่ในforลูป
Okx

1
@Okx ฉันหมายถึงสภาพเมื่อห่วงควรจะจบเพื่อที่ว่ามันไม่จำเป็นต้องชัดเจนfor returnการแสดงออกที่สองภายในสำหรับคำสั่ง
หน้าผา

@cliffroot อ่าเข้าใจแล้ว
Okx

1
จะint n=2และจะ1f/n++ทำงานอย่างไร
JollyJoker

9

Mathematica, 43 ไบต์

(n=1;While[RandomInteger@n>0,Print@#;n++])&

JungHwan Min บันทึก 1 ไบต์ (ด้านบน) และแนะนำสิ่งที่ดีกว่า (ด้านล่าง)

Mathematica ขนาด 37 ไบต์

For[n=1,RandomInteger@n++>0,Print@#]&

1
RandomInteger@n!=0เหมือนกับRandomInteger@n<1ในกรณีนี้และn++สามารถรวมเข้าด้วยRandomInteger@nกันได้ นอกจากนี้ยังForมีขนาดสั้นกว่า (เกือบตลอด) While-5 ไบต์For[n=1,RandomInteger@n++>0,Print@#]&
JungHwan Min

"สำหรับ" ชนะ! ฉันโพสต์คำตอบของคุณด้วย
J42161217

For[n=1,!n∣Hash[# n++],Print@#]&ก็จะทำงานที่ 34 ไบต์โดยสมมติว่าแฮชนั้นค่อนข้างสุ่ม อย่างไรก็ตามการสุ่มขึ้นอยู่กับอินพุตอย่างไรก็ตาม ตัวอย่างเช่นลอง% /@ Alphabet[]
Kelly Lowder

8

Clojure 61 61ไบต์

โอ้ทำไมฉันไม่ไปด้วยforในตอนแรก? แต่ที่จริงแล้วการพูดจาอวดรู้doseqนั้นจะต้องforมีการประเมินอย่างขี้เกียจ

#(doseq[n(range):while(>(rand-int(+ n 2))0)](println %))

เดิม:

#(loop[n 2](if(>(rand-int n)0)(do(println %)(recur(inc n)))))

ไม่(>(+(rand-int n)2)0)จริงเสมอไป
หน้าผา

อ่าดีฉันตั้งใจจะเพิ่มn!
NikoNyrh

8

> <> , 124 112 ไบต์

i:0( ?v
 &5a ~/
&p0[^ >"\_\^x0!>"0&1+:&p1&:&p2&:&p3&:&p4&:&p0&1+:&p3&:&p4&:
=?v[/!}l]:?!;1
{:   ?^  >
:o>_ {:?!^

ลองออนไลน์! (นอกจากนี้คุณยังสามารถดูได้ที่สนามเด็กเล่นปลาแต่เนื่องจากข้อบกพร่องบางอย่างคุณต้องเพิ่ม a }หลังlในบรรทัดที่สี่และเพิ่มบรรทัดใหม่หลังจากโค้ดเพื่อให้ทำงานได้อย่างถูกต้อง)

การสุ่มทำได้ยากใน> <> คำแนะนำแบบสุ่มเพียงอย่างเดียวคือxซึ่งเลือกทิศทางของปลาโดยสุ่มจากสี่ตัวเลือก (ซ้าย, ขวา, ขึ้นและลง) ดังนั้นการเปลี่ยนเป็นสิ่งที่มีความน่าจะเป็น 1 / nนั้นไม่ตรงไปตรงมา

วิธีที่รหัสนี้ทำโดยการใช้ความสามารถในการปรับเปลี่ยนด้วยตนเอง> <> เพื่อสร้าง Tower of Randomness ด้านล่างรหัสดังนั้นในขั้นตอนที่สี่เช่นรหัสดูเหมือนว่า:

i:0( ?v
 &5a ~/
&p0[^ >"\_\^x0!>"0&1+:&p1&:&p2&:&p3&:&p4&:&p0&1+:&p3&:&p4&:
=?v[/!}l]:?!;1
{:   ?^  >
:o>_ {:?!^
>!0x^
\  _\
>!0x^
\  _\
>!0x^
\  _\
>!0x^
\  _\

ปลาเริ่มที่ด้านล่างของหอคอย ในแต่ละระดับของหอคอยxจะถูกขังอยู่ระหว่างกระจกสองบานเพื่อให้ปลาสามารถหลบหนีได้โดยการไปทางซ้ายหรือขวา ทั้งสองทิศทางส่งปลาขึ้นไปยังระดับถัดไปของหอคอย แต่การไปทางซ้ายก็ผลัก a 0ไปยังกองซ้อน เมื่อถึงเวลาที่ปลาขึ้นไปถึงยอดหอคอยสแต็คมีจำนวน0s และจำนวนนี้ตามการแจกแจงทวินามด้วยการทดลองnและp  = 1/2

หากความยาวของสแต็กเป็น 0 (ซึ่งมีความน่าจะเป็น 1/2 n ) โปรแกรมจะหยุด หากความยาวเท่ากับ 1 (ด้วยความน่าจะเป็นn / 2 n ) ปลาจะพิมพ์อินพุตและบรรทัดใหม่และสร้างหอคอยอีกระดับ หากความยาวเป็นอย่างอื่นปลาจะละทิ้งสแต็คและกลับไปที่ด้านล่างของหอคอย ผลจากความเป็นไปได้ที่จะทำอะไรบางอย่างจริงnของพวกเขาพิมพ์สตริงอินพุตและหนึ่งในนั้นหยุดโปรแกรมให้ความน่าจะเป็นที่ต้องการ


7

Python 3 , 72 69 66 ไบต์

  • บันทึก 3 ไบต์ด้วยJonathan Allan : นำเข้าชวเลขและเริ่มนับจาก 2
  • บันทึกแล้ว 3 ไบต์ด้วยL3viathan : แหลม randint () ครอบคลุมและทำให้สั้นลงในขณะที่มีเงื่อนไข
from random import*
s=input();i=1
while randint(0,i):print(s);i+=1

ลองออนไลน์!


1
มีการตั้งค่าให้ปิดแคชเอาต์พุตเหมือนเช่นกัน
Jonathan Allan

2
ฉันคิดว่ามันเป็นที่ยอมรับได้ที่จะ "ปิด" สำหรับ n ขนาดใหญ่ (ฉันไม่สามารถใช้สมองแบบอังกฤษได้ในเกียร์ "... (และทำไมพวกเขาถึงเคารพรายละเอียดโดยไม่สนใจปัญหาหลอกแบบสุ่มและตัวเลขจำนวนมาก) ... " ไม่สนใจ - ใช่ไหม?) random()<1/iถ้าเป็นอย่างนั้นคุณสามารถทำได้
Jonathan Allan

1
สิ่งนี้ไม่เริ่มต้นด้วยความน่าจะเป็น⅓หรือไม่ randintรวมอยู่ด้วย จากนั้นคุณสามารถย่อให้สั้นลงถึงwhile randint(0,i):print(s);i+=1
L3viathan

1
ฉันเพิ่งมาด้วยวิธีเดียวกัน
ผลไม้แยกแยะ

อัปเดตลิงค์ TIO ตอนนี้การนับไบต์ก็เหมือนกับเวอร์ชั่นจุดลอยเช่นกัน
Jonathan Allan

6

QBIC , 19 17 ไบต์

ลดลง=1เปลี่ยนเงื่อนไขบันทึก 2 ไบต์

{p=p+1~_rp||?;\_X

คำอธิบาย

{       Infinitely DO
p=p+1   Add 1 to p (p starts as 0, so on first loop is set to 1, then 2 etc...)
~       IF
  _rp|| a random number between 0 and p
        (implicitly: is anything but 0)
?;      THEN print A$ (which gets read from the cmd line)
\_X     ELSE QUIT
        END IF and LOOP are auto-added at EOF

6

Braingolf , 23 ไบต์

#|V12[R!&@v!r?<1+>1+]|;

ลองออนไลน์!

สร้างตัวเลขสุ่มโดยxที่0 <= x < n+1ยุติหากxเป็น 0 มิฉะนั้นการเพิ่มnและการวนซ้ำ ตัวคั่นคือ|

คำอธิบาย:

#|V12[R!&@v!r?<1+>1+]|;  Implicit input of commandline args to stack
#|                       Push |
  V                      Create stack2 and switch to it
   12                    Push 1, then 2
     [..............]    Do-While loop, will run indefinitely unless conditional skips
                         Closing bracket
      R                  Return to stack1
       !&@               Print entire stack without popping
          v              Switch to stack2
           !r            Generate random number 0 <= x < n where n is last item on stack
             ?           If last item is greater than 0..
              <          ..Move first item to end of stack
               1+        ..and increment, this is the loop counter number
                 >       ..Move back
                  1+     ..and increment, this is the upper range of the RNG
                    ]    ..end loop
                     |   Endif
                      ;  Suppress implicit output

6

อลิซอายุ 18 ไบต์

/?!\v
\iO/>]qhUn$@

ลองออนไลน์!

คำอธิบาย

/     Reflect to SE. Switch to Ordinal.
i     Read all input as a string and push it to the stack.
!     Store the string on the tape.
/     Reflect to E. Switch to Cardinal.
>     Ensure that the IP moves east. This begins the main loop.

  ]   Move the tape head to the right. We'll be using the tape head's 
      position as a counter variable. Note that this tape head is independent
      of the one used in Ordinal mode to point at the input string.
  q   Push the tape head's position to the stack.
  h   Increment it (so that it's 2 initially).
  U   Get a uniformly random number in [0,n).
  n   Logical NOT. Gives 1 with probability 1/n and 0 otherwise.
  $@  Terminate the program if we got a  1.
  \   Reflect to NE. Switch to Ordinal.
  ?   Retrieve the input from the tape.
  O   Print it with a trailing linefeed.
  \   Reflect to E. Switch to Cardinal.

v     Send the IP south where it runs into the > to start the next
      loop iteration.



3

ถ่าน 14 ไบต์

A²γW‽γ«θ_A⁺γ¹γ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้_เป็นตัวคั่น หมายเหตุ: การแคชเอาต์พุตถูกปิดใช้งานดังนั้นโปรดอย่าใช้เซิร์ฟเวอร์ของเดนนิส!


3

MATL , 9 ไบต์

`G@QYrq]x

ลองออนไลน์!

คำอธิบาย

`        % Do...while
  G      %   Push input
  @      %   Push iteration index k, starting at 1
  QYrq   %   Random integer uniformly distributed in {0, 1, ..., k}. This is the
         %   loop condition. If non-zero (which occurs with probability k/(1+k))
         %   proceed with next iteration; else exit loop
]        % End
x        % Delete, as there are one too many strings. Implicitly display the stack


3

Python 3 , 55 ไบต์

v=s=input();i=2
while hash(v)%i:print(s);i+=1;v=hash(v)

คำอธิบาย

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

หากแฮชแบบสุ่มหลอกพอโมดูโลที่มีiค่าเป็นศูนย์ที่มีความน่าจะ1/iเป็น

หมายเหตุ

ฉันรู้สึกยุ่งเหยิงนิดหน่อยจากการทำแฮชซ้ำซ้อน แต่ไม่มีการทำอะไรสักอย่างหรือการมอบหมายแบบไม่มีเงื่อนไขใน Python ฉันติดอยู่นิดหน่อย


คุณรู้หรือไม่ว่าการแฮ็ชแบบวนซ้ำมักจะครอบคลุมพื้นที่ทั้งหมดของตัวเลขสุ่มหรือไม่หรืออาจติดค้างในรอบได้หรือไม่ ภาษาการเขียนโปรแกรมส่วนใหญ่ใช้อัลกอริธึมการแฮชแบบสุ่มในปัจจุบันเพื่อหลีกเลี่ยงคนที่ทำให้เกิดการชนกันของแฮชอย่างตั้งใจ แต่ฉันไม่แน่ใจว่าการรับประกันแบบสุ่มของอัลกอริทึมแฮชนั้นแตกต่างจาก PRNG อย่างไร

มันเป็นประเด็นที่ยุติธรรม และฉันไม่แน่ใจว่าจะต้องใช้การวิเคราะห์บางส่วนของการนำ Hash Python มาใช้ในการตรวจสอบ (โดยไม่ต้องตรวจสอบอย่างละเอียดมากขึ้น) ฉันคิดว่ามันเป็นทางออกที่สนุกแม้ว่าจะมีโอกาสมันอาจจะไม่หลอก 100% = p
Kit Ham

I'm a little bothered...เรียกซ้ำ?
เฟลิเป้นาร์ดีบาติสตา

3

C #

นี่คือความยาวเท่ากับคำตอบ C # สูงสุด แต่:

using System;s=>{var x=(1<<31)/new Random().Next();for(;++x>0;)Console.Write(s+" ");}

แค่อยากจะชี้ให้เห็นว่าคณิตศาสตร์บางอย่างสามารถสร้างความน่าจะเป็นที่ถูกต้อง

int.MaxValue/new Random().Next()-1

มีค่าเท่ากับ

(int)(1 / new Random().NextDouble()) - 1;

และฟังก์ชั่น f (x) = 1 / x-1 คือ:

f (1) = 0

f (1/2) = 1

f (1/3) = 2

f (1/4) = 3

ดังนั้นโอกาส 1/2 ที่จะถูกปัดเศษลงเป็น 0, 1/6 โอกาสที่จะปัดเศษลงเป็น 1 และ 1 / (n + 1) (n + 2) โอกาสที่จะถูกปัดเศษเป็น n

บางทีภาษาอื่นอาจใช้ประโยชน์จากสิ่งนี้

แก้ไข: แก้ไขข้อผิดพลาดของฉัน

ฉันคิดว่าจะทำให้มันเล็กลง

แก้ไขแก้ไข: ฉันผิดทุกชนิด ดึงการสุ่มออกจากลูปเพราะถ้าประเมินไปหลายครั้งมันจะไม่ทำงาน

แก้ไขแก้ไขแก้ไข: ฉันได้กำจัดตัวแปร i ฉันจะหยุดพยายามลดขนาดมันทันที ไม่โกหก ได้กำจัดไบต์อื่น



2

C, 41 ไบต์

n;f(char*s){for(n=1;rand()%++n;puts(s));}

สันนิษฐานว่าrandเป็นเมล็ด ลองออนไลน์!


"ถือว่าrandเป็นเมล็ด" - นั่นเป็นสมมติฐานที่ถูกต้องที่จะทำหรือไม่? randเป็นสิ่งจำเป็นโดยมาตรฐานที่จะต้องมีค่าเมล็ดคงที่ 1 โดยค่าเริ่มต้นและการใช้งานทั้งหมดที่ฉันรู้ว่าต้องทำ ถ้าฟังก์ชั่นนี้ทำในสิ่งที่ท้าทายถามเมื่อรวมกับรหัสอื่น ๆ ฉันคิดว่ารหัสอื่นต้องรวมอยู่ในคำตอบและจำนวนไบต์
hvd

2

braingasm , 22 ไบต์

แก้ไข: นับไบต์เดียวกัน แต่ฉันรู้ว่าฉันจะแอบในเทปใหม่Lคุณลักษณะ IMIT

,[>,]>L+[+$rzQ>[.>]:>]

ใช้0เป็นตัวคั่น ทำงานเช่นนี้:

,[>,]                   Read a byte and move to next cell until end of input.
     >                  After the loop we're in an empty cell;
                          Leave it empty and move to the next.
      L                 Set tape limit here:
                          The tape will then wrap around if we move further.
       +                Increase current cell by one.
                          This cell will be our counter.
        [            ]  Loop until the counter is zero.
                          That won't happen, so it's an infinite loop.
         +              Increase again, so the first time the counter is 2.
          $r            Get a random number, 0 <= r > current cell
            zQ          Quit the program if that random number was 0
              >         Wrap around to the start of the tape.
               [.>]     Print the input stored on the tape
                          The loop will stop at the blank cell.
                   :    Print the blank cell as a number ("0")
                    >   Go to the next (last) cell

2

Pythonขนาด 54 ไบต์

lambda s:int(1/random()-1)*(s+'|')
from random import*

ลองออนไลน์!

สร้างจำนวนสำเนาที่เป็นfloor(1/p)-1กับpได้รับการแต่งตั้งอย่างสม่ำเสมอจากช่วงเวลาที่หน่วย จำนวนสำเนาที่ได้คือnเมื่อ1/p-1อยู่ระหว่างnและซึ่งเกิดขึ้นเมื่อn+1 1/(n+2) < p < 1/(n+1)เรื่องนี้เกิดขึ้นกับความน่าจะเป็นหรือ1/(n+1)-1/(n+2) 1/((n+1)*(n+2)นี่คือความน่าจะเป็นที่ต้องการของการส่งออกnสำเนา: โพ1/2รบของ 0, โพ1/6รบ 1, โพ1/12รบ 2, ...


ทำไมถึงอยู่form random import*ด้านล่าง?
CalculatorFeline

@CalculatorFeline ลำดับไม่สำคัญ นิยามฟังก์ชั่นการทำงานอย่างใดอย่างหนึ่ง
xnor

@CalculatorFeline เพื่อที่จะลดลงเป็นไบต์โดยไม่ได้เขียนf=และวางไว้ใน TIO Header
Mr. Xcoder

นั่นทำให้รู้สึก
CalculatorFeline

2

C ++, 97 96 57 ไบต์

นี่เป็นครั้งแรกที่ฉันลอง codegolf :)

#include<iostream>
int main(){std::string S;std::cin>>S;int i=1;while(rand()%++i)puts(S.data());}

ฉันบันทึกหนึ่งไบต์โดยใช้ for

#include<iostream>
int main(){std::string S;std::cin>>S;for(int i=1;rand()%++i;)puts(S.data());}

บันทึก 39 ไบต์เนื่องจากดูเหมือนว่าไม่มีใครนับรวมถึง

void p(string S){for(int i=1;rand()%++i;)puts(S.data());}

ungolfed

#include <iostream>
int main()
{
  // Create and read string from inputstream
  std::string S;
  std::cin >> S;       

  // rand % i: create random int in range [0, i-1]
  // Zero is seen as false and all positive int as true
  int i = 1;
  while (rand() % ++i) 
    puts(S.data());    
}

คุณอาจใช้สตริงเป็นอาร์กิวเมนต์จากบรรทัดคำสั่ง
Maliafo

รวมถึงการนับถ้าคุณหาคอมไพเลอร์ที่มีพวกเขาตามค่าเริ่มต้น
เฟลิ Nardi Batista

2

F #, 161 ไบต์

ไม่ใช่ภาษาที่ดีที่สุดสำหรับการเล่นกอล์ฟ แต่ฉันตัดสินใจลอง (นอกจากนี้ฉันไม่รู้อะไรเลยเกี่ยวกับ F # ดังนั้นคำแนะนำใด ๆ ในการปรับปรุงคำตอบของฉันจะได้รับการต้อนรับ)

let f s=
 let r,z=System.Random(),(<>)0
 let p _=printfn"%s"s
 seq {for i in 2|>Seq.unfold(fun i->Some(i,i+1))do yield r.Next(i)}|>Seq.takeWhile z|>Seq.iter p

ดำเนินการด้วย:

[<EntryPoint>]
let main argv =
    "test" |> f
    0

เขียนบรรทัดใหม่เป็นตัวคั่น


2

Ruby , 29 + 1 = 30 ไบต์

ใช้-nธง

i=1;puts$_ while i>rand(i+=1)

ลองออนไลน์!


เมื่อคุณป้อนหนึ่งบรรทัดคุณสามารถใช้$ ตัวแปรพิเศษแทนฉัน เนื้อหาที่คุณสามารถแทนที่puts$_ด้วยprintแต่ก็ไม่ชัดเจนว่าสนับสนุนกฎที่
ประวัติศาสตร์

2

JS (ES6), 47 ไบต์

x=>{for(i=1;Math.random()<i/(i+1);i++)alert(x)}

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



1

Python ขนาด 75 ไบต์

คำตอบอื่น ๆ ของ Python นั้นสั้นกว่า แต่ฉันต้องการลองวิธีอื่น:

from random import*
f=lambda d=1,s=input():randint(0,d)and s+'!'+f(d+1)or''
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.