Випадковий гольф дня № 8: Перемішайте нескінченний список


23

Про серію

По-перше, ви можете ставитися до цього, як і до будь-якого іншого виклику коду для гольфу, і відповісти на нього, не турбуючись про серію взагалі. Однак існує лідери у всіх викликах. Ви можете знайти таблицю лідерів разом з додатковою інформацією про серію в першій публікації .

Отвір 8: Перемішайте нескінченний список

Ви повинні написати функцію або програму, яка приймає нескінченний список як вхідний і повертає перетасовану версію цього списку.

Про нескінченний ввід / вивід

Існує кілька способів взяти внесок і отримати вихід для цього завдання:

  • Ви можете або взяти список натуральних чисел, або їх рядкове представлення, або рядок або список друкованих символів ASCII (0x20 до 0x7E включно). Формат виводу повинен відповідати вхідному формату. Я просто буду називати дані "списком" відтепер, незалежно від того, який варіант ви обрали.
  • Ви можете прочитати список з нескінченного стандартного вхідного потоку і записувати вихід безперервно в нескінченний стандартний вихідний потік. Рішення не повинно залежати від якогось конкретного значення або послідовності значень, щоб забезпечити регулярний запис та вимивання потоку виходів (наприклад, ви не можете просто записувати вихід, коли 5у списку вводу є запис). Звичайно, якщо ви читаєте рядкове представлення списку, непогано почекати, поки не зустрінеться з роздільником списку.
  • Мовами, які їх підтримують, ви можете написати функцію, яка приймає та повертає ледачий нескінченний список чи рядок.
  • На мовах, які їх підтримують, ви можете реалізувати нескінченний генератор, який приймає інший генератор як вхідний.
  • Крім того, ви можете написати функцію, яка не бере аргументів і повертає одне вихідне значення кожного разу, коли воно викликається. У цьому випадку можна припустити, що визначена функція, яка не бере аргументів і повертає наступне вхідне значення кожного разу, коли воно викликається. Ви можете вільно вибрати ім'я цієї функції.

Ви можете припустити, що ваша програма працює вічно і що нескінченна пам'ять доступна. (Це можна вирішити за допомогою обмеженого обсягу пам'яті, але це означає, що вам дозволяється просочувати пам'ять.)

Про випадковість

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

Отже, не обов’язково, щоб ваше рішення пересувало перше значення дуже далеко вниз по списку, або що воно може переміщувати дуже пізнє значення до першої позиції, хоча це добре, якщо так, поки всі позиції 9 кроків від поля введення можливе.

Наприклад, якщо ви взяли наступний рядок в якості введення, ___вказує всі позиції, які Xповинні бути в змозі потрапити у висновку:

                  ___________________
 abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...

Якщо у вашій мові відсутній вбудований генератор випадкових чисел або ви не хочете користуватися нею, ви можете взяти додаткове значення насіння в якості введення та реалізувати власний відповідний RNG за допомогою насіння. Ця сторінка може бути корисною для цього.

Незалежно від реального розповсюдження, яке використовує ваше рішення, воно повинно майже напевно виробляти наступне значення через обмежений (але довільний) час.

Додайте коротке пояснення про те, як ваша реалізація відповідає цим вимогам.

Оцінка балів

Це , тому найкоротший вірний відповідь - вимірюється в байтах - виграє.

Таблиця лідерів

Перший пост серії генерує таблицю лідерів.

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

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

(Мова наразі не відображається, але фрагмент вимагає і аналізує його, і я можу в майбутньому додати таблицю лідерів за мовою.)


2
Чи можемо ми вважати, що доступно нескінченний час / пам'ять?
Мего

Якщо в мові є щось, що називається генератором випадкових чисел, чи насправді нам потрібно використовувати?
feersum

1
@Mego Нескінченний час, очевидно. І нескінченна пам'ять, так, як зазвичай, для проблем, які вимагають, щоб програми обробляли дані назавжди (це можна вирішити в обмеженій пам'яті, але я не хочу карати мови, які змушені просочувати пам'ять).
Мартін Ендер

@feersum Мабуть, мабуть, я дещо точніше визначити вимоги до власного побудованого генератора випадкових чисел, але я не можу уявити, щоб реалізація вашої власної була коротшою, ніж вбудована RNG у більшості випадків?
Мартін Ендер

