Golf Acak Hari Ini # 8: Acak daftar yang tidak terbatas

23

Tentang Seri

Pertama, Anda dapat memperlakukan ini seperti tantangan golf kode lainnya, dan menjawabnya tanpa khawatir tentang seri sama sekali. Namun, ada papan peringkat di semua tantangan. Anda dapat menemukan papan peringkat bersama dengan beberapa informasi lebih lanjut tentang seri di posting pertama .

Lubang 8: Acak daftar yang tak terbatas

Anda harus menulis fungsi atau program yang menggunakan daftar tak terbatas sebagai input dan mengembalikan versi acak dari daftar itu.

Tentang infinite I / O

Ada beberapa cara Anda dapat mengambil input dan menghasilkan output untuk tantangan ini:

  • Anda dapat mengambil daftar bilangan bulat positif, atau representasi stringnya, atau string atau daftar karakter ASCII yang dapat dicetak (0x20 hingga 0x7E, inklusif). Format output harus sesuai dengan format input. Saya hanya akan merujuk data sebagai "daftar" mulai sekarang, terlepas dari opsi mana yang Anda pilih.
  • Anda dapat membaca daftar dari aliran input standar tak terbatas dan menulis output terus menerus ke aliran keluaran standar tak terbatas. Solusinya tidak harus bergantung pada nilai atau urutan nilai tertentu untuk memastikan bahwa aliran output secara tertulis dan memerah (misalnya Anda tidak bisa hanya menulis output setiap kali ada 5dalam daftar input). Tentu saja, jika Anda membaca representasi string dari daftar, tidak apa-apa untuk menunggu sampai bertemu dengan pemisah daftar.
  • Dalam bahasa yang mendukungnya, Anda dapat menulis fungsi yang mengambil dan mengembalikan daftar atau string malas yang tak terbatas.
  • Dalam bahasa yang mendukungnya, Anda dapat mengimplementasikan generator tanpa batas yang menggunakan generator lain sebagai input.
  • Atau, Anda dapat menulis fungsi yang tidak menggunakan argumen dan mengembalikan satu nilai output setiap kali dipanggil. Dalam hal ini, Anda dapat mengasumsikan bahwa suatu fungsi telah didefinisikan yang tidak menggunakan argumen dan mengembalikan nilai input berikutnya setiap kali dipanggil. Anda dapat dengan bebas memilih nama fungsi itu.

Anda dapat mengasumsikan bahwa program Anda berjalan selamanya dan bahwa memori tak terbatas tersedia. (Dimungkinkan untuk menyelesaikan ini dengan jumlah memori yang terbatas, tetapi artinya ini adalah Anda diizinkan untuk membocorkan memori.)

Tentang keacakan

Untuk setiap nilai v yang dibaca pada posisi i dari input infinite, harus ada probabilitas positif untuk berakhir di posisi i-9 hingga i + 9 dari output infinite (kecuali posisi itu akan negatif ). Probabilitas ini tidak harus sama untuk posisi output yang berbeda atau bahkan untuk posisi input yang berbeda. Tidak masalah jika solusi Anda juga dapat mengocok nilai ke posisi lain yang lebih jauh.

Oleh karena itu, tidak perlu solusi Anda dapat mengocok nilai pertama sangat jauh ke bawah dalam daftar, atau bahwa itu dapat mengocok nilai yang sangat terlambat hingga ke posisi pertama, meskipun tidak apa-apa jika itu terjadi, selama semua posisi 9 langkah dari input dimungkinkan.

Misalnya jika Anda mengambil string berikut sebagai input, ini ___mengindikasikan semua posisi yang Xharus dapat diakhiri dalam output:

                  ___________________
 abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...

Jika bahasa Anda tidak memiliki penghasil angka acak bawaan atau Anda tidak ingin menggunakannya, Anda dapat mengambil nilai seed tambahan sebagai input, dan mengimplementasikan RNG Anda sendiri yang sesuai menggunakan seed. Halaman ini mungkin bermanfaat untuk itu.

