Случайный Гольф Дня № 8: перемешайте бесконечный список

23

О серии

Во-первых, вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь о серии вообще. Тем не менее, существует таблица лидеров по всем задачам. Вы можете найти таблицу лидеров вместе с дополнительной информацией о серии в первом посте .

Отверстие 8: перемешать бесконечный список

Вы должны написать функцию или программу, которая принимает бесконечный список в качестве входных данных и возвращает перемешанную версию этого списка.

О бесконечном вводе / выводе

Существует несколько способов ввода и вывода результатов для этой задачи:

  • Вы можете взять список целых положительных чисел, или его строковое представление, или строку или список печатных символов ASCII (от 0x20 до 0x7E включительно). Выходной формат должен соответствовать входному формату. Теперь я буду ссылаться на данные как на «список», независимо от того, какой вариант вы выберете.
  • Вы можете прочитать список из бесконечного стандартного входного потока и непрерывно записывать вывод в бесконечный стандартный выходной поток. Решение не должно зависеть от какого-либо конкретного значения или последовательности значений, чтобы гарантировать, что выходной поток регулярно записывается и сбрасывается (например, вы не можете просто записывать выходные данные, когда они есть 5в списке входных данных). Конечно, если вы читаете строковое представление списка, хорошо подождать, пока не встретится разделитель списка.
  • На языках, которые их поддерживают, вы можете написать функцию, которая принимает и возвращает ленивый бесконечный список или строку.
  • В языках, которые их поддерживают, вы можете реализовать бесконечный генератор, который принимает другой генератор в качестве входных данных.
  • В качестве альтернативы вы можете написать функцию, которая не принимает аргументов и возвращает одно выходное значение при каждом ее вызове. В этом случае вы можете предположить, что была определена функция, которая не принимает аргументов и возвращает следующее входное значение каждый раз, когда она вызывается. Вы можете свободно выбирать имя этой функции.

Вы можете предположить, что ваша программа работает вечно и что доступно бесконечное количество памяти. (Это можно решить с помощью ограниченного объема памяти, но это означает, что вам разрешается утечка памяти.)

О случайности

Для любого значения v, которое читается в позиции i бесконечного входа, должна быть положительная вероятность того, что оно окажется в любой из позиций с i-9 по i + 9 бесконечного выхода (если только эта позиция не будет отрицательной ). Эти вероятности не должны быть одинаковыми для разных выходных позиций или даже для разных входных позиций. Хорошо, если ваше решение может также переместить значения в другое положение, которое находится дальше.

Следовательно, не обязательно, чтобы ваше решение могло перетасовать первое значение очень далеко вниз по списку или чтобы оно могло перетасовывать очень позднее значение до первой позиции, хотя это нормально, если это произойдет, если все позиции находятся в 9 шагах от вход возможен.

Например, если вы взяли следующую строку в качестве входных данных, то ___указывает все позиции, которые Xдолжны быть в состоянии оказаться в выходных данных:

                  ___________________
 abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...

Если в вашем языке отсутствует встроенный генератор случайных чисел или вы не хотите его использовать, вы можете взять в качестве входных данных дополнительное начальное значение и реализовать свой собственный подходящий ГСЧ с использованием начального числа. Эта страница может быть полезна для этого.

Независимо от фактического распределения, которое использует ваше решение, оно почти наверняка произведет следующее значение по истечении конечного (но произвольного) времени.

Пожалуйста, включите краткое объяснение того, как ваша реализация удовлетворяет этим требованиям.

счет

Это , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.

Leaderboard

Первый пост серии генерирует таблицу лидеров.

Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

(Язык в настоящее время не отображается, но фрагмент требует и анализирует его, и я могу добавить таблицу лидеров по языкам в будущем.)

Мартин Эндер
источник
2
Можем ли мы предположить бесконечное время / доступную память?
Мего
Если в языке есть нечто, называемое генератором случайных чисел, действительно ли мы должны его использовать?
feersum
1
@Mego Бесконечное время, очевидно. И бесконечная память, да, как обычно, для задач, которые требуют, чтобы программы обрабатывали данные вечно (это можно решить в конечной памяти, но я не хочу наказывать языки, которые вынуждены утекать память).
Мартин Эндер
@feersum Я, наверное, должен немного точнее указать требования к самодельному генератору случайных чисел, но я не могу представить, чтобы в большинстве случаев реализация собственной была короче встроенного ГСЧ?
Мартин Эндер
@feersum Я немного разъяснил эту часть и связал ее с нашим стандартным определением случайности.
Мартин Эндер

Ответы:

13

Python 3 , 78 байт

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

Попробуйте онлайн!