@feersum Я трохи уточнив цю частину і пов’язаний із нашим стандартним визначенням для випадковості.
Мартін Ендер

Відповіді:


13

Пітон 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))

9

Befunge ( химерний смак ), 4 байти

?,?~

,читає персонаж із потоку і натискає на стек. ~вискакує верхній символ із стека (якщо він присутній) та друкує його. ?рандомізує, яка команда виконується далі. Отже, алгоритм тут "У нескінченному циклі, з однаковою ймовірністю або натисніть на персонаж, або попуйте символ". Я думаю, що це задовольняє вимогам: персонаж може бачити довільно багато символів, доданих над ним у стеку, тому він може довільно переміщуватися далеко вправо, і він може бути надрукований, коли стек довільно великий, так що він може довільно переміщуватися далеко до ліворуч.


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

SILOS , 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 ц b1
 голий

  = буду
   x = 1b 15 1
5b a * b = lb rd # + lb eaI O e 
 х
 ifquu   
1 0x b
   =

    е
0
   i lblxa -d * 2
    quu x = rn 
   x Xea p0
   pnInt ora
   mf = тобтоPit
  ба 1
   GTO 1 fb x + Oa


 qe -lblX u0 м GOOue  
[rlT 

 tnn5! I.STii] [S.LO тобто

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 "
 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
hs 0Це те 
 lodshipo alauttt.mpra quuet я 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 elnkhecarcthe (sc ho noreiItrolwaaldibtio lmiru.t 'iereaf) tsng tetntiottssht prasnon hogIms тільки twieatisi s vroscpythohanavars er ".
 tte s / "gt 
obterelIe tsvea non-omhTrehs a plntvesion hcahihk ine teuts sriprics at rwvritcaw aa g (hoee n onl kein n00 orscat, 0 cter).

[Тяуоас це онйн! Хрхріс:.ru] p // o / 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. "dгг

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

@ wizzwizz4 виправлено
Rohan Jhunjhunwala

3

Ацето , 24 байти, неконкурентоспроможний

Неконкурент, тому що мені довелося виправити помилку в перекладачі.

^




OYpO
r^`!
?d0=   >

Бере нескінченний потік ліній і виводить їх у випадковому порядку. Кожен елемент має шанс виникнути в будь-якій випадковій точці.

Починаємо з а ?в нижньому лівому куті, який рухає нас у випадковому напрямку. Якщо це вниз або вліво, нас відштовхують право назад.

Якщо нас перемістили вгору, ми rнаберемо значення, перетасуємо стек ( Y) і відскакуємо назад до Oригіна.

Якщо ми переміщені праворуч, ми dускладнюємо верхнє значення стека, натискаємо a 0і перевіряємо рівність (оскільки ми читаємо рядки, ми не можемо мати цілого числа 0). Якщо значення рівні, це означає, що ми дійшли до нижньої частини стека (з якої ми не хочемо друкувати). Ми заперечуємо порівняння ( !) і pвідзначаємо лише, якщо ( `) речі не були рівними. Тоді ми також стрибаємо назад до Oребра.


3

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

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

У моїй оригінальній відповіді було використано лінивий нескінченний список, але це коротше. Ну добре.


2

MATL , 11 байт

`rEkN*?D}iT

Спробуйте в Інтернеті!

Порт відповіді істократа Бефундж .

Пояснення: (Спасибі Луїсу Мендо за -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>?щоб перевірити, чи достатньо заповнений список ...).


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

Що означає "своп" у вашій діаграмі?
Мартін Ендер

@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 

не впевнений, чи xargs shuf -eзадовольняє вимоги
маркосм

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). Коли буфер досить довгий, перший елемент друкується та видаляється з вектора.


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.


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генерує наступний символ.


-1

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

s(L):-get0(C),(length(L,9)->random_select(H,L,R),put(H);L=R),s([C|R]).

Вибачте, я не сказав, як це назвати: s ([]). Наприклад, з порожнім списком.
Пітер Рейнджес

Ласкаво просимо до PPCG! Чи можете ви пояснити, як це працює? Я не впевнений, що ви маєте на увазі під ", наприклад, із порожнім списком". Рішення повинні працювати (і лише працювати) з нескінченними списками.
Мартін Ендер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.