Terlepas dari distribusi aktual yang digunakan solusi Anda, hampir pasti harus menghasilkan nilai berikutnya setelah waktu yang terbatas (tapi sewenang-wenang).

Harap sertakan penjelasan singkat tentang bagaimana implementasi Anda memenuhi persyaratan ini.

Mencetak gol

Ini adalah , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.

Papan peringkat

Posting pertama dari seri menghasilkan leaderboard.

Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

(Bahasa saat ini tidak ditampilkan, tetapi cuplikan memang membutuhkan dan menguraikannya, dan saya dapat menambahkan leaderboard berdasarkan bahasa di masa mendatang.)

Martin Ender
sumber
2
Bisakah kita menganggap waktu / memori tak terbatas tersedia?
Mego
Jika bahasa memang memiliki sesuatu yang disebut generator angka acak, apakah kita benar-benar harus menggunakannya?
feersum
1
@Mego Waktu tak terbatas, jelas. Dan memori tak terbatas, ya seperti biasa untuk tantangan yang membutuhkan program untuk memproses data selamanya (mungkin untuk menyelesaikan ini dalam memori terbatas, tapi saya tidak ingin menghukum bahasa yang terpaksa membocorkan memori).
Martin Ender
@feersum Saya mungkin harus menentukan persyaratan dari generator nomor acak buatan sendiri sedikit lebih tepat, tapi saya tidak bisa membayangkan mengimplementasikan Anda sendiri menjadi lebih pendek daripada RNG built-in dalam banyak kasus?
Martin Ender
@feersum Saya sudah sedikit menjelaskan bagian itu dan menautkan ke definisi standar kami untuk keacakan.
Martin Ender

Jawaban:

13

Python 3 , 78 byte

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

Cobalah online!

Mengambil input dari STDIN (satu per baris), mencetak ke STDOUT.

Menyimpan buffer lhingga 10 elemen. Buffer dikocok dengan setiap langkah. Ketika panjangnya 10, elemen terakhir dicetak dan dihapus.

Jika sebuah elemen kebetulan dicetak segera setelah dimasukkan, elemen tersebut telah melompati 9 elemen lainnya yang menunggu dalam buffer, sehingga nampak 9 titik tersisa. Suatu elemen dapat menunggu dalam buffer secara sewenang-wenang, sehingga posisinya dapat memindahkan jumlah berapapun dengan benar.

Tampaknya tidak ada cara yang baik untuk menghasilkan dan menghapus elemen acak dari daftar. Mengocok sepertinya berlebihan. Ini 2 byte lebih lama untuk digunakan l.pop(randint(0,9))(yang menggunakan daftar memiliki 10 elemen).

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

Ini tidak lebih baik untuk dilakukan x=choice(l);l.remove(x). Bahasa dengan poprandomsuka

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

bisa sangat bersih lakukan

from random import*
l=[]
while 1:l+=input(),;l[9:]and print(poprandom(l))
Tidak
sumber
9

Befunge ( rasa quirkster ), 4 byte

?,?~

,membaca karakter dari aliran dan mendorongnya ke tumpukan. ~muncul karakter teratas dari tumpukan (jika ada) dan mencetaknya. ?mengacak perintah mana yang dieksekusi selanjutnya. Jadi algoritme di sini adalah "Dalam loop tak terbatas, dengan probabilitas yang sama baik mendorong karakter atau pop karakter." Saya pikir ini memenuhi persyaratan: karakter dapat melihat banyak karakter yang ditambahkan secara sewenang-wenang di atasnya dalam tumpukan, sehingga dapat bergerak sewenang-wenang jauh ke kanan, dan itu dapat dicetak ketika tumpukan secara sewenang-wenang besar, sehingga dapat bergerak sewenang-wenang jauh ke kiri.

