Losowy golf dnia 8: Przetasuj nieskończoną listę

23

O serii

Po pierwsze, możesz potraktować to jak każde inne wyzwanie związane z golfem i odpowiedzieć na nie, nie martwiąc się w ogóle serią. Istnieje jednak tabela wyników dla wszystkich wyzwań. Możesz znaleźć tabelę liderów wraz z kilkoma więcej informacji o serii w pierwszym poście .

Dziura 8: Przetasuj nieskończoną listę

Powinieneś napisać funkcję lub program, który pobiera nieskończoną listę jako dane wejściowe i zwraca losową wersję tej listy.

O nieskończonych wejściach / wyjściach

Istnieje kilka sposobów na uzyskanie danych wejściowych i uzyskanie wyników dla tego wyzwania:

  • Możesz wziąć listę dodatnich liczb całkowitych lub ich ciąg reprezentujący albo ciąg znaków lub listę drukowalnych znaków ASCII (od 0x20 do 0x7E włącznie). Format wyjściowy musi być zgodny z formatem wejściowym. Odtąd będę odtąd określał dane jako „listę”, niezależnie od wybranej opcji.
  • Możesz odczytać listę z nieskończonego standardowego strumienia wejściowego i zapisywać dane wyjściowe w sposób ciągły do ​​nieskończonego standardowego strumienia wyjściowego. Rozwiązanie nie powinno zależeć od żadnej konkretnej wartości lub sekwencji wartości, aby zapewnić, że strumień wyjściowy jest regularnie zapisywany i opróżniany (np. Nie można po prostu zapisywać danych wyjściowych, gdy jest 5na liście wejściowej). Oczywiście, jeśli czytasz ciąg reprezentujący listę, możesz poczekać, aż pojawi się separator listy.
  • W językach, które je obsługują, możesz napisać funkcję, która pobiera i zwraca leniwą nieskończoną listę lub ciąg znaków.
  • W językach, które je obsługują, możesz zaimplementować nieskończony generator, który pobiera inny generator jako dane wejściowe.
  • Alternatywnie możesz napisać funkcję, która nie przyjmuje argumentów i zwraca jedną wartość wyjściową za każdym razem, gdy jest wywoływana. W takim przypadku można założyć, że zdefiniowano funkcję, która nie przyjmuje żadnych argumentów i zwraca kolejną wartość wejściową za każdym razem, gdy jest wywoływana. Możesz dowolnie wybrać nazwę tej funkcji.

Możesz założyć, że twój program działa wiecznie i że nieskończona pamięć jest dostępna. (Można to rozwiązać za pomocą skończonej ilości pamięci, ale oznacza to, że możesz wyciec pamięć.)

O losowości

Dla każdej wartości v, która jest odczytywana w pozycji i nieskończonego sygnału wejściowego, musi istnieć dodatnie prawdopodobieństwo, że znajdzie się ona w dowolnej pozycji od i-9 do i + 9 nieskończonej mocy wyjściowej (chyba że ta pozycja byłaby ujemna ). Prawdopodobieństwa te nie muszą być takie same dla różnych pozycji wyjściowych ani nawet dla różnych pozycji wejściowych. W porządku, jeśli twoje rozwiązanie może również przetasować wartości do innej pozycji, która jest dalej.

Dlatego nie jest konieczne, aby twoje rozwiązanie mogło przetasować pierwszą wartość bardzo daleko w dół listy, lub aby mogło przetasować bardzo późną wartość do pierwszej pozycji, chociaż jest w porządku, jeśli tak, dopóki wszystkie pozycje 9 kroków od dane wejściowe są możliwe.

Na przykład, jeśli wziąłeś następujący ciąg jako dane wejściowe, ___wskazuje wszystkie pozycje, które Xmuszą być w stanie znaleźć się w wyniku:

                  ___________________
 abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...

Jeśli w Twoim języku nie ma wbudowanego generatora liczb losowych lub nie chcesz go używać, możesz wziąć dodatkową wartość początkową jako dane wejściowe i zaimplementować własny odpowiedni RNG za pomocą tego parametru. Ta strona może być do tego pomocna.

Bez względu na faktyczną dystrybucję, z której korzysta twoje rozwiązanie, prawie na pewno wygeneruje następną wartość po skończonym (ale arbitralnym) czasie.