Принимает данные из STDIN (по одному на строку), печатает в STDOUT.

Содержит буфер lдо 10 элементов. Буфер перетасовывается с каждым шагом. Когда его длина равна 10, последний элемент печатается и удаляется.

Если элемент распечатывается сразу после его вставки, он пропустил 9 других элементов, ожидающих в буфере, поэтому остается 9 мест. Элемент может ждать в буфере произвольно долго, поэтому его позиция может перемещаться на любую величину вправо.

Кажется, нет хорошего способа создать и удалить случайный элемент из списка. Тасование кажется излишним. Это на 2 байта больше для использования l.pop(randint(0,9))(при этом в списке 10 элементов).

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

Это не лучше сделать x=choice(l);l.remove(x). Язык с poprandomподобным

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

мог бы очень чисто сделать

from random import*
l=[]
while 1:l+=input(),;l[9:]and print(poprandom(l))
XNOR
источник
9

Befunge ( необычный вкус ), 4 байта

?,?~

,читает символ из потока и помещает его в стек. ~выскакивает верхний символ из стека (если есть) и печатает его. ?рандомизирует, какая команда выполняется дальше. Таким образом, алгоритм здесь такой: «В бесконечном цикле с равной вероятностью либо нажмите символ, либо вставьте символ». Я думаю, что это удовлетворяет требованиям: персонаж может видеть произвольно много символов, добавленных над ним в стеке, поэтому он может перемещаться произвольно далеко вправо, и он может быть напечатан, когда стек является произвольно большим, поэтому он может перемещаться произвольно далеко, чтобы слева.

histocrat
источник
5
Разве это не выводит нулевые байты, если стек пуст?
feersum
Реализация, которую я связал, не делает; Я согласен со спецификацией Befunge, она должна.
гистократ
2
Забавно, браузер ест нулевые байты. Он вызывает реализацию putchar ("\ 0"), но FF удаляет его из HTML: >> document.getElementById("output").innerHTML = "a\0b" >> document.getElementById("output").innerHTML "ab"
feersum
Ага, мне стало интересно, происходит ли что-то странное в браузере. Я думаю, что мой Chrome тоже это делает. Ну, тогда это чертовски техническая вещь, но я думаю, что более или менее в духе сайта опубликовать решение, которое работает только в некоторых интерпретаторах, работающих в некоторых средах.
гистократ
4

C (gcc) , 94 байта

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

Попробуйте онлайн!

Хорошо, ссылка на TIO не имеет особого смысла. Для удобства тестирования я создал следующую программу на C, которая будет выводить случайные символы ascii или повторять строку бесконечно.

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

Эта программа будет называться iro.

Корректность программы

То, что я делаю здесь, это чтение 9значений в буфер. После этого случайные индексы выбираются из этого массива и выводятся, а затем заменяются следующим символом в потоке.

Конор О'Брайен
источник
3

СИЛОС , 149 байт

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

Попробуйте онлайн!

По сути, он продолжает принимать данные (в онлайн-переводчике через аргументы, а в офлайновом официальном интерпретаторе - он позволяет вводить в консоль (бесконечно)) блоками по 15 за раз (30 - первый блок).

Он загружает входные данные во временную очередь и выбирает 15 счастливчиков (случайным образом, но не одинаково с точки зрения вероятности или распределения).

Остальные остаются, поскольку новые входы заполняют очередь, первый ввод может быть перетасован до самого конца (в основном я думаю, что символы следуют нормальному распределению). Интересно отметить, что эта программа всего лишь вдвое более многословна, чем python, и, возможно, «гольфее», чем Java.


Чтобы лучше увидеть результаты, у меня есть несовместимая версия, которая принимает входные данные в виде строки (однако она может содержать не более 8000 символов).

Попробуйте онлайн!

