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

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.

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

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!


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)

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

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.



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.

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.


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

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!


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):[]]


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

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:

Q←inputRepeat1.temp←Q2.Q←unif{0,Q−1}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ć

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))


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.


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  

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!


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

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

„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.


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

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

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.


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


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

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



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).


"$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 :)


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.