Dołącz krótkie wyjaśnienie, w jaki sposób Twoje wdrożenie spełnia te wymagania.

Punktacja

To jest , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .

Tabela liderów

Pierwszy post z serii generuje tabelę wyników.

Aby mieć pewność, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

# Ruby, <s>104</s> <s>101</s> 96 bytes

(Język nie jest obecnie wyświetlany, ale fragment go wymaga i analizuje, a w przyszłości mogę dodać tabelę wyników według języków).

Martin Ender
źródło
2
Czy możemy założyć, że dostępny jest nieskończony czas / pamięć?
Mego
Jeśli w języku jest coś, co nazywa się generatorem liczb losowych, czy naprawdę musimy go używać?
feersum
1
@Mego Nieskończony czas, oczywiście. I nieskończona pamięć, tak jak zwykle w przypadku wyzwań, które wymagają programów przetwarzających dane na zawsze (możliwe jest rozwiązanie tego w pamięci skończonej, ale nie chcę karać języków zmuszonych do wycieku pamięci).
Martin Ender
@feersum Powinienem chyba sprecyzować wymagania generatora liczb losowych samemu zbudować nieco bardziej precyzyjnie, ale nie wyobrażam sobie, aby implementacja własnego była krótsza niż wbudowana RNG w większości przypadków?
Martin Ender
@feersum Wyjaśniłem nieco tę część i odniosłem się do naszej standardowej definicji losowości.
Martin Ender

Odpowiedzi:

13

Python 3 , 78 bajtów

from random import*
l=[]
while[shuffle(l)]:l[9:]and print(l.pop());l+=input(),

Wypróbuj online!

Pobiera dane wejściowe ze STDIN (jeden na linię), drukuje do STDOUT.

Utrzymuje bufor ldo 10 elementów. Bufor jest tasowany z każdym krokiem. Gdy jego długość wynosi 10, ostatni element jest drukowany i usuwany.

Jeśli element zostanie wydrukowany zaraz po jego wstawieniu, przeskoczył przed 9 innymi elementami oczekującymi w buforze, więc wydaje się, że pozostało 9 miejsc. Element może czekać w buforze dowolnie długo, więc jego pozycja może przesunąć dowolną kwotę w prawo.

Wydaje się, że nie ma dobrego sposobu na tworzenie i usuwanie losowego elementu z listy. Tasowanie wydaje się przesadą. Jest o 2 bajty dłużej w użyciu l.pop(randint(0,9))(co oznacza, że ​​lista ma 10 elementów).

from random import*
l=[]
while 1:l+=input(),;l[9:]and print(l.pop(randint(0,9)))

Nie ma nic lepszego x=choice(l);l.remove(x). Język z poprandompodobnymi

poprandom = lambda l:l.pop(randrange(len(l)))

można bardzo czysto zrobić

from random import*
l=[]
while 1:l+=input(),;l[9:]and print(poprandom(l))
xnor
źródło
9

Befunge ( smak dziwaczny ), 4 bajty

?,?~

,odczytuje znak ze strumienia i wypycha go na stos. ~wyrzuca górną postać ze stosu (jeśli jest obecna) i drukuje ją. ?losuje, które polecenie zostanie wykonane jako następne. Tak więc algorytm jest następujący: „W nieskończonej pętli, z jednakowym prawdopodobieństwem albo popchnij znak, albo pop znak”. Myślę, że spełnia to wymagania: postać może zobaczyć dowolną liczbę znaków dodanych nad nią na stosie, dzięki czemu może przesuwać się dowolnie daleko w prawo, i może być drukowana, gdy stos jest dowolnie duży, więc może dowolnie przenieść się do lewo.

histocrat
źródło
5
Czy to wyjście nie ma bajtów zerowych, jeśli stos jest pusty?
feersum
Implementacja, którą podłączyłem, nie działa; Zgadzam się ze specyfikacją Befunge, że powinien.
histocrat
2
Zabawne, że przeglądarka zjada bajty zerowe. Nazywa swoją implementację putchar („\ 0”), ale FF >> document.getElementById("output").innerHTML = "a\0b" >> document.getElementById("output").innerHTML "ab"
usuwa
Aha, zastanawiałem się, czy coś dziwnego dzieje się w przeglądarce. Myślę, że mój Chrome też to robi. No cóż, to jest pewna technika, ale myślę, że mniej więcej w duchu strony jest opublikowanie rozwiązania, które działa tylko w niektórych tłumaczach działających w niektórych środowiskach.
histocrat
4