Просто для забавы, вот этот пост, пропущенный через строковую версию.

 [.L.Ooy "9beS.IS]," 14 ts b1
 олько

  = LL
   х = 1б 15 1
5b a * b = lb rd # + lb eaI O e 
 Икс
 ifquu   
1 0x б
   знак равно

    е
0
   я lblxa -d * 2
    quu x = rn 
   х зеа р0
   ПНИТ ОРА
   mf = iePit
  ба 1
   GTO 1 фб х + оа


 qe -lblX u0 m GOOUE  
[RLT 

 tnn5! I.STii] [S.LO ie

htpsgthyx]: iub.om/jhujh .. tcraa.IOo /TytonieSu:wl/.L lnn!: tt / iS
[В hsto.un / nuslprxRUCoDsio /]: e#NzZn6j4c/2xNQFnF7y0aLzkrosd9Dov2yxJNx774HBrgPUdi9CySI09sCLw5TJwB7jlB1XVeQFE7m1VMsIQvDOjBmdtME3umNzYXs9unFbqRamVDfUDw@RT3NHoL7/i04bz16DCoP4eulOU7jPD8OmYjATpynkuMDuBPYmtnIJzseyyhaNkMyQgXG2R782vqMDIiUm6Kq4Q3mJkxlUsR1rrldPw./l28Z SL.XS - IONuscOT "
senallyxMz.stiitkp ingN "
 Это необходимо для того, чтобы понять, что это значит, что он не только не имеет цели, но и не знает цели.
hs 0It te 
 Я реанимирую, но не знаю, что это такое (15 лет), но не знаю, что такое часто и плохо, но я не знаю.
 я хочу тебя услышать 
Вы знаете, что это не так, как вы думаете, что вы думаете, что вы думаете?
 tte s / "gt 
ОБЗОР ЦВЕА НЕ ОМХТРА, ЧТОБЫ ОСУЩЕСТВЛЯТЬ СЛОВАРЬ В ТЕЧЕНИЕ СРИПРИК В ГРАФИКЕ (МОНТАЖ ОДИН КЕЙН N00 orscat, 0 CTER).

[Тиауа, это онин!RU] р // о / lsslo # JVD (tinnexi3E @ KDpit / LrhtwXwVEUuscxPmJjFFCaNimMzlHiQEcMmdVIT7vqs8mNgxU3mD / J1AwXд / 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 / в / btqyVPtubWhDIKH8WaTlry43N6HgOEzX5HOjv1 @ lamBeZlJpqJnG3B2LZe8sXUafdAcVvVjBBlqxbEThCdjpelc7YVuYXOqM8MyVV3iPxbqYu @ nmbHnoKpK1Eww11sA9aiwN8kMe0ioVO7qnucL1A8wHJ4wTsdltrm3CC4bpCd5hMhyDGXSdGgdKvnCKUpNB9nH @ wXLgu5iUEcfJbDKZFjx6gI9i8fCcUFiQXxeSbKnwhT6 @ v / I6yS / Ew9k @ tgI68 / Л.О. @ 4jjx0PZBpSo5vWLCDi4zb @ TJejQQPtvlgde98MDGJ4vUW3T @ iJTA89gGhUJIgy @ MDBpaz3s7PT2ZIwStVANsxpCmhghh68huncD0VdumQt0lT / Su6HW3kMLFfo / FphQ0QhtoZ5iRN / @ HZ / DmHq8UZEgiblprekkw1I366fMhePmDclSxirOlYH2Hwe3fom3aoe1 @ yaQYwi5ZPd2FcITXO7cu9 @ 6tiHZJc7lKSB8e3 / mXx34xYH / 8F @ TUxx / 5vs5yHsYBL4ekscycqT1BnuV19 / «SFE / iRAIL.O NQUXAm. T3zDreu) .S –IOxs. "ddd
Рохан Джунджхунвала
источник
2
Ваш заголовок может сломать таблицу лидеров - если вы хотите принять участие в конкурсе «Случайный гольф дня», было бы неплохо использовать стандартный формат.
wizzwizz4
@ wizzwizz4 исправлено
Рохан
3

Aceto , 24 байта, неконкурирующий

Не конкурирует, потому что мне пришлось исправить ошибку в интерпретаторе.

^




OYpO
r^`!
?d0=   >

Берет бесконечный поток строк и выдает их в случайном порядке. Каждый элемент может появиться в любой случайной точке.

Мы начинаем с ?левого нижнего угла, который перемещает нас в случайном направлении. Если это вниз или влево, нас отталкивают обратно.

Если мы перемещаемся вверх, мы получаем rзначение, перетасовываем стек ( Y) и возвращаемся к Oначалу.

Если мы перемещаемся вправо, мы dувеличиваем значение верхнего стека, нажимаем a 0и проверяем на равенство (так как мы читаем строки, у нас никогда не будет целого числа 0). Если значения равны, это означает, что мы достигли дна стека (из которого мы не хотим печатать). Мы отрицаем сравнение ( !) и pринт только если ( `) вещи не были равны. Затем мы также Oпрыгаем обратно на ригин.

L3viathan
источник
3

Рубин, 43 байта

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

В моем первоначальном ответе использовался бесконечный список с ленивым вычислением, но это короче. Ну что ж.

canhascodez
источник
2

MATL , 11 байт

