Ini pada akhirnya akan berhenti ...

41

Diberikan string input S, cetak Sdiikuti oleh pemisah tidak kosong dengan cara berikut:

  • Langkah 1: Smemiliki 1/2peluang untuk dicetak, dan 1/2kesempatan bagi program untuk berakhir.

  • Langkah 2: Smemiliki 2/3peluang untuk dicetak, dan 1/3kesempatan bagi program untuk berakhir.

  • Langkah 3: Smemiliki 3/4peluang untuk dicetak, dan 1/4kesempatan bagi program untuk berakhir.

  • ...

  • Langkah n: Smemiliki n/(n+1)peluang untuk dicetak, dan 1/(n+1)kesempatan bagi program untuk berakhir.

Catatan

  • String input hanya akan terdiri dari karakter yang dapat diterima dalam tipe string bahasa Anda.

  • Pemisah non-kosong dapat digunakan, asalkan selalu sama. Diharapkan separator dicetak setelah cetakan terakhir Ssebelum program berakhir.

  • Program ini memiliki 1/2peluang untuk mengakhiri sebelum mencetak apa pun.

  • Baris baru yang tertinggal dapat diterima.

  • Jawaban Anda harus melakukan upaya tulus untuk menghormati probabilitas yang dijelaskan. Jelas, ketika nbesar ini akan semakin tidak benar. Penjelasan yang tepat tentang bagaimana probabilitas dihitung dalam jawaban Anda (dan mengapa mereka menghormati spesifikasi, mengabaikan pseudo-randomness dan masalah angka besar) sudah cukup.

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Bisakah pemisah menjadi string kosong?
rturnbull
16
@ Artbullull Yah tidak, karena dalam hal ini tidak ada pemisah.
Fatalkan
Apakah kita harus mencetak satu demi satu, atau bisakah kita mencetak semuanya ketika program berakhir?
Dennis
@Dennis Satu demi satu.
Fatalkan

Jawaban:

18

Pyth , 7 byte

WOh=hZQ

Cobalah online!

Bagaimana itu bekerja

Kodesemu:

while rand_int_below(1 + (Z += 1)):
    print(input)
Biarawati Bocor
sumber
Pyth beats 05AB1E lagi bukan?
Erik the Outgolfer
Bukankah pernyataan cetak membutuhkan probabilitasnya sendiri bersama dengan probabilitas penghentian?
tuskiomi
1
@tuskiomi Nah, n / (n +1) hanya 1-1 / (n +1), atau 1 - (probabilitas pemutusan).
Adowrath
29

C #, 94 85 byte

Jawaban pertamaku!

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

Upaya sebelumnya (saya suka itu goto):

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

Tidak Disatukan:

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();
    }
}

Catatan: dalam C # Random.Next(N)metode mengembalikan integer nonnegatif dalam kisaran [0, N-1], jadi kita bisa memeriksa bahwa angka yang dikembalikan lebih besar dari 0.

Charlie
sumber
1
Anda harus memasukkan using System;ke dalam jumlah byte Anda. Anda dapat mendeklarasikan rinline, tidak perlu mengaturnya untuk variabel: new Random().Next(i++). Anda tidak memerlukan tanda titik koma pada fungsi golf.
TheLethalCoder
1
Oh dan jawaban pertama yang bagus! Akan lebih pendek dari usaha saya :)
TheLethalCoder
@TheLethalCoder terima kasih atas komentar Anda! Saya mencoba menggunakan new Random().Next(i++)tetapi ketika saya mencoba menjalankannya, hasilnya selalu apakah program berhenti tanpa mencetak apa pun, atau program tidak pernah berhenti. Ketika saya mendeklarasikan r=new Random()dan menggunakan rvariabel, program berhenti lebih acak ketika OP bertanya.
Charlie
Ahhh probs karena loop sangat ketat.
TheLethalCoder
2
@TheLethalCoder - Ya, loop thight berarti kemungkinan bahwa benih generator akan sama. Lihat: msdn.microsoft.com/en-us/library/system.random.aspx#Instantiate
Erno
12

R, 47 46 43 byte

43 byte karena Robin Ryder di komentar.

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

Cobalah online!