C (gcc) , 94 bajty

L;i;f(s){srand(s);int B[9]={0};for(L=0;;)L>9&&putchar(B[i=rand()%10]),B[L>9?i:L++]=getchar();}

Wypróbuj online!

Ok, link TIO nie ma większego sensu. Dla ułatwienia testowania stworzyłem następujący program C, który wypisze losowe znaki ascii lub powtórzy ciąg nieskończenie.

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char** argv){
    srand(time(NULL));
    if(argc < 1) {
        for(;;){
            printf("%c", rand() % 95 + 32);
        }
    } else {
        char* s = argv[1];
        int i = 0;
        for(;;){
            if(s[i] == 0)
                i = 0;
            printf("%c", s[i++]);
        }
    }
}

Ten program będzie nazywany iro.

Poprawność programu

To, co tu robię, to wczytywanie 9wartości do bufora. Następnie losowe indeksy są wybierane z tej tablicy i są wyprowadzane, a następnie zastępowane przez następny znak w strumieniu.

Conor O'Brien
źródło
3

SILOS , 149 bajtów

b=1
lbla
x=15+b*15
b=1
lblb
readIO
queue 0 i
x-1
if x b
a=0
lblx
x=rand*2
queuePop 0
if x X
printInt m
a+1
b=15-a
if b x
GOTO a
lblX
queue 0 m
GOTO x

Wypróbuj online!

Zasadniczo ciągle pobiera dane wejściowe (w tłumaczu online za pomocą argumentów, ale w oficjalnym tłumaczu offline umożliwia pisanie w konsoli (nieskończenie)) w blokach po 15 na raz (30 pierwszy blok).

Ładuje dane wejściowe do tymczasowej kolejki i wybiera szczęśliwą 15 (losowo, ale nie równo równo pod względem prawdopodobieństwa lub dystrybucji).

Reszta pozostaje, gdy nowe dane wejściowe wypełniają kolejkę, pierwsze dane wejściowe mogą być tasowane do samego końca (w zasadzie myślę, że znaki mają normalny rozkład). Warto zauważyć, że ten program jest tylko dwa razy bardziej gadatliwy niż python i być może „bardziej golfowy” niż Java.


Aby lepiej zobaczyć wyniki, mam wersję niezgodną, ​​która pobiera dane wejściowe jako ciąg znaków (jednak może przyjąć tylko około 8 000 znaków).

Wypróbuj online!

Dla zabawy, oto ten post wprowadzony przez wersję strunową.

 [.L.Ooy „9beS.IS],„ 14 ts b1
 tylko

  = II
   x = 1b 15 1
5b a * b = lb rd # + lb eaI O e 
 x
 ifquu   
1 0x b
   =

    mi
0
   i lblxa -d * 2
    quu x = rn 
   x Xea p0
   pnInt ora
   mf = iePit
  ba 1
   GTO 1 fb x + Oa


 qe -lblX u0 m GOOue  
[rlT 

 tnn5! I.STii] [S.LO ie

htpsgthyx]: iub.om/jhujh .. tcraa.IOo /TytonieSu:wl/.L lnn!: tt / iS
[W hsto.un / nuslprxRUCoDsio /] e#NzZn6j4c/2xNQFnF7y0aLzkrosd9Dov2yxJNx774HBrgPUdi9CySI09sCLw5TJwB7jlB1XVeQFE7m1VMsIQvDOjBmdtME3umNzYXs9unFbqRamVDfUDw@RT3NHoL7/i04bz16DCoP4eulOU7jPD8OmYjATpynkuMDuBPYmtnIJzseyyhaNkMyQgXG2R782vqMDIiUm6Kq4Q3mJkxlUsR1rrldPw./l28Z SL.XS - IONuscOT "
senallyxMz.stiitkp ingN "
 eestaint on heeInliinrprt (oe e toghr tetgpnmntuon eruEuut rh ofi off, bhenecil inretea.atr ialoks tirilw upeitfleptly ty honso (e oote cenfine iwllbc 15 atly) nitloo aim (te) nikfte3 firs bck)