histokrat
sumber
5
Bukankah ini menghasilkan byte nol jika tumpukan kosong?
feersum
Implementasi yang saya tautkan tidak; Saya setuju dengan spesifikasi Befunge yang seharusnya.
histokrat
2
Lucu, browser memakan byte nol. Ia menyebut penerapan putchar ("\ 0"), tetapi FF membersihkannya dari HTML: >> document.getElementById("output").innerHTML = "a\0b" >> document.getElementById("output").innerHTML "ab"
feersum
Aha, saya bertanya-tanya apakah ada sesuatu yang aneh terjadi di browser. Saya kira Chrome saya juga melakukannya. Nah, itu sih teknis, tapi saya kira itu lebih atau kurang dalam semangat situs untuk mengirim solusi yang hanya bekerja di beberapa penerjemah berjalan di beberapa lingkungan.
histokrat
4

C (gcc) , 94 byte

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

Cobalah online!

Oke, tautan TIO tidak masuk akal. Untuk kemudahan pengujian, saya membuat program C berikut yang akan menampilkan karakter ascii acak, atau mengulangi string tanpa batas.

#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++]);
        }
    }
}

Program ini akan disebut sebagai iro.

Kebenaran program

Apa yang saya lakukan di sini adalah membaca 9nilai ke dalam buffer. Setelah ini, indeks acak dipilih dari array ini dan dikeluarkan, lalu diganti dengan karakter berikutnya dalam aliran.

Conor O'Brien
sumber
3

SILOS , 149 byte

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

Cobalah online!

Pada dasarnya ia terus mengambil input (pada penerjemah online melalui argumen, tetapi pada penerjemah resmi offline itu akan memungkinkan Anda mengetik ke konsol (tanpa batas)) dalam blok 15 pada satu waktu (30 blok pertama).

Ini memuat input ke antrian sementara dan mengambil lucky 15 (secara acak, tetapi tidak terdistribusi secara merata dalam hal kemungkinan atau distribusi).

Sisanya tetap sebagai input baru mengisi antrian, input pertama bisa dikocok sampai akhir, (pada dasarnya saya pikir karakter mengikuti distribusi normal). Sangat menarik untuk dicatat bahwa program ini hanya dua kali lebih verbose dari python dan mungkin "golfier" daripada Java.


Untuk melihat hasil lebih baik, saya memiliki versi tidak sesuai yang mengambil input sebagai string (namun hanya dapat menampung sekitar 8.000 karakter).

Cobalah online!

Hanya untuk bersenang-senang, di sini adalah posting ini diumpankan melalui versi string.

 [.L.Ooy "9beS.IS]," 14 ts b1
 nly

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

    e
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 yaitu

htpsgthyx]: iub.om/jhujh .. tcraa.IOo /TytonieSu:wl/.L lnn!: tt / iS
[Di hsto.un / nuslprxRUCoDsio /]: e#NzZn6j4c/2xNQFnF7y0aLzkrosd9Dov2yxJNx774HBrgPUdi9CySI09sCLw5TJwB7jlB1XVeQFE7m1VMsIQvDOjBmdtME3umNzYXs9unFbqRamVDfUDw@RT3NHoL7/i04bz16DCoP4eulOU7jPD8OmYjATpynkuMDuBPYmtnIJzseyyhaNkMyQgXG2R782vqMDIiUm6Kq4Q3mJkxlUsR1rrldPw./l28Z SL.XS - IONuscOT "
senallyxMz.stiitkp ingN "
 eestaint on heeInliinrprt (oe to toghr tetgpnmntuon eruEuut rh ofi off, bhenecil inretea.atr ialoks tirilw upeitfleptly ty honso (e oote cenfine iwllbc 15 atly) nitloo bertujuan (te) nikfte)
hs 0Int 
 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)
 dan kamu akan kembali ke queusen 
