Losowanie do 0

29

Wyzwanie

Post w piaskownicy

Biorąc pod uwagę dodatnią liczbę całkowitą (K)Wyprowadza jednolicie losową liczbę całkowitą (Y)pomiędzy [0, K).

Jeśli Y > 0przyjmij K = Yi 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
Luis Felipe De Jesus Munoz
źródło
Jeśli przesłanie jest funkcją, czy może zwrócić 0 oprócz wydrukowania?
Adám
1
@ Adám tak, możesz wrócić dodatkowo
Luis Felipe De Jesus Munoz
Czy muszę zasiać mój RNG?
SIGSTACKFAULT
Czy możemy drukować bez ograniczników?
Tytus
Zainteresowałem się. Dość łatwo udowodnić, że średnia liczba kroków, które program wykonuje przed zakończeniem, to H (K-1) + 1, gdzie H (K) jest liczbą K-tej harmonicznej . Dla n = 1000 to średnio 8.484 kroki.
J.Doe

Odpowiedzi:

19

Pyth , 6 5 4 bajtów

.uOW

Wypróbuj tutaj!

Jak to działa

.uOW Pełny program. Pobiera liczbę całkowitą ze STDIN i wysyła listę do STDOUT.
.u Łączny punkt stały. Zastosuj daną funkcję o podanej wartości początkowej,
        który jest domyślnie przypisany do danych wejściowych, aż do wystąpienia wyniku 
        zanim zostanie znaleziony. Zwraca listę wyników pośrednich.
   W Warunkowe zastosowanie. Jeśli argument (bieżąca wartość) jest prawdziwy, to
        zastosuj poniższą funkcję, w przeciwnym razie pozostaw ją bez zmian.
  O Losowa liczba całkowita z zakresu [0, N).
        IOW: przy każdej iteracji .u przypisz zmienną N do bieżącej wartości, zaczynając
        z wejściem. Jeśli N nie jest równe 0, wybierz losową liczbę całkowitą w [0, N), w przeciwnym razie
        zwraca N bez zmian. Ilekroć napotkamy 0, następna iteracja musi również
        skutkuje wartością 0, a zatem pętla się tam zatrzymuje.
Pan Xcoder
źródło
1
Widziałem sposób na zrobienie tego w Pyth, ale jestem początkujący. Poszanowanie. Język miesiąca w sierpniu może?
ElPedro,
15

C (gcc) , 42 bajty

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

Wypróbuj online!

Wykorzystuje logikę zwartą i.

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 bajtów (bez wartości początkowej drukowania)

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

Wypróbuj online!

Wykorzystuje logikę zwartą i.

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
LambdaBeta
źródło
4
rand()%_nie jest jednolity
njzk2
(jeśli nie jesteś przekonany, spróbuj użyć sześciościennych kości, aby wygenerować wartość [1,5] przy użyciu tej metody.)
njzk2
3
W pełni zdaję sobie sprawę, że rand () jest prawie zawsze stronniczy (z powodu obcięcia), ale standard tego nie gwarantuje (RAND_MAX może teoretycznie być wielokrotnością wszystkich naszych liczb, na szczęście: P, chociaż zwykle wynosi ~ 65k ). W praktyce zakresy, z którymi mamy do czynienia, będą wydawać się wystarczająco losowe, aby nie wyróżniać się na tle podobnych zgłoszeń w tym wyzwaniu.
LambdaBeta
1
pochodzi z wyzwania „Wyjście jednorodnie losowej liczby całkowitej”, więc ściśle mówiąc, to nie jest poprawne
njzk2
3
Ściśle mówiąc, wszystkie języki tutaj używają prng. Żaden z nich nie poda prawdziwie jednolitej liczby losowej (która wymagałaby idealnego źródła entropii). Chociaż wiele z nich jest bardziej jednolitych, nie jest to zauważalne w iteracjach log (k).
LambdaBeta,
10

R , 66 60 56 43 41 bajtów

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

Wypróbuj online!

ngm
źródło
Nie sądzę, że potrzebujesz >0i cat(n,"")(pusty ciąg) też będzie działać.
Giuseppe,
Ale myślę, że printjest tu bardziej wydajna, ponieważ zwraca swój argument: 56 bajtów
Giuseppe
Również 56 bajtów:k=scan();while(x<-sample(1:k-1,1))k=c(x,k);cat(rev(k),0)
JAD
1
Zapomniałem usunąć nawiasy klamrowe, abyś mógł zapisać jeszcze 2 bajty;) Wypróbuj online!
digEmAll
2
39 bajtów:n=scan();while(print(n))n=sample(n,1)-1
djhurio,
6