hs 0 It te 
 lodshipo alauttt.mpra quuet i reanicks a lck eooy d randomyn p 15 (uo equl, unbtty drbutedaynistinems oftrly ordisrprob ill abition h ibttmin.Tet ri)
 a nwit u ree nusfil th queusen 
pte ftip, ae uldsfuesis ob hl rlelth weual t tc hdyoend, f tbaaly thi an elnkhecarcthe (sc ho noreiItrolwaaldibtio lmiru.t 'iereaf) tsng tetntiottssht prasnon hogIms tylko twieatisi s vroscpython
 tte s / "gt 
Uzyskać tsvea non-omhTrehs a intntvesion hcahihk ine teuts sriprics at rwvritcaw aa g (hoee n onl kein n00 orscat, 0 cter).

[Tyauoas it onine! Hrhrys :.ru] p // o / lsslo # jVd (tinnexi3E @ KDpit / LrhtwXwVEUuscxPmJjFFCaNimMzlHiQEcMmdVIT7vqs8mNgxU3mD / J1AwXQ / ivbao1j @ nb4I6 / m93655bThmb4cy5TUX3xvI018cZzrXItuO5B @ NX5JD / HzyE @ G @ D5eqrGem3l0HPGRutZfpi2PzVA @ d3CVRTm4zJxnZdcFSTEO0JOT9KhDI6byjnLhS0cNmGz7hJrTdAgORT8Ndvv7DgZSbJdkp9v5al8qMyNCb9tXe0ChrShXRTOt @ 7fFgV3zTkbVbsD @ JpKina2oKgNVakjsjLCpD29u7l0XVRWalVTyArF1FqypQAxXb / BedqUqpJGOPVyxOjLj0jXup8cE277L2I6 @ lSowK5pA7nGldRBiJwyKxF6z2c3kW / sJ4EYBbbpSuBxs55nyI9sdnu @ nJJeGqtKprGEUbc6NDGMjjO2tN / KuKTWh2WWbbRRLVaq / P6KqkoMNWGRgTQZLlbXfQI050bY0rz0xmzCVZ4vowjpV0dCmkDFq0VNa5GSDzVn5Qw7idwPTxu5xTAtLQCDN / YIApfAn4dsDmYksCqUU27sRggpzRK4SmdjmPUPQO4j5FmgHMFRWS2eI1CfA2YIcf7JlylFjdZypVTH0IJu4ZJHiUviyBFKqhrkCjgXAAB8d710NhHgDwcJksuvPPprcfzHPTaJGFX8OIExW / cBZjaPiY7a4WD6rTYmOouBVucROlwvuBJiHWdJQjjbobNGTd7M1P6z8dw / A przy GU02hgjCcrjjQHkAdS6r7UjQ6wAPqB @ sIgxkKcbZDixeWS6mn160CKQpn7aUwGLK22u9I0oX6YIwPMhFVaX5uYon0AyoNTCZvnmtilVhV3 / pgTGc7r39lIS5PmqM / NGnUSLnTw9eTJ7qqrNQKsJHz @ Tt8mDZVWKCKTkBro1PuQAksDdN1yaVGiVXElRW9i5M11cINmxNGYAg9TD7sxtEDI2OkKMaBXgvO5dOplUQQIdpb2w66NePBScMmEnAX8ydGSiiHlss @ hOLZzInnIoTevRtEm / TGHWOkly5ljMK4FkgDDSWCWBW3YwmEVYCIBV @ GMIg3TZtGwMFWXVxQwBb5iD6PfS7h7Sric1ib5ZYIvW6n3tlaK7 / 6 @ 3OAHy4LjOuW @ tzaBP3 @ mFbJpHsVsQKPfeui / o1 @ aBcbZ4TK96T8tp3QjeA1vDXMKBIqdK @ HZs2vsMlQE36YmrBEnVRUvAGNuCt44e0RB0sL0MkNu1Q5wOwliTT2JQzVrOnHAmSXIU // sqjdG6jdT2r1v @@ lGjouzkGWoD4zhnzJBxo0OT6OTbBDgeDFRnY8TMXZbMPdxsCtbXeUxIBqST4VRwkpbgwChBcJxMx6hLIVZhfuylDvF1l26Nbl3xRLgQnatSCMigx @ PCT6lcG1ebdk / 86UBUFp9UkxjoCGSJnlxMtUdHf6IjkMnil5aua9L @ xXsdHEKW @ 8JpVqlgKsr12bAKG2Typfv @ Yy4CkUydETWphcdmdpWq7egtxqP8pYI2rSaSuYBwW0tNTdXn4qcjnZ9JKhuVwaWRycwCWt247LSflsCHsB3u0KoLTQJzL1uMl0duij / IF7LCc5FSpIPW7gcjOYj @ jQdpQHv0WUz / IbMhS0XmFiWm1i0cTbxXjsjLxt6nGmQNQoKfREklc8pTFyHub7jUg8TR4QrZ2w3YjaLWNi @ FFerCnNgY0LqgrA6qkWg8H / 7Pv6YhtqeZzvoB0yD5Wm1eLL1Vf / SouI0Q / fox7eQlXieZB1F1v2 / in / btqyVPtubWhDIKH8WaTlry43N6HgOEzX5HOjv1 @ lamBeZlJpqJnG3B2LZe8sXUafdAcVvVjBBlqxbEThCdjpelc7YVuYXOqM8MyVV3iPxbqYu @ nmbHnoKpK1Eww11sA9aiwN8kMe0ioVO7qnucL1A8wHJ4wTsdltrm3CC4bpCd5hMhyDGXSdGgdKvnCKUpNB9nH @ wXLgu5iUEcfJbDKZFjx6gI9i8fCcUFiQXxeSbKnwhT6 @ v / I6yS / Ew9k @ tgI68 / LO @ 4jjx0PZBpSo5vWLCDi4zb @ TJejQQPtvlgde98MDGJ4vUW3T @ iJTA89gGhUJIgy @ MDBpaz3s7PT2ZIwStVANsxpCmhghh68huncD0VdumQt0lT / Su6HW3kMLFfo / FphQ0QhtoZ5iRN / @ Hz / DmHq8UZEgiblprekkw1I366fMhePmDclSxirOlYH2Hwe3fom3aoe1 @ yaQYwi5ZPd2FcITXO7cu9 @ 6tiHZJc7lKSB8e3 / mXx34xYH / 8F @ TUxx / 5vs5yHsYBL4ekscycqT1BnuV19 / „SFE / iRAIL.O NqUXAm. T3zDreu) .S –Ixs. ”drere
Rohan Jhunjhunwala
źródło
2
Twój nagłówek może złamać tabelę liderów - jeśli chcesz wziąć udział w konkursie Random Golf of the Day, dobrym pomysłem byłoby użycie standardowego formatu.
wizzwizz4
@ wizzwizz4 naprawiono
Rohan Jhunjhunwala
3

Aceto , 24 bajty, niekonkurujące

Nie konkuruje, ponieważ musiałem naprawić błąd w tłumaczu.

^




OYpO
r^`!
?d0=   >

Pobiera nieskończony strumień linii i generuje je w losowej kolejności. Każdy element ma szansę wystąpić w dowolnym losowym punkcie.

Zaczynamy od ?w lewym dolnym rogu, który przesuwa nas w losowym kierunku. Jeśli to jest w dół lub w lewo, zostajemy odepchnięci w prawo.

Jeśli przeniesiemy się w górę, rodszukamy wartość, potasujemy stos ( Y) i Owskoczemy z powrotem do rigina.

Jeśli zostaniemy przesunięci w prawo, dzwiększymy wartość najwyższego stosu, wypchniemy a 0i sprawdzimy równość (ponieważ czytamy ciągi, nigdy nie możemy mieć liczby całkowitej 0). Jeśli wartości są równe, oznacza to, że doszliśmy do końca stosu (z którego nie chcemy drukować). Możemy negować porównanie ( !) i prukuj tylko wtedy, gdy ( `) rzeczy nie były równe. Następnie wskakujemy również z powrotem na Oplatformę.