pt ftip, ae uldsfuesis ob hl rlelth weual t tc hdyoend, f tbaaly thi an elnkhecarcthe (sc ho noreiItrolwaaldibtio lmiru.t 'iereaf) dapat langsung membaca hanya hafId hanya twieatisi svhcjhhhhhhhh
 tte s / "gt 
obterelIe tsvea non-omhMemahami kebijakan hcahihk in terip sriprics at rwvritcaw aa g (hoee n onl kein n00 orscat, 0 cter).

[Tyauo itu 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 @ 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 / IO @ 4jjx0PZBpSo5vWLCDi4zb @ TJejQQPtvlgde98MDGJ4vUW3T @ iJTA89gGhUJIgy @ MDBpaz3s7PT2ZIwStVANsxpCmhghh68huncD0VdumQt0lT / Su6HW3kMLFfo / FphQ0QhtoZ5iRN / @ hz / DmHq8UZEgiblprekkw1I366fMhePmDclSxirOlYH2Hwe3fom3aoe1 @ yaQYwi5ZPd2FcITXO7cu9 @ 6tiHZJc7lKSB8e3 / mXx34xYH / 8F @ TUxx / 5vs5yHsYBL4ekscycqT1BnuV19 / "SFE / iRAIL.O NqUXAm. T3zDreu) .S –IOxs. "ddd
Rohan Jhunjhunwala
sumber
2
Header Anda dapat mematahkan papan peringkat - jika Anda ingin berpartisipasi dalam kompetisi Golf Acak Hari Ini, sebaiknya gunakan format standar.
wizzwizz4
@ wizzwizz4 diperbaiki
Rohan Jhunjhunwala
3

Aceto , 24 byte, tidak bersaing

Non-bersaing karena saya harus memperbaiki bug pada juru bahasa.

^




OYpO
r^`!
?d0=   >

Mengambil aliran garis tanpa batas dan menghasilkannya dalam urutan acak. Setiap elemen memiliki peluang terjadi pada titik acak apa pun.

Kita mulai dengan ?di sudut kiri bawah, yang menggerakkan kita ke arah acak. Jika itu turun atau kiri, kita didorong kembali.

Jika kita bergerak ke atas, kita rmendapatkan nilai, mengocok tumpukan ( Y), dan melompat kembali ke Origin.

Jika kita bergerak ke kanan, kita dmenaikkan nilai tumpukan teratas, mendorong 0dan menguji kesetaraan (karena kita membaca string, kita tidak akan pernah memiliki bilangan bulat 0). Jika nilainya sama, itu berarti kami telah mencapai bagian bawah tumpukan (dari mana kami tidak ingin mencetak). Kami meniadakan perbandingan ( !), dan pmematahkan hanya jika ( `) semuanya tidak sama. Lalu kami juga melompat kembali ke Origin.

L3viathan
sumber
3

Ruby, 43 byte

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

Jawaban asli saya menggunakan daftar tak terbatas yang dievaluasi malas, tetapi ini lebih pendek. Baiklah.

canhascodez
sumber
2

MATL , 11 byte

`rEkN*?D}iT

Cobalah online!

Port jawaban histokrat Befunge .

Penjelasan: (Terima kasih kepada Luis Mendo untuk -1 byte)

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

Output ini hampir pasti dalam waktu yang terbatas, dan hampir pasti hanya membutuhkan memori yang terbatas .

Untuk kelengkapan, berikut adalah versi 15-byte yang menyimpan buffer 10-elemen dan mengeluarkan elemen acak dari itu:

`htnt9>?Yr&)wDT

Saya suka versi ini untuk yang sangat idiomatis (sejauh bahasa golf bisa idiomatis) tn...Yr&), yang mengeluarkan elemen acak dari daftar dan mengembalikan daftar tanpa elemen itu. Namun, logistik khusus dari tantangan ini menambah banyak byte (yang diperlukan wuntuk tampilan, t9>?untuk memeriksa apakah daftar sudah cukup penuh ...).

Sanchises
sumber
2

Alice , 7 byte

a&IdU,O

Cobalah online!

Ini seharusnya bekerja pada input yang tidak terbatas dengan waktu dan memori yang tidak terbatas, tetapi dalam praktiknya tidak begitu mudah :)

Penjelasan

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.

Pada setiap iterasi, 10 karakter dibaca dari input dan hanya satu yang menuju ke output, sehingga penggunaan memori meningkat secara linear selama eksekusi. Dengan input terbatas, ini dengan cepat mencapai EOF, dari mana sepuluh -1 akan didorong ke stack di setiap iterasi. Mencoba mengeluarkan -1 sebagai karakter tidak berpengaruh, tetapi tidak mungkin semua karakter dari input akan dicetak dalam jumlah waktu yang wajar.