MATL , 6 bajtów

`tYrqt

Wypróbuj online!

Wyjaśnienie

`        % Do...while
  t      %   Duplicate. Takes input (implicit) the first time
  Yr     %   Uniform random integer from 1 to n, included
  q      %   Subtract 1
  t      %   Duplicate. This will be used as loop condition
         % End (implicit). Proceeds with next iteration if non-zero
         % Display stack (implicit)
Luis Mendo
źródło
6

Pepe , 25 bajtów

Pepe to język programowania stworzony przez użytkownika Soaku .

REeErEErReEEreeEREEeEEree 

Wypróbuj online!

Wyjaśnienie:

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
niezdefiniowany
źródło
5

Perl 6 , 18 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który zwraca listę wartości. Jeśli nie przeszkadza ci to, że liczby są zakresami, możesz:

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

dla 17 bajtów. Co ciekawe, kolejna wbudowana funkcja losowa rollma w tym przypadku takie samo zachowanie dla tej samej ilości bajtów.

Jo King
źródło
5

Galaretka ,  4  3 bajty

XƬ0

Jest to monadyczne łącze (funkcja), które drukuje tablicę i zwraca 0 .

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
Bardzo fajne przekreślenie 4!
ngm
1
Czy nie chcielibyśmy, aby 4 przekreślone wyglądało jak zwykłe 4?
Dennis
4

Brachylog , 8 bajtów

ẉ?ℕ₁-₁ṙ↰

Wypróbuj online!

Wyjaśnienie

ẉ          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

Rekurencja zatrzyma się, gdy ?ℕ₁zakończy się niepowodzeniem, to znaczy, gdy wejście jest 0.

Fatalizować
źródło
4

05AB1E , 8 7 bajtów

Δ=L<Ω0M

Wypróbuj online!

Wyjaśnienie

Δ         # loop until value doesn't change
 =        # print current value
  L<Ω     # push a random number in ([1 ... X] - 1)
          # will return -1 when X=0
     0M   # push max of that and 0
Emigna
źródło
1
Δ=ݨΩ0Mjest równoważne.
Magic Octopus Urn
4

J, 13 bajtów

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

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)za Kwię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!

kapusta
źródło
To tylko ja czy kod zwraca to samo wyjście?
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz ktoś, kto zna J lepiej, niż mógłbym wyjaśnić, ale myślę, że RNG zawsze zaczyna się od tego samego ziarna. Istnieje również ustalone ziarno ?., ale nie sądzę, żebym tego używał.
cole
@cole masz rację.
Jonah
4

JavaScript (ES6), 38 37 bajtów

-1 bajt dzięki @Arnauld

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

Herman L.
źródło
Czy w ogóle możesz zmniejszyć matematyka? np. z codegolf.stackexchange.com/a/35648/67066
Marie
1
@Marie new Date%nnaprawdę nie działa tutaj, ponieważ nie zmienia się wystarczająco szybko, aby być użytecznym do generowania wielu liczb losowych
Herman L
4

C, 38 bajtów

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

Wypróbuj online

Nie golfił

void f(int k){
    printf("%d ",k);
    if(k)
        f(rand()%k);
}
Geo
źródło
1
Możesz zapisać bajt, zastępując trójskładnikowego operatorem &&; możesz też rozważyć rozstawienie RNG w swojej mainfunkcji: Wypróbuj online!
ErikF,
1
Możesz także całkowicie pozbyć się trójskładnika i zakończyć się błędem. 34 bajty
Jo King
4

Pyth , 4 bajty

W
~O

Wypróbuj online!

To w zasadzie implementuje algorytm:

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

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 3Jest (1 + 2) * 3), możemy zaczynać od lewej strony i uzupełniać argumenty.

Wrozpoczyna 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ż Onie jest zmienną, ~zajmie tylko jeden argument. ~działa podobnie jak +=w wielu konwencjonalnych językach, chociaż najbliższym operatorem byłby operator post-inkrementacyjny ++z C. Być może wiesz, że x++to będzie jak użycie xjako bieżącej wartości, ale później xbędzie x+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 ~Is Októra jest bardzo prosta. Gdy jedynym argumentem jest liczba całkowita, Ozwraca 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. Qma specjalne znaczenie w Pyth: gdy tylko jest obecny w programie, program Pyth zaczyna się od przypisania Qdo danych wejściowych programu. Ponieważ jest to pierwsza zmienna występująca w ~argumencie, Qteraz jest ona również zmienną, ~która przypisze wartość.

Podsumowując, nasz „czytelny” program może wyglądać następująco:

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

