Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą (K)
Wyprowadza jednolicie losową liczbę całkowitą (Y)
pomiędzy [0, K)
.
Jeśli Y > 0
przyjmij K = Y
i powtórz proces do Y = 0
.
Zasady
- Dane wejściowe należy najpierw wydrukować
- Format wyjściowy, jak chcesz
- Twój program musi się zakończyć.
0
musi być końcowym wyjściem, opcjonalnie pustą linią0
Odpowiedzi:
Pyth ,
6 54 bajtówWypróbuj tutaj!
Jak to działa
źródło
C (gcc) , 42 bajty
Wypróbuj online!
Wykorzystuje logikę zwartą i.
C (gcc) , 40 bajtów (bez wartości początkowej drukowania)
Wypróbuj online!
Wykorzystuje logikę zwartą i.
źródło
rand()%_
nie jest jednolityR ,
66 60 56 4341 bajtówWypróbuj online!
źródło
>0
icat(n,"")
(pusty ciąg) też będzie działać.print
jest tu bardziej wydajna, ponieważ zwraca swój argument: 56 bajtówk=scan();while(x<-sample(1:k-1,1))k=c(x,k);cat(rev(k),0)
n=scan();while(print(n))n=sample(n,1)-1
MATL , 6 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Pepe , 25 bajtów
Pepe to język programowania stworzony przez użytkownika Soaku .
Wypróbuj online!
Wyjaśnienie:
źródło
Perl 6 , 18 bajtów
Wypróbuj online!
Anonimowy blok kodu, który zwraca listę wartości. Jeśli nie przeszkadza ci to, że liczby są zakresami, możesz:
dla 17 bajtów. Co ciekawe, kolejna wbudowana funkcja losowa
roll
ma w tym przypadku takie samo zachowanie dla tej samej ilości bajtów.źródło
Perl 5 .10,0
-pl
, 26 bajtówWypróbuj online!
źródło
Galaretka ,
43 bajtyJest to monadyczne łącze (funkcja), które drukuje tablicę i zwraca 0 .
Wypróbuj online!
Jak to działa
źródło
Brachylog , 8 bajtów
Wypróbuj online!
Wyjaśnienie
Rekurencja zatrzyma się, gdy
?ℕ₁
zakończy się niepowodzeniem, to znaczy, gdy wejście jest0
.źródło
05AB1E ,
87 bajtówWypróbuj online!
Wyjaśnienie
źródło
Δ=ݨΩ0M
jest równoważne.J, 13 bajtów
W metrze przepraszam za brak TIO (mam nadzieję, że nie brakuje braku poprawności).
Wyświetla listę wartości.
Prawdopodobnie podejście APL będzie krótsze, ale o tym myślałem.
Jak to działa
^:a:
stosuj wielokrotnie aż do zbieżności, przechowując wyniki pośrednie w tablicy.?
losową liczbę całkowitą w zakresie[0, K)
zaK
większy niż 0. 0, daje losową liczbę całkowitą w zakresie(0,1)
. W przypadku liczby zmiennoprzecinkowej błąd.::]
wyłapać błąd dla danych wejściowych?
i zamiast błędów wyprowadzić dane wejściowe, które spowodowały błąd.}:
pozbyć się ostatniej wartości w tablicy (jest to tak, że liczba zmiennoprzecinkowa nie jest generowana).Wypróbuj online!
źródło
?.
, ale nie sądzę, żebym tego używał.JavaScript (ES6),
3837 bajtów-1 bajt dzięki @Arnauld
Pokaż fragment kodu
źródło
new Date%n
naprawdę nie działa tutaj, ponieważ nie zmienia się wystarczająco szybko, aby być użytecznym do generowania wielu liczb losowychC, 38 bajtów
Wypróbuj online
Nie golfił
źródło
&&
; możesz też rozważyć rozstawienie RNG w swojejmain
funkcji: Wypróbuj online!Pyth , 4 bajty
Wypróbuj online!
To w zasadzie implementuje algorytm:
Aby przetłumaczyć Pyth na algorytm, możemy w większości po prostu zbadać, co oznacza każdy znak. Ponieważ Pyth jest zapisany w notacji przedrostkowej (tzn.
* + 1 2 3
Jest(1 + 2) * 3
), możemy zaczynać od lewej strony i uzupełniać argumenty.W
rozpoczyna tradycyjną pętlę while. Pierwsza instrukcja po warunku pętli, a druga instrukcja po treści pętli. Jeśli drugie zdanie jest puste, staje się brakiem operacji . To natomiast działa dokładnie tak samo jak Python, więc będzie oceniać niezerowe liczby całkowite jako True, a zero jako false.Pierwsze zdanie po chwili zaczyna się od znaku nowej linii. Odpowiada to funkcji „print and return with newline” Pytha. To wymaga jednego argumentu, który jest następnie drukowany, a także zwracany bez modyfikacji. To pozwala nam wydrukować kroki pośrednie, jednocześnie wykonując potrzebne operacje.
Argument przekazany do tej funkcji drukowania zaczyna się od,
~
który jest nieco wyjątkowy. Jeśli znak znajdujący się bezpośrednio za nim~
jest zmienną, przyjmuje dwa argumenty, w przeciwnym razie przyjmuje jeden. PonieważO
nie jest zmienną,~
zajmie tylko jeden argument.~
działa podobnie jak+=
w wielu konwencjonalnych językach, chociaż najbliższym operatorem byłby operator post-inkrementacyjny++
zC
. Być może wiesz, żex++
to będzie jak użyciex
jako bieżącej wartości, ale późniejx
będziex+1
.~
to ten sam pomysł, ale uogólniony na wynik pierwszego argumentu. Sposób wyboru zmiennej, do której ma zostać przypisana, zostanie rozwiązany później.Argument
~
IsO
która jest bardzo prosta. Gdy jedynym argumentem jest liczba całkowita,O
zwraca losowo wartość od 0 do jednego mniejszą od tej liczby całkowitej.Teraz mogłeś zauważyć,
O
że nie ma argumentu. Tutaj interpreter Pyth uprzejmie wypełnia przypuszczenie, która tutaj jest zmiennąQ
.Q
ma specjalne znaczenie w Pyth: gdy tylko jest obecny w programie, program Pyth zaczyna się od przypisaniaQ
do danych wejściowych programu. Ponieważ jest to pierwsza zmienna występująca w~
argumencie,Q
teraz jest ona również zmienną,~
która przypisze wartość.Podsumowując, nasz „czytelny” program może wyglądać następująco:
Jeden przykładowy „przebieg” może wyglądać następująco:
O
zwraca 3,~
zwraca 5,\n
zwraca i drukuje 5, co jest prawdąO
zwraca 0,~
zwraca 3,\n
zwraca i drukuje 3, co jest prawdąO
zwraca coś nieistotnego,~
zwraca 0,\n
zwraca i drukuje 0, co jest fałszemźródło
APL (Dyalog Unicode) ,
129 bajtówAnonimowa ukryta funkcja prefiksu. Przyjmuje się
⎕IO
( I ndex O rigin)0
, co jest domyślne w wielu systemach. Zwraca końcową wartość (0) oprócz drukowania podczas uruchamiania.Wypróbuj online!
{
…}⍣=
Zastosuj następującą funkcję do uzyskania stabilności:⎕←⍵
wyprowadzić argument?
zwraca równomiernie rozłożoną liczbę losową z zakresu od 0 do tej – 1⌊
zaokrąglić w dół (ponieważ?0
daje liczbę (0,1))źródło
C (gcc) ,
4042 bajtówNiektórzy idioty ™ zapomnieli najpierw wydrukować wartość początkową.
Nie panikuj.
źródło
f(K){while(K)printf("%d\n",K),K=rand()%K;}
. Nadal masz moją +1 za równe rozwiązanie!f(K){while(K)printf("%d\n",K,K=rand()%K);}
x86 + rdrand, 19 bajtów
Prosta implementacja. Pobiera dane wejściowe K
ecx
i dane wyjściowe do buforaebx
.źródło
Python 3 , 39 bajtów
Prawdopodobnie nie jest to najbardziej kryptograficznie bezpieczny generator liczb losowych, ale dla ludzkiego oka wygląda wystarczająco losowo ...
Wypróbuj online!
źródło
k=0
jest dopuszczalne.hash()
próbuje utrzymać, ale nie gwarantuje tej właściwości. Do tego zadania należy użyćrandom
modułu.random.randrange()
:from random import*;f=lambda k:print(k)or f(randrange(k))
TI-Basic (TI-84 Plus CE),
1713 bajtów-4 bajty od Miszy Ławrow
Pobiera dane wejściowe
Ans
jako50:prgmNAME
.TI-Basic to tokenizowany język . Wszystkie użyte tutaj tokeny są jednobajtowe.
Wyjaśnienie:
11-bajtowe rozwiązanie sugerowane przez Misza Ławrow, które wymaga naciśnięcia
enter
po każdej linii po pierwszej.źródło
int(Ansrand
jest krótszy. Ponadto, używającPause
zamiastDisp
, możesz zrobić jedyną instrukcję w pętli bePause int(Ansrand
, która również się aktualizujeAns
.Python 2 ,
646260 bajtówWypróbuj online!
Zapisano
źródło
while 1:print k;k=randint(0,~-k)
powinno działać (z błędem na końcu)while 1:print k;k=randrange(k)
zapisuje dwa.C ++ (gcc), 98 bajtów
Wypróbuj tutaj!
Stosowanie
To moja pierwsza próba golfowego kodu. Wszelkie opinie i uwagi są mile widziane.
Edycja: Usunięto główną funkcję zgodnie z sugestią, aby była poprawna.
źródło
-Dd='printf("%i,",x'
zamiast#define
spowoduje zaoszczędzenie części bajtów (-4) i jest dozwolone, o ile liczymy bajty do wyniku (ponieważ jest to niestandardowa dyrektywa preprocesorowa. Można również pominąć importowanie (w najmniej z-std=c++98
i-w
, które nie liczą się jako bajty), i typy zmiennych. Więc miałbyśp(x){d);while(x>0)d=rand()%x;}
i-Dd='printf("%i,",x'
.> <>, 92 + 2 bajty
+ 2B dla flagi -v
Wypróbuj online!
> <> jedynym źródłem losowości jest instrukcja „x”, która ustawia kierunek wskaźnika instrukcji na losową wartość. Dlatego generowanie liczby losowej od 0 do n nie jest trywialne.
Najpierw obliczam, ile bitów jest wymaganych do przedstawienia liczby w zakresie [0, n), a następnie generuję losowe bity, aby wygenerować liczbę losową. Pozostawia to możliwość wygenerowania liczby nieco większej niż n, w takim przypadku po prostu ją odrzucamy i próbujemy ponownie.
Wyjaśnienie:
źródło
MATLAB (
4946 bajtów)Przykładowe dane wyjściowe:
źródło
k=randi(k)-1
za kilka bajtów mniej.Retina , 21 bajtów
Wypróbuj online! Wyjaśnienie:
Powtarzaj, aż wartość przestanie się zmieniać (tj. 0).
Wydrukuj wartość przed każdym przejściem przez pętlę.
Konwertuj na unary.
Utwórz zakres i przekonwertuj na dziesiętny.
Wybierz losowy element.
źródło
Pyth ,
67 bajtówWypróbuj online!
+1, aby wydrukować początkową wartość wejściową.
Podczas gdy Q jest prawdą, ustaw Q na losową liczbę całkowitą od 0 do Q i wypisz Q.
Nie jest to najkrótsza odpowiedź na Pyth'a, ale dopiero się uczę i piszę tylko z powodu niedawnej dyskusji o tym, że nikt już nie korzysta z Pyth'a :)
źródło
=
i~
użyć pierwszej zmiennej wyrażenia jako zmiennej, która zostanie przypisany, jeżeli nie jest określona. Na przykład~hT
ustawi wartośćT
11 podczas zwracania 10. Jedyną inną wymyślną sztuczką jest to, że znak nowego wiersza wypisuje dane wejściowe, a następnie zwraca tę wartość bez modyfikacji, abyśmy mogli mieć pustą treść pętli. Daj mi znać, jeśli coś innego jest mylące :)Haskell ,
7471 bajtów-3 bajty, faktycznie wykonując to, co mówią specyfikacje.
Wypróbuj online!
źródło
Formuła IBM / Lotus Notes, 48 bajtów
Formuła pola, która pobiera dane z innego pola
i
.Nie ma TIO dla formuły, więc oto zrzut ekranu przykładowego wyjścia:
źródło
PowerShell,
3632 bajtów-4 bajty dzięki AdmBorkBork
Skrypt testowy:
Wydajność:
źródło
Get-
to sugerowane , więc możesz usunąć je na -4 bajty Wypróbuj online!PowerShell , 35 bajtów
Wypróbuj online!
Pełny program Pobiera dane wejściowe
$args
, zapisuje je$a
i wchodzi wfor
pętlę. Każda iteracja sprawdzamy, czy$a
nadal jest dodatnia (podobnie jak0
falsey w PowerShell). Następnie wychodzimy$a
z rurociągu i przechodzimy do następnej iteracji, w której ustawiliśmy$a
wynikGet-Random $a
, który zwraca liczbę całkowitą z zakresu0..($a-1)
.(Ab) wykorzystuje fakt, że PowerShell generuje dodatkowy końcowy znak nowej linii zamiast wypisywania końcowego zera (dozwolonego przez reguły jak obecnie napisane).
źródło
"$args"
- miły. Utknąłem na$args[0]
w tym przypadkuLua , 58 bajtów
Wypróbuj online!
Po więcej miłości Lua tutaj :)
źródło
r
deklaracji i przenieść ją dor
instrukcji while, robiąc to, użyjesz 1 bajta mniej dla spacji (p,r=print,...p(r)while
).