Biorąc pod uwagę ciąg wejściowy S
, wydrukuj, S
a następnie niepusty separator w następujący sposób:
Krok 1:
S
ma1/2
szansę na wydrukowanie i1/2
szansę na zakończenie programu.Krok 2:
S
ma2/3
szansę na wydrukowanie i1/3
szansę na zakończenie programu.Krok 3:
S
ma3/4
szansę na wydrukowanie i1/4
szansę na zakończenie programu.…
Krok
n
:S
man/(n+1)
szansę na wydrukowanie i1/(n+1)
szansę na zakończenie programu.
Notatki
Łańcuch wejściowy będzie składał się wyłącznie ze znaków akceptowanych w typie łańcucha twojego języka.
Można użyć dowolnego niepustego separatora, o ile zawsze jest taki sam. Oczekuje się, że separator zostanie wydrukowany po ostatnim wydruku
S
przed zakończeniem programu.Program ma
1/2
szansę zakończyć działanie przed wydrukowaniem czegokolwiek.Końcowa nowa linia jest dopuszczalna.
Twoja odpowiedź musi podjąć prawdziwą próbę przestrzegania opisanych prawdopodobieństw. Oczywiście, gdy
n
jest duża, będzie to coraz mniej prawdziwe. Odpowiednie wyjaśnienie, w jaki sposób obliczane są prawdopodobieństwa w twojej odpowiedzi (i dlaczego uwzględniają specyfikacje, pomijając problemy z pseudolosowością i dużymi liczbami) jest wystarczające.
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Odpowiedzi:
Pyth , 7 bajtów
Wypróbuj online!
Jak to działa
Pseudo kod:
źródło
C #,
9485 bajtówMoja pierwsza odpowiedź!
Poprzednia próba (podobało mi się
goto
):Nie golfowany:
Uwaga: w języku C #
Random.Next(N)
metoda zwraca nieujemną liczbę całkowitą w zakresie [0, N-1], więc możemy po prostu sprawdzić, czy zwracana liczba jest większa niż 0.źródło
using System;
w swojej liczbie bajtów. Można zadeklarowaćr
inline, nie ma potrzeby, aby ustawić go do zmiennej:new Random().Next(i++)
. Nie potrzebujesz końcowego średnika na grze w golfa.new Random().Next(i++)
ale kiedy próbowałem to wykonać, wynik zawsze był taki, że program się zatrzymywał bez drukowania lub program nigdy się nie zatrzymywał. Kiedy deklarujęr=new Random()
i używamr
zmiennej, program zatrzymuje się bardziej losowo, jak prosi OP.R,
474643 bajtów43 bajty z powodu Robina Rydera w komentarzach.
Wypróbuj online!
Wyjaśnienie
źródło
function(s)
jest krótszy niżs=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
jest jeszcze krótszy.T
iF
funkcje anonimowe, ponieważ modyfikuje zmienną globalną i oznacza, że funkcja może być wywołana tylko raz. Zobacz tutaj : „funkcja rozwiązania działa niezmiennie niezależnie od tego, ile razy była wcześniej wywoływana”.05AB1E , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript,
605854 bajtówWyprowadzi ciąg
s
. Separator, który jest drukowany po zakończeniu programu, toNaN
lub0
.Math.random()
zwraca wartość z zakresu od 0 do 1. Jeśli ta wartość jest niższan/(n+1)
, tos
będzie pritned.4 bajty zapisane dzięki @Neil
źródło
n/++n
?alert
zamiastconsole.log
zapisywać 6 bajtów - fragment kodu może walert = console.log
razie potrzeby wyświetlać nieprzeszkadzające dane wyjściowe (jeśli dozwolone - nie zapisuje bajtów, pomaga tylko zachować rozsądek)Java 8,
726261 bajtów-10 bajtów dzięki @cliffroot .
-1 bajt dzięki @JollyJoker .
Separator to nowa linia.
Wyjaśnienie:
Wypróbuj tutaj.
źródło
if
warunku wfor
bloku warunków?for
pętli.for
pętla powinna się zakończyć, aby nie wymagała wyraźnegoreturn
. Drugie wyrażenie wewnątrz instrukcji.int n=2
i1f/n++
zadziała?Mathematica, 43 bajty
JungHwan Min zapisał 1 bajt (powyżej) i zasugerował coś lepszego (poniżej)
Mathematica, 37 bajtów
źródło
RandomInteger@n!=0
jest taki sam jakRandomInteger@n<1
w tym przypadku in++
można go połączyćRandomInteger@n
. PonadtoFor
jest (prawie zawsze) krótszy niżWhile
: -5 bajtówFor[n=1,RandomInteger@n++>0,Print@#]&
For[n=1,!n∣Hash[# n++],Print@#]&
działałby również przy 34 bajtach, zakładając, że skrót jest dość przypadkowy. Losowość zależy jednak od danych wejściowych. Na przykład spróbuj% /@ Alphabet[]
Clojure,
6156 bajtówOch, dlaczego nie poszedłem z
for
? Ale tak naprawdę trzeba być pedantycznymdoseq
, jakfor
ocenia się leniwie.Oryginał:
źródło
(>(+(rand-int n)2)0)
zawsze jest prawda?n
!> <> ,
124112 bajtówWypróbuj online! (Możesz również obejrzeć go na placu zabaw dla ryb , ale z powodu pewnych błędów musisz dodać znak
}
pol
czwartej linii i dodać kilka znaków nowego wiersza po kodzie, aby działał poprawnie.)Losowość jest trudna w> <>. Jedyną losową instrukcją jest losowe wybieranie
x
kierunku ryby z czterech opcji (w lewo, w prawo, w górę iw dół), więc przekształcenie tego w coś z prawdopodobieństwem 1 / n nie jest proste.Sposób ten polega na tym, że za pomocą możliwości samodomodowania> <> buduje się Wieżę Losowości pod kodem, więc na przykład w czwartym etapie kod wygląda następująco:
Ryba zaczyna się na dole wieży. Na każdym poziomie wieży
x
jest uwięziony między dwoma lustrami, więc ryba może uciec tylko poprzez przejście w lewo lub w prawo. Każdy z tych kierunków wysyła rybę na następny poziom wieży, ale pójście w lewo również popycha a0
na stos. Zanim ryba dotrze na szczyt wieży, stos zawiera pewną liczbę0
s, a liczba ta następuje po rozkładzie dwumianowym z próbami n, a p = 1/2.Jeśli długość stosu wynosi 0 (co ma prawdopodobieństwo 1/2 n ), program zatrzymuje się. Jeśli długość wynosi 1 (z prawdopodobieństwem n / 2 n ), ryba drukuje dane wejściowe i nową linię i buduje kolejny poziom wieży. Jeśli długość jest cokolwiek innego, ryba odrzuca stos i wraca na dół wieży. W efekcie spośród możliwości, które faktycznie coś robią, n z nich wypisuje łańcuch wejściowy, a jedna z nich zatrzymuje program, dając wymagane prawdopodobieństwa.
źródło
Python 3 ,
726966 bajtówWypróbuj online!
źródło
random()<1/i
.randint
jest włącznie. Następnie możesz skrócić tę linię dowhile randint(0,i):print(s);i+=1
QBIC ,
1917 bajtówPorzucono
=1
, zmieniono warunki, zapisano 2 bajtyWyjaśnienie
źródło
Braingolf , 23 bajty
Wypróbuj online!
Generuje liczbę losową,
x
gdzie0 <= x < n+1
kończy się, jeślix
wynosi 0, w przeciwnym razie przyrostyn
i pętle. Separator jest|
Wyjaśnienie:
źródło
Alice , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
PHP , 31 bajtów
Wypróbuj online!
źródło
Perl, 26 bajtów
24 bajtowy kod + 2 dla
-nl
.Wypróbuj online!
źródło
Węgiel drzewny , 14 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Używa
_
jako separatora. Uwaga: buforowanie danych wyjściowych jest wyłączone, więc proszę nie hamować serwera Dennisa!źródło
MATL , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Perl 6 ,
50 41 38 3626 bajtówSpróbuj
Spróbuj
Spróbuj
Spróbuj
(z
-n
argumentem wiersza poleceń)Spróbuj
źródło
Python 3 , 55 bajtów
Wyjaśnienie
Aby uniknąć konieczności importowania losowego, wykorzystałem fakt, że wbudowana funkcja mieszająca jest losowo uruchamiana za każdym razem, gdy uruchamiany jest proces python (przynajmniej w systemie MacOS). Każdy skrót ostatniego skrótu powinien generować serię pseudolosowych liczb całkowitych.
Jeśli skrót jest wystarczająco pseudolosowy, modulo z
i
jest z prawdopodobieństwem zero1/i
.Notatki
Trochę przeszkadza mi nadmiarowa wartość skrótu, ale bez przypisywania „do” lub „warunku” w Pythonie jestem trochę utknięty.
źródło
I'm a little bothered...
rekurencja?DO#
Jest to taka sama długość jak górna odpowiedź C #, ale:
Chciałem tylko zaznaczyć, że niektóre matematyki mogą dawać prawidłowe prawdopodobieństwo.
Jest równa
A funkcja f (x) = 1 / x-1 to:
f (1) = 0
f (1/2) = 1
f (1/3) = 2
f (1/4) = 3
Więc 1/2 szansy na zaokrąglenie w dół do 0, 1/6 szansy na zaokrąglenie w dół do 1, a 1 / (n + 1) (n + 2) szansę na zaokrąglenie w dół do n.
Może jakiś inny język mógłby na tym skorzystać.
EDYCJA: Naprawiono mój błąd
Pomyślałem o czymś, co mogłoby go zmniejszyć.
EDYCJA EDYCJA: Po prostu się mylę. Wyciągnąłem losowy z pętli, ponieważ jeśli zostanie oceniony wielokrotnie, nie zadziała.
EDYCJA EDYCJA EDYCJA: Pozbyłem się zmiennej i. Przestanę próbować to teraz zmniejszyć. Nie, skłamałem. Pozbyłem się innego bajtu.
źródło
Węgiel drzewny , 17 bajtów
Wypróbuj online! Zawiera pełny kod. Szanuje specyfikacje, ponieważ używa losowego zakresu od
0
don
.źródło
C, 41 bajtów
Zakłada, że
rand
jest zaszczepiony. Wypróbuj online!źródło
rand
jest zaszczepiony”. - Czy to uzasadnione założenie?rand
jest wymagany przez standard, aby mieć domyślnie ustaloną wartość początkową równą 1 i wszystkie znane mi implementacje właśnie to robią. Jeśli ta funkcja wykonuje tylko to, o co prosi wyzwanie, w połączeniu z innym kodem, myślę, że inny kod musi zostać uwzględniony w odpowiedzi i liczbie bajtów.braingasm , 22 bajty
edycja: Ta sama liczba bajtów, ale zdałem sobie sprawę, że mogę się zakraść w nowej
L
funkcji imitacji taśmy .Używa
0
jako separatora. Działa tak:źródło
Python , 54 bajty
Wypróbuj online!
Wygenerowano liczbę kopii, jak
floor(1/p)-1
przyp
jednolitym wyborze z przedziału jednostek. Liczba kopii przypada,n
gdy1/p-1
mieści się pomiędzyn
in+1
, co dzieje się, kiedy1/(n+2) < p < 1/(n+1)
. Dzieje się tak z prawdopodobieństwem1/(n+1)-1/(n+2)
lub1/((n+1)*(n+2)
. Jest to pożądane prawdopodobieństwo wydanian
kopii:1/2
prob 0,1/6
prob 1,1/12
prob 2, ...źródło
form random import*
na dole?f=
i nie umieszczając go w nagłówku TIOC ++,
979657 bajtówOto moja pierwsza próba na codegolf :)
Za pomocą zapisałem jeden bajt
for
Zaoszczędzono 39 bajtów, ponieważ wydaje się, że nikt nie liczy włączeń
bez golfa
źródło
F #, 161 bajtów
Zdecydowanie nie jest to najlepszy język do gry w golfa, ale postanowiłem spróbować (poza tym nie wiem nic o F #, więc wszelkie wskazówki, jak poprawić moją odpowiedź, będą mile widziane).
Wykonaj z:
Zapisuje nową linię jako separator.
źródło
Rubinowy , 29 + 1 = 30 bajtów
Używa
-n
flagi.Wypróbuj online!
źródło
puts$_
zprint
, ale nie jest jasne zasady, które obsługują.JS (ES6), 47 bajtów
W przeciwieństwie do innych odpowiedzi ES6, używa to pętli for i ostrzegających bomb zamiast rekurencji. Separator, który jest drukowany po zatrzymaniu programu, jest niezdefiniowany.
źródło
PowerShell, 31 bajtów
Get-Random $i
wypisujen
gdzie0 <= n < $i
, separator jest domyślną nową linią.źródło
Python, 75 bajtów
Druga odpowiedź na Python jest krótsza, ale chciałem spróbować w inny sposób:
źródło