Jeden przykładowy „przebieg” może wyglądać następująco:

  1. Q = 5
  2. Ozwraca 3, ~zwraca 5, \nzwraca i drukuje 5, co jest prawdą
  3. Q = 3
  4. Ozwraca 0, ~zwraca 3, \nzwraca i drukuje 3, co jest prawdą
  5. Q = 0
  6. Ozwraca coś nieistotnego, ~zwraca 0, \nzwraca i drukuje 0, co jest fałszem
  7. Q = coś nieistotnego
  8. Zakończyć
FryAmTheEggman
źródło
3

APL (Dyalog Unicode) , 12 9 bajtów

Anonimowa 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ż ?0daje liczbę (0,1))

Adám
źródło
3

C (gcc) , 40 42 bajtów

Niektórzy idioty ™ zapomnieli najpierw wydrukować wartość początkową.

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

Nie panikuj.

SIGSTACKFAULT
źródło
Jesteś przywiązany do mnie, kwestia wymaga również, aby wydrukować początkową K. Bez niej Dostałam też 40. Można również uzyskać 42 wersji w pełni zgodnego w podobny sposób: f(K){while(K)printf("%d\n",K),K=rand()%K;}. Nadal masz moją +1 za równe rozwiązanie!
LambdaBeta
Jeszcze lepiej:f(K){while(K)printf("%d\n",K,K=rand()%K);}
SIGSTACKFAULT,
3

x86 + rdrand, 19 bajtów

Prosta implementacja. Pobiera dane wejściowe K ecxi dane wyjściowe do bufora ebx.

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  
qwr
źródło
3

Python 3 , 39 bajtów

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

Prawdopodobnie nie jest to najbardziej kryptograficznie bezpieczny generator liczb losowych, ale dla ludzkiego oka wygląda wystarczająco losowo ...

Wypróbuj online!

Luca Citi
źródło
Uwagi: 1) pozycja daje (zwykle) różne wyniki za każdym razem, gdy jest uruchamiana w nowym tłumaczu, ale może dawać ten sam wynik, jeśli jest uruchamiana w tej samej sesji Pythona. 2) Zakładam, że zakończenie przez błąd bez wyraźnego sprawdzenia k=0jest dopuszczalne.
Luca Citi,
Przykro nam, ale funkcje muszą być dowolnie wielokrotnego użytku w tym samym środowisku. Dopuszczalne jest zakończenie błędu
Jo King,
Zadanie wymaga jednolitej liczby losowej z podanego zakresu. hash() próbuje utrzymać, ale nie gwarantuje tej właściwości. Do tego zadania należy użyć randommodułu.
David Foerster,
Za pomocą tylko 57 bajtów możesz zmienić swoje rozwiązanie, aby używać jednakowo losowych liczb od 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 bajtów

