О серии
Во-первых, вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь о серии вообще. Тем не менее, существует таблица лидеров по всем задачам. Вы можете найти таблицу лидеров вместе с дополнительной информацией о серии в первом посте .
Отверстие 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
(Язык в настоящее время не отображается, но фрагмент требует и анализирует его, и я могу добавить таблицу лидеров по языкам в будущем.)
источник
Ответы:
Python 3 , 78 байт
Попробуйте онлайн!
Принимает данные из STDIN (по одному на строку), печатает в STDOUT.
Содержит буфер
l
до 10 элементов. Буфер перетасовывается с каждым шагом. Когда его длина равна 10, последний элемент печатается и удаляется.Если элемент распечатывается сразу после его вставки, он пропустил 9 других элементов, ожидающих в буфере, поэтому остается 9 мест. Элемент может ждать в буфере произвольно долго, поэтому его позиция может перемещаться на любую величину вправо.
Кажется, нет хорошего способа создать и удалить случайный элемент из списка. Тасование кажется излишним. Это на 2 байта больше для использования
l.pop(randint(0,9))
(при этом в списке 10 элементов).Это не лучше сделать
x=choice(l);l.remove(x)
. Язык сpoprandom
подобныммог бы очень чисто сделать
источник
Befunge ( необычный вкус ), 4 байта
,
читает символ из потока и помещает его в стек.~
выскакивает верхний символ из стека (если есть) и печатает его.?
рандомизирует, какая команда выполняется дальше. Таким образом, алгоритм здесь такой: «В бесконечном цикле с равной вероятностью либо нажмите символ, либо вставьте символ». Я думаю, что это удовлетворяет требованиям: персонаж может видеть произвольно много символов, добавленных над ним в стеке, поэтому он может перемещаться произвольно далеко вправо, и он может быть напечатан, когда стек является произвольно большим, поэтому он может перемещаться произвольно далеко, чтобы слева.источник
>> document.getElementById("output").innerHTML = "a\0b"
>> document.getElementById("output").innerHTML
"ab"
C (gcc) , 94 байта
Попробуйте онлайн!
Хорошо, ссылка на TIO не имеет особого смысла. Для удобства тестирования я создал следующую программу на C, которая будет выводить случайные символы ascii или повторять строку бесконечно.
Эта программа будет называться
iro
.Корректность программы
То, что я делаю здесь, это чтение
9
значений в буфер. После этого случайные индексы выбираются из этого массива и выводятся, а затем заменяются следующим символом в потоке.источник
СИЛОС , 149 байт
Попробуйте онлайн!
По сути, он продолжает принимать данные (в онлайн-переводчике через аргументы, а в офлайновом официальном интерпретаторе - он позволяет вводить в консоль (бесконечно)) блоками по 15 за раз (30 - первый блок).
Он загружает входные данные во временную очередь и выбирает 15 счастливчиков (случайным образом, но не одинаково с точки зрения вероятности или распределения).
Остальные остаются, поскольку новые входы заполняют очередь, первый ввод может быть перетасован до самого конца (в основном я думаю, что символы следуют нормальному распределению). Интересно отметить, что эта программа всего лишь вдвое более многословна, чем python, и, возможно, «гольфее», чем Java.
Чтобы лучше увидеть результаты, у меня есть несовместимая версия, которая принимает входные данные в виде строки (однако она может содержать не более 8000 символов).
Попробуйте онлайн!
Просто для забавы, вот этот пост, пропущенный через строковую версию.
источник
Aceto , 24 байта, неконкурирующий
Не конкурирует, потому что мне пришлось исправить ошибку в интерпретаторе.
Берет бесконечный поток строк и выдает их в случайном порядке. Каждый элемент может появиться в любой случайной точке.
Мы начинаем с
?
левого нижнего угла, который перемещает нас в случайном направлении. Если это вниз или влево, нас отталкивают обратно.Если мы перемещаемся вверх, мы получаем
r
значение, перетасовываем стек (Y
) и возвращаемся кO
началу.Если мы перемещаемся вправо, мы
d
увеличиваем значение верхнего стека, нажимаем a0
и проверяем на равенство (так как мы читаем строки, у нас никогда не будет целого числа 0). Если значения равны, это означает, что мы достигли дна стека (из которого мы не хотим печатать). Мы отрицаем сравнение (!
) иp
ринт только если (`
) вещи не были равны. Затем мы такжеO
прыгаем обратно на ригин.источник
Рубин, 43 байта
В моем первоначальном ответе использовался бесконечный список с ленивым вычислением, но это короче. Ну что ж.
источник
MATL , 11 байт
Попробуйте онлайн!
Порт гистократа Befunge ответ .
Пояснение: (Спасибо Луису Мендо за -1 байт)
Это выводит почти наверняка за конечное время и почти наверняка требует только конечной памяти .
Для полноты вот 15-байтовая версия, которая содержит 10-элементный буфер и выводит случайный элемент из этого:
Мне нравится эта версия для очень идиоматических (насколько идиотскими могут быть языки игры в гольф)
tn...Yr&)
, которые выталкивают случайный элемент из списка и возвращают список без этого элемента. Однако конкретная логистика этой задачи добавляет много байтов (требуетсяw
для отображения,t9>?
чтобы проверить, достаточно ли полный список ...).источник
Алиса , 7 байт
Попробуйте онлайн!
Это должно работать на бесконечном вводе с бесконечным временем и памятью, но это не так легко проверить на практике :)
объяснение
На каждой итерации 10 символов считываются с ввода и только один идет на выход, поэтому использование памяти увеличивается линейно во время выполнения. С конечным вводом это быстро достигает EOF, из которого десять -1 будут помещаться в стек на каждой итерации. Попытка вывести -1 как символ не имеет никакого эффекта, но маловероятно, что все символы ввода будут напечатаны в разумные сроки.
Позиция i выхода может быть взята любым символом на входе до позиции 10i , это соответствует задаче, требующей, по крайней мере, диапазон от i-9 до i + 9 .
источник
C 214 байта
Как это работает
Попробуйте онлайн (UNIX)
источник
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
05AB1E , 13 байтов
Попробуйте онлайн! (модифицировано, чтобы взять 20 элементов)
источник
Баш , 17 байт
Попробуйте онлайн!
xargs непрерывно берет 9 писем из STDIN и отправляет их в случайном порядке
бесконечный список может быть сгенерирован:
который печатает abcde .. z бесконечные времена.
Тест может быть выполнен:
источник
xargs shuf -e
удовлетворяет требованиямR 70 байт
Начинается с пустого вектора
x
. В бесконечном цикле он принимает новое значение из STDIN, а затем тасует вектор. Затем он проверяет, равна ли длина построенного списка 10 или выше. Если это так, он может начать печать. Таким образом, вектор имеет буфер из 10 входов, каждый из которых перетасовывается на каждой итерации. Таким образом, входные данные могут быть напечатаны на 10 мест раньше и бесконечно много мест позже (после геометрического распределения с помощьюp=1/10
). Когда буфер достаточно длинный, первый элемент печатается и удаляется из вектора.источник
Javascript, 78 байт
Использует тот же метод, что и ответ xnor.
источник
Perl 5 , 39 байт
38 байт кода +
-n
флаг.Попробуйте онлайн!
Добавьте каждый элемент в
@F
массив (сpush@F,$_
). Когда@F
содержит 10 элементов (push
возвращает количество элементов в массиве, следовательно9<push...
), случайный элемент удаляется и печатается (splice@F,rand 10,1
чтобы удалить элемент,print
чтобы напечатать его).Вывод начинает происходить после того, как 10-й элемент был прочитан. Следовательно, каждый элемент может начать появляться по крайней мере на 9 позиций раньше своей первоначальной и может смещаться вправо до бесконечности.
источник
SmileBASIC,
6158 байтКаждый символ бесконечного списка добавляется в конец буфера. Когда длина буфера равна 11, случайный символ печатается и удаляется.
Функция
R
генерирует следующий символ.источник
Пролог, 70 байт
источник