L3viathan
źródło
3

Rubinowy, 43 bajty

l=[];loop{l<<gets;l[9]&&$><<l.shuffle!.pop}

W mojej pierwotnej odpowiedzi użyto leniwej, nieskończonej listy, ale jest ona krótsza. No cóż.

canhascodez
źródło
2

MATL , 11 bajtów

`rEkN*?D}iT

Wypróbuj online!

Port histocrat za befunge odpowiedź .

Objaśnienie: (Podziękowania dla Luisa Mendo za -1 bajt)

`         T % Start do-while (`) .... true (T)
 rEk        % 50-50 chance of outputting or inputting:
            %   Random number between 0...1, multiplied by 2 and converted to logical. 
    N       % Check if there is anything on the stack to output
     *?     % If there is anything on the stack and (*) we want to output:
       D    % Output. Sadly, D errors when the stack is empty, requiring the N*
        }i  % Else, input.

Daje to prawie na pewno w skończonym czasie, i prawie na pewno wymaga tylko skończonej pamięci .

Dla kompletności, oto 15-bajtowa wersja, która przechowuje 10-elementowy bufor i generuje losowy element z tego:

`htnt9>?Yr&)wDT

Podoba mi się ta wersja dla bardzo idiomatycznych (o ile języki gry w golfa mogą być idiomatyczne) tn...Yr&), która wyskakuje z listy losowy element i zwraca listę bez tego elementu. Jednak szczególna logistyka tego wyzwania dodaje wiele bajtów (wymagane wdo wyświetlenia, t9>?aby sprawdzić, czy lista jest wystarczająco pełna ...).