Penjelasan

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
rturnbull
sumber
Apakah ini pernah berakhir?
mfloren
@ mfloren Ya, seperti semua jawaban lain di sini, ini bersifat stokastik, dengan peluang terminasi menurun saat berlangsung, tetapi akhirnya akan berakhir. Ada kemungkinan 0,5 tidak akan mencetak apa pun! Coba jalankan beberapa kali dan bandingkan hasilnya.
rturnbull
function(s)lebih pendek daris=scan(,'');
JAD
1
Dan pryr::f(while(runif(1)<T/(T<-T+1))print(s))bahkan lebih pendek.
JAD
1
@JarkoDubbeldam Sayangnya Anda tidak dapat (ab) menggunakan Tdan Fdengan fungsi anonim, karena memodifikasi variabel global dan berarti bahwa fungsi tersebut hanya dapat dipanggil sekali. Lihat di sini : "fungsi solusi berkinerja konsisten terlepas dari berapa kali telah dipanggil sebelumnya".
rturnbull
11

05AB1E , 8 byte

[NÌL.R#,

Cobalah online!

Penjelasan

[         # start loop
 NÌL      # push range [1 ... current_iteration+2]
    .R    # pick a random number
      #   # if true (1), exit loop
       ,  # print input
Emigna
sumber
@Fatalize: Itu cocok untuk saya. Coba jalankan beberapa kali. Ini memiliki peluang 50% untuk tidak menghasilkan apa pun sehingga Anda mungkin "sial".
Emigna
11
Masalah bawaan tugas acak. Terkadang semua peluang melawan Anda.
J_F_B_M
@J_F_B_M melekat?
Leaky Nun
1
@ LeakyNun Tidak, ini adalah "Masalah Warisan" (probabilitas kejadian tidak diwarisi dari peristiwa sebelumnya). J_F_B_M jelas merujuk pada Kekeliruan Penjudi.
aebabis
11

Javascript, 60 58 54 byte

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

Akan menampilkan string s. Pemisah yang dicetak jika program berakhir adalah NaNatau 0.

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

f('test')

Math.random()mengembalikan nilai antara 0 dan 1. Jika nilai itu di bawah n/(n+1), maka sakan didahului.

4 byte disimpan berkat @Neil

Thomas W
sumber
1
Kenapa tidak digunakan n/++n?
Neil
1
@Neil terima kasih, tersimpan 4 byte!
Thomas W
2
Jika lingkungan Anda adalah peramban yang dapat Anda gunakan alertalih-alih console.logmenyimpan 6 byte - snippet dapat diatur alert = console.loguntuk menampilkan keluaran yang tidak mencolok jika diinginkan (jika diizinkan - tidak menyimpan byte, hanya membantu menjaga agar tetap waras)
Craig Ayre
10

Java 8, 72 62 61 byte

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

-10 byte terima kasih kepada @cliffroot .
-1 byte terima kasih kepada @JollyJoker .

Pembatas adalah baris baru.

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
2
saya tidak dapat memeriksa saat ini tetapi mengapa tidak memasukkan ifkondisi ke dalam forblok kondisi?
cliffroot
@cliffroot Ini adalah di forlingkaran.
Okx
1
@ Ok saya maksudkan kondisi ketika forloop harus diakhiri sehingga tidak perlu eksplisit return. Ekspresi kedua di dalam untuk pernyataan.
cliffroot
@cliffroot Ah, saya mengerti.
Okx
1
Akan int n=2dan 1f/n++bekerja?
JollyJoker
9

Mathematica, 43 byte

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

JungHwan Min menyimpan 1 byte (di atas) dan menyarankan sesuatu yang lebih baik (di bawah)

Mathematica, 37 byte

For[n=1,RandomInteger@n++>0,Print@#]&
J42161217
sumber
1
RandomInteger@n!=0sama seperti RandomInteger@n<1dalam kasus ini, dan n++dapat digabung dengan RandomInteger@n. Juga, Forhampir selalu lebih pendek dari While: -5 byteFor[n=1,RandomInteger@n++>0,Print@#]&
JungHwan Min
"Untuk" menang! Saya juga mengirim jawaban Anda
J42161217
For[n=1,!n∣Hash[# n++],Print@#]&juga akan bekerja pada 34 byte, dengan asumsi hash cukup acak. Keacakan tergantung pada input, namun. Misalnya, coba% /@ Alphabet[]
Kelly Lowder
8

Clojure, 61 56 byte

Oh mengapa saya tidak pergi dengan fordi tempat pertama? Tetapi sebenarnya untuk menjadi orang tua doseqharus digunakan sebagaimana fordievaluasi dengan malas.

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

Asli:

#(loop[n 2](if(>(rand-int n)0)(do(println %)(recur(inc n)))))
NikoNyrh
sumber
tidak (>(+(rand-int n)2)0)selalu benar?
cliffroot
Ah tangkapan bagus, maksudku kenaikan n!
NikoNyrh
8

> <> , 124 112 byte

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

Cobalah online! (Anda juga dapat menontonnya di taman bermain ikan , tetapi karena beberapa bug Anda harus menambahkan }setelah ldi baris keempat dan menambahkan banyak baris baru setelah kode untuk membuatnya berfungsi dengan baik.)

Keacakan rumit dalam> <>. Satu-satunya instruksi acak adalah x, yang mengambil arah ikan secara acak dari empat pilihan (kiri, kanan, atas dan bawah), sehingga mengubah itu menjadi sesuatu dengan probabilitas 1 / n tidak mudah.

Cara kode ini melakukannya adalah dengan menggunakan kemampuan memodifikasi diri sendiri <> untuk membangun Tower of Randomness di bawah kode, jadi pada tahap keempat, misalnya, kode tersebut terlihat seperti:

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

Ikan mulai di bagian bawah menara. Pada setiap tingkat menara, xterperangkap di antara dua cermin, sehingga ikan hanya bisa melarikan diri dengan pergi ke kiri atau kanan. Salah satu dari arahan ini mengirimkan ikan ke tingkat menara berikutnya, tetapi ke kiri juga mendorong 0ke tumpukan. Pada saat ikan mencapai puncak menara, tumpukan berisi beberapa angka 0s, dan angka ini mengikuti distribusi binomial dengan n percobaan dan p  = 1/2.

Jika panjang tumpukan adalah 0 (yang memiliki probabilitas 1/2 n ), program berhenti. Jika panjangnya 1 (dengan probabilitas n / 2 n ), ikan akan mencetak input dan baris baru dan membangun tingkat menara yang lain. Jika panjangnya berbeda, ikan membuang tumpukan dan kembali ke dasar menara. Akibatnya, dari kemungkinan yang benar-benar melakukan sesuatu, n dari mereka mencetak string input dan salah satunya menghentikan program, memberikan probabilitas yang diperlukan.

Bukan pohon
sumber
7

Python 3 , 72 69 66 byte

  • Disimpan 3 byte berkat Jonathan Allan : Impor singkatan dan mulai hitung dari 2.
  • Disimpan 3 byte berkat L3viathan : Pointed randint () inklusif dan juga disingkat kondisi sementara.
from random import*
s=input();i=1
while randint(0,i):print(s);i+=1

Cobalah online!

officialaimm
sumber
1
Ada pengaturan untuk mematikan cache output - seperti begitu
Jonathan Allan
2
Saya pikir itu bisa diterima untuk "off" untuk n besar (saya tidak bisa mendapatkan otak bahasa Inggris di gigi, "... (dan mengapa mereka menghormati spesifikasi, mengabaikan pseudo-randomness dan masalah angka besar) ..." mengabaikan - kan?) Jika demikian maka Anda bisa melakukannya random()<1/i.
Jonathan Allan
1
Bukankah ini dimulai dengan probabilitas ⅓? randintinklusif. Anda kemudian dapat mempersingkat baris itu menjadiwhile randint(0,i):print(s);i+=1
L3viathan
1
Saya baru saja menemukan solusi yang sama.
Buah Esolanging
TIO yang diperbarui. Sekarang jumlah byte sama dengan versi floating point juga.
Jonathan Allan
6

QBIC , 19 17 byte

Conditional yang dijatuhkan =1, diaktifkan, disimpan 2 byte

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

Penjelasan

{       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
steenbergh
sumber
6

Braingolf , 23 byte

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

Cobalah online!

Menghasilkan angka acak di xmana 0 <= x < n+1, berakhir jika x0, jika tidak, kenaikan ndan putaran. Pemisah adalah|

Penjelasan:

#|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
Skidsdev
sumber
6

Alice , 18 byte

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

Cobalah online!

Penjelasan

/     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.
Martin Ender
sumber
6

PHP , 31 byte

for(;rand()%~++$c;)echo$argn._;

Cobalah online!

Jörg Hülsermann
sumber
6

Perl, 26 byte

Kode 24 byte + 2 untuk -nl.

print while rand++$i+1|0

Cobalah online!

Dom Hastings
sumber
3

Arang , 14 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Digunakan _sebagai pemisah. Catatan: caching keluaran dinonaktifkan, jadi jangan palu server Dennis!

Neil
sumber
3

MATL , 9 byte

`G@QYrq]x

Cobalah online!

Penjelasan

`        % 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
Luis Mendo
sumber
3

Perl 6 ,  50 41 38 36  26 byte

{put $_//last for (($,$_),*⊎$_...*).map(*.pick)}

Cobalah

{eager ->{(++$).rand>.5??.put!!last}...*}

Cobalah

{eager ->{(++$).rand>.5??.put!!0}...0}

Cobalah

{eager ->{(++$).rand>.5&&.put}...!*}

Cobalah

.put while (++$/).rand>.5

(dengan -nargumen commandline)

Cobalah

Brad Gilbert b2gills
sumber
3

Python 3 , 55 byte

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

Penjelasan

Untuk menyimpan harus mengimpor secara acak, saya telah mengeksploitasi fakta bahwa hash built-in diunggulkan secara acak setiap kali proses python dinyalakan (setidaknya dalam MacOS). Setiap hash hash terakhir harus menghasilkan serangkaian bilangan bulat pseudo-acak.

Jika hash cukup pseudo-acak, modulo dengan inol dengan probabilitas 1/i.

Catatan

Saya sedikit terganggu oleh hash yang berlebihan, tetapi tanpa tugas do-while, atau dalam-kondisi dalam Python, saya agak macet.

Kit Ham
sumber
Apakah Anda tahu apakah hashing berulang selalu akan mencakup ruang penuh angka acak, atau bisakah itu berpotensi terjebak dalam siklus? Sebagian besar bahasa pemrograman menggunakan algoritma hash acak saat ini untuk menghindari orang yang sengaja menyebabkan tabrakan hash, tapi saya tidak yakin bagaimana jaminan keacakan dari algoritma hash dibandingkan dengan orang-orang dari PRNG.
Ini poin yang adil. Dan saya tidak yakin, akan diperlukan beberapa analisis implementasi hash Python untuk memeriksa (tanpa pemeriksaan yang lebih lengkap). Saya pikir itu adalah solusi yang menyenangkan, bahkan jika ada kesempatan itu mungkin tidak 100% pseudo-random = p
Kit Ham
I'm a little bothered...rekursi?
Felipe Nardi Batista
3

C #

Panjangnya sama dengan jawaban C # teratas, tetapi:

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

Hanya ingin menunjukkan bahwa beberapa matematika dapat menghasilkan probabilitas yang benar.

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

Setara dengan

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

Dan fungsi f (x) = 1 / x-1 adalah:

f (1) = 0

f (1/2) = 1

f (1/3) = 2

f (1/4) = 3

Jadi 1/2 kesempatan untuk dibulatkan menjadi 0, 1/6 kesempatan untuk dibulatkan menjadi 1, dan 1 / (n +1) (n + 2) peluang dibulatkan menjadi n.

Mungkin bahasa lain bisa memanfaatkan ini.

EDIT: Memperbaiki kesalahan saya

Saya memikirkan sesuatu untuk membuatnya lebih kecil.

EDIT EDIT: Saya semua jenis kesalahan. Menarik Acak ke luar dari loop karena jika itu dievaluasi berulang kali, itu tidak akan berhasil.

EDIT EDIT EDIT: Saya menyingkirkan variabel i. Saya akan berhenti mencoba mengecilkannya sekarang. Tidak, berbohong. Singkirkan byte lain.

Geoffrey
sumber
2

Arang , 17 byte

SαA²βW‽β«⁺α¶A⁺β¹β

Cobalah online! Kode verbose disertakan. Menghargai spesifikasi karena menggunakan rentang acak dari 0hingga n.

Khusus ASCII
sumber
2

C, 41 byte

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

Diasumsikan randdiunggulkan. Cobalah online!

MD XF
sumber
"Diasumsikan randdiunggulkan." - Apakah itu asumsi yang valid untuk dibuat? randdiperlukan oleh standar untuk memiliki nilai seed tetap 1 secara default dan semua implementasi yang saya tahu lakukan hal itu. Jika fungsi ini hanya melakukan apa yang ditanyakan ketika dikombinasikan dengan kode lain, saya pikir kode lain perlu dimasukkan dalam jawaban dan dalam jumlah byte.
hvd
2

braingasm , 22 byte

sunting: Jumlah byte yang sama, tetapi saya menyadari bahwa saya dapat menyelinap di fitur baru tape Limit.

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

Digunakan 0sebagai pemisah. Bekerja seperti ini:

,[>,]                   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
daniero
sumber
2

Python , 54 byte

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

Cobalah online!

Generated jumlah salinan sebagai floor(1/p)-1dengan pseragam dipilih dari interval satuan. Jumlah salinan adalah nsaat 1/p-1jatuh di antara ndan n+1, yang terjadi saat 1/(n+2) < p < 1/(n+1). Ini terjadi dengan probabilitas 1/(n+1)-1/(n+2)atau 1/((n+1)*(n+2). Ini adalah probabilitas yang diinginkan untuk menghasilkan nsalinan: 1/2prob 0, 1/6prob 1, 1/12prob 2, ...

Tidak
sumber
Kenapa ada form random import*di bawah?
CalculatorFeline
@CalculatorFeline Perintahnya tidak masalah. Definisi fungsi berfungsi baik.
xnor
@CalculatorFeline Untuk turun ke byte dengan tidak menulis f=dan menempatkannya di TIO Header
Tn. Xcoder
Itu masuk akal.
CalculatorFeline
2

C ++, 97 96 57 byte

Di sini coba pertama saya di codegolf :)

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

Saya menyimpan satu byte dengan menggunakan for

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

Disimpan 39 byte karena tampaknya tidak ada yang menghitungnya

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());    
}
Michiel uit het Broek
sumber
Anda dapat mengambil string sebagai argumen dari baris perintah
Maliafo
Termasuk dihitung, kecuali jika Anda menemukan kompiler yang memasukkannya secara default
Felipe Nardi Batista
2

F #, 161 byte

Jelas bukan bahasa terbaik untuk golf, tetapi saya memutuskan untuk mencobanya (selain itu, saya tidak tahu apa-apa tentang F #, jadi setiap tips tentang bagaimana meningkatkan jawaban saya akan diterima).

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

Jalankan dengan:

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

Menulis baris baru sebagai pemisah.

Charlie
sumber
2

Ruby , 29 + 1 = 30 byte

Menggunakan -nbendera.

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

Cobalah online!

Nilai Tinta
sumber
Karena Anda menggunakan tepat satu baris input, Anda dapat menggunakan $. variabel khusus, bukan i . Bisa dibilang Anda juga bisa mengganti puts$_dengan printtetapi tidak jelas aturan yang mendukungnya.
histokrat
2

JS (ES6), 47 byte

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

Berbeda dengan jawaban ES6 lainnya, ini menggunakan for for dan alert bom bukannya rekursi. Pemisah yang dicetak ketika program berhenti tidak ditentukan.


sumber
2

PowerShell, 31 byte

for($i=2;random($i++)){"$args"}

Get-Random $ioutput di nmana 0 <= n < $i, pemisah adalah baris baru implisit.

TessellatingHeckler
sumber
1
29 byte?
Veskah
1

Python, 75 byte

Jawaban Python lainnya lebih pendek, tetapi saya ingin mencobanya dengan cara yang berbeda:

from random import*
f=lambda d=1,s=input():randint(0,d)and s+'!'+f(d+1)or''
L3viathan
sumber