While Ans
Disp Ans
int(randAns
End
Ans

-4 bajty od Miszy Ławrow

Pobiera dane wejściowe Ansjako 50:prgmNAME.

TI-Basic to tokenizowany język . Wszystkie użyte tutaj tokeny są jednobajtowe.

Wyjaśnienie:

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-bajtowe rozwiązanie sugerowane przez Misza Ławrow, które wymaga naciśnięcia enterpo każdej linii po pierwszej.

Ans
While Ans
Pause int(randAns
End
pizzapanty184
źródło
1
int(Ansrandjest krótszy. Ponadto, używając Pausezamiast Disp, możesz zrobić jedyną instrukcję w pętli be Pause int(Ansrand, która również się aktualizuje Ans.
Misza Ławrow
3

Python 2 , 64 62 60 bajtów

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

Wypróbuj online!


Zapisano

  • -2 bajty, dzięki Jonathan Allan
TFeld
źródło
„Wejście musi być najpierw wydrukowane” ... while 1:print k;k=randint(0,~-k)powinno działać (z błędem na końcu)
Jonathan Allan
... a następnie while 1:print k;k=randrange(k)zapisuje dwa.
Jonathan Allan,
1
@JonathanAllan Dzięki :), pytania mówią, że mogę użyć pustej linii zamiast 0, więc nie ma błędu.
TFeld
3

C ++ (gcc), 98 bajtów

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

Wypróbuj tutaj!

Stosowanie

int main() {
    p(100);
}

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.

eKKiM
źródło
1
Cześć, witamy w PPCG :) Nie musisz uwzględniać przykładowego wywołania w swojej liczbie bajtów (tzn. Nie musisz pisać głównej funkcji), ponieważ akceptujemy funkcje jako prawidłowe zgłoszenia. W przeciwnym razie przesłanie jest technicznie niepoprawne, ponieważ jeśli dane wejściowe składałyby się z dwóch lub więcej cyfr, wynik może być niejednoznaczny. Jeśli po prostu dodasz spację na końcu ciągu formatu w swoim makrze, wszystko powinno być w porządku. Miłej gry w golfa!
FryAmTheEggman
Dodanie flagi kompilatora -Dd='printf("%i,",x'zamiast #definespowoduje 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++98i -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'.
Powinieneś również sprawdzić Standardowe luki i porady dotyczące gry w golfa w C , jeśli jeszcze tego nie
3

> <>, 92 + 2 bajty

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

+ 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:

: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
Sasha
źródło
Bardzo dobrze! Niezależnie od tego wpadłem na ten sam pomysł; bez białych znaków moje rozwiązanie używa kilku znaków mniej niż twoje, ale udało ci się stworzyć znacznie bardziej zwarty blok kodu.
Théophile,
2
Obecny meta konsensus polega na tym, że nie trzeba liczyć bajtów używanych na flagach
Jo King
3

MATLAB ( 49 46 bajtów)

@(k)eval('while k;disp(k);k=randi(k)-1;end;0')

Przykładowe dane wyjściowe:

>> @(k)eval('while k;disp(k);k=randi(k)-1;end;0')
ans(5)

ans = 

    @(k)eval('while k;disp(k);k=randi(k)-1;end;0')

     5    
     3    
     2    
     1   

ans =    
     0
aaaaa mówi o przywróceniu Moniki
źródło
1
Podejrzewam, że możesz zrobić k=randi(k)-1za kilka bajtów mniej.
Sanchises,
2

Retina , 21 bajtów

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

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.

L$`.
$.`

Utwórz zakres i przekonwertuj na dziesiętny.

G?`

Wybierz losowy element.

Neil
źródło
2

Pyth , 6 7 bajtów

QWQ=OQQ

Wypró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 :)

ElPedro
źródło
2
Udało mi się powiązać za pomocą skumulowanej redukcji, ale zachowując ją jako program proceduralny. Dzięki za motywację do gry w golfa :)
FryAmTheEggman
To super. Wciąż próbuję ustalić, jak to działa (dlaczego).
ElPedro
Domyślnie zarówno =i ~użyć pierwszej zmiennej wyrażenia jako zmiennej, która zostanie przypisany, jeżeli nie jest określona. Na przykład ~hTustawi wartość T11 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 :)
FryAmTheEggman
1
@FryAmTheEggman That's beautiful.
isaacg,
1
@isaacg Thanks! Początkowo chciałem, żeby to właśnie tutaj edytować, ale postanowiłem coś napisać, ponieważ chciałem wypróbować MathJax. Tego rodzaju odpowiedzi w Pythonie były zawsze moim ulubionym, ponieważ czują się zarówno celowe, jak i obelżywe :)
FryAmTheEggman
2

Haskell , 74 71 bajtów

-3 bajty, faktycznie wykonując to, co mówią specyfikacje.

import System.Random
f 0=pure[0]
f x=randomRIO(0::Int,x-1)>>=fmap(x:).f

Wypróbuj online!

ბიმო
źródło
2

Formuła IBM / Lotus Notes, 48 ​​bajtów

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

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:

wprowadź opis zdjęcia tutaj

ElPedro
źródło
2

PowerShell, 36 32 bajtów

-4 bajty dzięki AdmBorkBork

filter f{$_;if($_){Random $_|f}}

Skrypt testowy:

filter f{$_;if($_){Random $_|f}}

100 |f

Wydajność:

100
61
20
8
6
3
0
mazzy
źródło
2
Jest Get-to sugerowane , więc możesz usunąć je na -4 bajty Wypróbuj online!
AdmBorkBork
2

PowerShell , 35 bajtów

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

Wypróbuj online!

Pełny program Pobiera dane wejściowe $args, zapisuje je $ai wchodzi w forpętlę. Każda iteracja sprawdzamy, czy $anadal jest dodatnia (podobnie jak 0falsey w PowerShell). Następnie wychodzimy $az rurociągu i przechodzimy do następnej iteracji, w której ustawiliśmy $awynik Get-Random $a, który zwraca liczbę całkowitą z zakresu 0..($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).

AdmBorkBork
źródło
"$args"- miły. Utknąłem na $args[0]w tym przypadku
Mazzy
2

Lua , 58 bajtów

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

Wypróbuj online!

Po więcej miłości Lua tutaj :)

Lycea
źródło
Hej, możesz usunąć +0 z rdeklaracji i przenieść ją do rinstrukcji while, robiąc to, użyjesz 1 bajta mniej dla spacji ( p,r=print,...p(r)while).
Visckmart,