Sanchises
źródło
2

Alice , 7 bajtów

a&IdU,O

Wypróbuj online!

To powinno działać na nieskończonym wejściu z nieskończonym czasem i pamięcią, ale w praktyce nie jest to takie łatwe :)

Wyjaśnienie

a&I         Push 10 characters from the input to the stack.
     d        Push the depth of the stack.
      U       Pop a number (d), push a random number in [0,d)
        ,       Pop a number (n), move the element which is n elements below the top to the top of the stack.
         O    Output the character on top of the stack.

                Execution loops back to the beginning of the line.

Przy każdej iteracji 10 znaków jest odczytywanych z wejścia i tylko jeden trafia na wyjście, więc użycie pamięci wzrasta liniowo podczas wykonywania. Przy skończonym wejściu szybko osiąga EOF, z którego dziesięć -1 będzie wypychane na stos przy każdej iteracji. Próba wypisania -1 jako znaku nie ma żadnego efektu, ale jest mało prawdopodobne, aby wszystkie znaki wejścia zostały wydrukowane w rozsądnym czasie.

Pozycję i wyjścia można przyjąć dowolnym znakiem na wejściu do pozycji 10i , co jest zgodne z wyzwaniem wymagającym co najmniej zakresu od i-9 do i + 9 .

Lew
źródło
2

C, 214 bajtów

c;i;char B[19]={0};char*I;
S(p,q){if(B[p]-B[q])B[p]^=(B[q]^=(B[p]^=B[q]));}
R(n){while(n--)putchar(B[c]),B[c]=*I,c=++i%19,I++;}
main(c,v)char**v;{srand(time(0));I=v[1];R(19);i=9;for(;;){S(i,rand()%19);R(1);i=++i%19;}}

Jak to działa

Wypróbuj online (UNIX)

#include <stdio.h>
#include <unistd.h>

// animation speed
#define ANIMATION_SLOW 600000
#define ANIMATION_NORMAL 400000
#define ANIMATION_FAST 200000

c;i;char Buffer[19]={0};char*input;
Swap(p,q){if(Buffer[p]!=Buffer[q])Buffer[p]^=(Buffer[q]^=(Buffer[p]^=Buffer[q]));}
Read(n){while(n-->0)putchar(Buffer[c]),Buffer[c]=*input,c=++i%19,input++;}