`rEkN*?D}iT

Попробуйте онлайн!

Порт гистократа Befunge ответ .

Пояснение: (Спасибо Луису Мендо за -1 байт)

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

Это выводит почти наверняка за конечное время и почти наверняка требует только конечной памяти .

Для полноты вот 15-байтовая версия, которая содержит 10-элементный буфер и выводит случайный элемент из этого:

`htnt9>?Yr&)wDT

Мне нравится эта версия для очень идиоматических (насколько идиотскими могут быть языки игры в гольф) tn...Yr&), которые выталкивают случайный элемент из списка и возвращают список без этого элемента. Однако конкретная логистика этой задачи добавляет много байтов (требуется wдля отображения, t9>?чтобы проверить, достаточно ли полный список ...).

Sanchises
источник
2

Алиса , 7 байт

a&IdU,O

Попробуйте онлайн!

Это должно работать на бесконечном вводе с бесконечным временем и памятью, но это не так легко проверить на практике :)

объяснение

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.

На каждой итерации 10 символов считываются с ввода и только один идет на выход, поэтому использование памяти увеличивается линейно во время выполнения. С конечным вводом это быстро достигает EOF, из которого десять -1 будут помещаться в стек на каждой итерации. Попытка вывести -1 как символ не имеет никакого эффекта, но маловероятно, что все символы ввода будут напечатаны в разумные сроки.

Позиция i выхода может быть взята любым символом на входе до позиции 10i , это соответствует задаче, требующей, по крайней мере, диапазон от i-9 до i + 9 .

Лео
источник
2

C 214 байта

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

Как это работает

Попробуйте онлайн (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
источник
Что означает «своп» на вашей диаграмме?
Мартин Эндер
@MartinEnder это означает, что поменяно Viместами, Vjгде j = RAND [ i-9, i+9 ]удовлетворить критерий вопроса 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
Ах, это имеет смысл, спасибо.
Мартин Эндер
Могу я спросить, какой инструмент вы использовали для создания диаграммы?
Дада
1
@Dada Gliffy
Khaled.K
2

05AB1E , 13 байтов

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

Попробуйте онлайн! (модифицировано, чтобы взять 20 элементов)

[             # 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 
Райли
источник
1

Баш , 17 байт

xargs -n9 shuf -e

Попробуйте онлайн!

xargs непрерывно берет 9 писем из STDIN и отправляет их в случайном порядке

бесконечный список может быть сгенерирован:

yes {a..z}

который печатает abcde .. z бесконечные времена.

Тест может быть выполнен:

yes {a..z} | xargs -n9 shuf -e 
marcosm
источник
не уверен, что xargs shuf -eудовлетворяет требованиям
marcosm
1

R 70 байт

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

Начинается с пустого вектора x. В бесконечном цикле он принимает новое значение из STDIN, а затем тасует вектор. Затем он проверяет, равна ли длина построенного списка 10 или выше. Если это так, он может начать печать. Таким образом, вектор имеет буфер из 10 входов, каждый из которых перетасовывается на каждой итерации. Таким образом, входные данные могут быть напечатаны на 10 мест раньше и бесконечно много мест позже (после геометрического распределения с помощью p=1/10). Когда буфер достаточно длинный, первый элемент печатается и удаляется из вектора.

JAD
источник
1

Javascript, 78 байт

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

Использует тот же метод, что и ответ xnor.

SuperStormer
источник
0

Perl 5 , 39 байт

38 байт кода + -nфлаг.

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

Попробуйте онлайн!

Добавьте каждый элемент в @Fмассив (с push@F,$_). Когда @Fсодержит 10 элементов ( pushвозвращает количество элементов в массиве, следовательно 9<push...), случайный элемент удаляется и печатается ( splice@F,rand 10,1чтобы удалить элемент, printчтобы напечатать его).
Вывод начинает происходить после того, как 10-й элемент был прочитан. Следовательно, каждый элемент может начать появляться по крайней мере на 9 позиций раньше своей первоначальной и может смещаться вправо до бесконечности.

папа
источник
0

SmileBASIC, 61 58 байт

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

Каждый символ бесконечного списка добавляется в конец буфера. Когда длина буфера равна 11, случайный символ печатается и удаляется.

Функция Rгенерирует следующий символ.

12Me21
источник
-1

Пролог, 70 байт

s(L):-get0(C),(length(L,9)->random_select(H,L,R),put(H);L=R),s([C|R]).
Питер Рейнджес
источник
Извините, я не сказал, как это назвать: s ([]). Например, с пустым списком.
Питер Рейнджес
Добро пожаловать в PPCG! Не могли бы вы объяснить, как это работает? Я не уверен, что вы подразумеваете под "например, с пустым списком". Решения должны работать (и только должны работать) с бесконечными списками.
Мартин Эндер