Posisi i dari output dapat diambil oleh karakter apa pun di input hingga posisi 10i , ini sesuai dengan tantangan yang membutuhkan setidaknya rentang dari i-9 hingga i + 9 .

Leo
sumber
2

C, 214 byte

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

Bagaimana itu bekerja

Coba 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
sumber
Apa arti "swap" dalam diagram Anda?
Martin Ender
@ MartinEnder artinya Viditukar dengan Vjtempat j = RAND [ i-9, i+9 ]untuk memenuhi kriteria pertanyaan 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
Ah itu masuk akal, terima kasih.
Martin Ender
Bisakah saya bertanya alat apa yang Anda gunakan untuk membuat diagram Anda?
Dada
1
@Dada Gliffy
Khaled.K
2

05AB1E , 13 byte

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

Cobalah online! (dimodifikasi untuk mengambil 20 elemen)

[             # 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
sumber
1

Bash , 17 byte

xargs -n9 shuf -e

Cobalah online!

xargs terus menerus mengambil 9 huruf dari STDIN dan mengirimkannya untuk acak

daftar tak terbatas dapat dihasilkan oleh:

yes {a..z}

yang mencetak abcde .. z kali tak terbatas.

Tes dapat dilakukan dengan:

yes {a..z} | xargs -n9 shuf -e 
marcosm
sumber
tidak yakin apakah xargs shuf -ememenuhi persyaratan
marcosm
1

R, 70 byte

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

Mulai dengan vektor kosong x. Dalam infinite loop, dibutuhkan nilai baru dari STDIN, lalu mengocok vektor. Kemudian memeriksa apakah panjang daftar yang dibangun adalah 10 atau lebih tinggi. Jika ya, ia dapat mulai mencetak. Dengan cara ini vektor memiliki buffer 10 input, masing-masing dikocok dalam setiap iterasi. Jadi dimungkinkan untuk input dicetak 10 tempat sebelumnya, dan tak terhingga banyak tempat kemudian (mengikuti distribusi geometris dengan p=1/10). Ketika buffer cukup panjang, elemen pertama dicetak dan dihapus dari vektor.

JAD
sumber
1

Javascript, 78 byte

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

Menggunakan metode yang sama dengan jawaban xnor.

SuperStormer
sumber
0

Perl 5 , 39 byte

Kode + -nbendera 38 byte .

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

Cobalah online!

Tambahkan setiap elemen ke @Farray (dengan push@F,$_). Ketika @Fberisi 10 elemen ( pushmengembalikan jumlah elemen dalam array, karenanya 9<push...), elemen acak dihapus dan dicetak ( splice@F,rand 10,1untuk menghapus elemen, printuntuk mencetaknya).
Output mulai terjadi setelah elemen ke 10 telah dibaca. Oleh karena itu, setiap elemen dapat mulai muncul setidaknya 9 posisi sebelum yang asli, dan dapat digeser ke kanan tanpa batas.

Dada
sumber
0

SmileBASIC, 61 58 byte

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

Setiap karakter dari daftar tak terbatas ditambahkan ke akhir buffer. Ketika panjang buffer adalah 11, karakter acak dicetak dan dihapus.

Fungsi Rmenghasilkan karakter berikutnya.

12Me21
sumber
-1

Prolog, 70 byte

s(L):-get0(C),(length(L,9)->random_select(H,L,R),put(H);L=R),s([C|R]).
Peter Reintjes
sumber
Maaf, saya tidak mengatakan bagaimana menyebutnya: s ([]). Misalnya dengan daftar kosong.
Peter Reintjes
Selamat datang di PPCG! Bisakah Anda menjelaskan cara kerjanya? Saya tidak yakin apa yang Anda maksud dengan "misalnya dengan daftar kosong". Solusi harus bekerja (dan hanya perlu bekerja) dengan daftar tak terbatas.
Martin Ender