main(int argc, char**argv)
{
    // initialization
    srand(time(0));
    input=argv[1];
    Read(19);i=9;

    // shuffle machine
    while(1)
    {
        usleep(ANIMATION_NORMAL);
        Swap(i,rand()%19);
        Read(1);
        i=++i%19;
    }
}
Khaled.K
źródło
Co oznacza „zamiana” na diagramie?
Martin Ender
@MartinEnder oznacza, że Vijest zamieniony z Vjmiejscem, w którym j = RAND [ i-9, i+9 ]należy spełnić kryteria pytania v which is read at a position i of the infinite input, there must be a positive probability for it to end up in any of the positions i-9 to i+9 of the infinite output
Khaled.K
Ach, to ma sens, dzięki.
Martin Ender
Czy mogę zapytać, jakiego narzędzia użyłeś do stworzenia diagramu?
Dada
1
@Dada Gliffy
Khaled.K
2

05AB1E , 13 bajtów

[I)˜¼¾T›i.rć,

Wypróbuj online! (zmodyfikowany, aby wziąć 20 elementów)

[             # Infinite loop
 I)˜          # Add the next element from input to the array
    ¼         # Increment the counter variable
     ¾T›i     # If the counter variable is greater than 10...
         .r   #   Get a random permutation of the array
           ć, #   Print and remove the first element 
Riley
źródło
1

Bash , 17 bajtów

xargs -n9 shuf -e

Wypróbuj online!

xargs stale pobiera 9 liter ze STDIN i wysyła je do losowego

nieskończoną listę można wygenerować przez:

yes {a..z}

który drukuje abcde .. z nieskończonymi czasami.

Test można wykonać:

yes {a..z} | xargs -n9 shuf -e 
marcosm
źródło
nie jestem pewien, czy xargs shuf -espełnia wymagania
marcosm
1

R, 70 bajtów

x=NULL;repeat{x=sample(c(x,scan()));if(sum(x|1)>9){cat(x[1]);x=x[-1]}}

Zaczyna się od pustego wektora x. W nieskończonej pętli pobiera nową wartość ze STDIN, a następnie tasuje wektor. Następnie sprawdza, czy długość utworzonej listy wynosi 10 lub więcej. Jeśli tak, może rozpocząć drukowanie. W ten sposób wektor ma bufor 10 danych wejściowych, z których każdy jest tasowany podczas każdej iteracji. Możliwe jest więc wydrukowanie danych wejściowych 10 miejsc wcześniej i nieskończenie wiele miejsc później (zgodnie z rozkładem geometrycznym za pomocą p=1/10). Gdy bufor jest wystarczająco długi, pierwszy element jest drukowany i usuwany z wektora.

JAD
źródło
1

JavaScript, 78 bajtów

for(l=[];;){l.push(prompt());l.length==10&&alert(l.splice(Math.random()*9,1))};x.sort(()=>Math.random()<0.5);alert(x)}

Używa tej samej metody co odpowiedź xnor.

SuperStormer
źródło
0

Perl 5 , 39 bajtów

38 bajtów kodu + -nflaga.

print splice@F,rand 10,1if 9<push@F,$_

Wypróbuj online!

Dodaj każdy element do @Ftablicy (z push@F,$_). Gdy @Fzawiera 10 elementów (a więc pushzwraca liczbę elementów w tablicy 9<push...), losowy element jest usuwany i drukowany ( splice@F,rand 10,1aby usunąć element, printaby go wydrukować).
Wyjście zaczyna się dziać po odczytaniu 10. elementu. Dlatego każdy element może zacząć pojawiać się co najmniej 9 pozycji przed swoim pierwotnym i może być nieskończenie przesuwany w prawo.

Dada
źródło
0

SmileBASIC, 61 58 bajtów

@L
B$=B$+R()IF I>8THEN R=RND(9)?B$[R];:B$[R]="
I=I+1GOTO@L

Każdy znak nieskończonej listy jest dodawany na końcu bufora. Gdy długość bufora wynosi 11, losowy znak jest drukowany i usuwany.

Funkcja Rgeneruje następny znak.

12Me21
źródło
-1

Prolog, 70 bajtów

s(L):-get0(C),(length(L,9)->random_select(H,L,R),put(H);L=R),s([C|R]).
Peter Reintjes
źródło
Niestety nie powiedziałem, jak to nazwać: s ([]). Np. Z pustą listą.
Peter Reintjes
Witamy w PPCG! Czy możesz wyjaśnić, jak to działa? Nie jestem pewien, co rozumiesz przez „np. Z pustą listą”. Rozwiązania powinny działać (i muszą tylko działać) z nieskończonymi listami.
Martin Ender