Для заданной строки введите S
print, S
а затем непустой разделитель следующим образом:
Шаг 1:
S
есть1/2
шанс быть напечатанным и1/2
шанс для завершения программы.Шаг 2:
S
есть2/3
шанс быть напечатанным, и1/3
шанс для завершения программы.Шаг 3:
S
есть3/4
шанс быть напечатанным и1/4
шанс для завершения программы....
Шаг
n
:S
естьn/(n+1)
шанс быть напечатанным, и1/(n+1)
шанс для завершения программы.
Заметки
Входная строка будет состоять только из символов, допустимых в строковом типе вашего языка.
Можно использовать любой непустой разделитель, если он всегда один и тот же. Ожидается, что разделитель будет напечатан после последней печати
S
перед завершением программы.Программа имеет
1/2
возможность прервать работу перед печатью.Завершающая новая строка приемлема.
В вашем ответе должна быть предпринята искренняя попытка соблюдения описанных вероятностей. Очевидно, когда
n
оно велико, это будет все менее и менее верно. Достаточно правильного объяснения того, как вероятности вычисляются в вашем ответе (и почему они уважают спецификации, не учитывая проблемы псевдослучайности и больших чисел).
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Ответы:
Pyth , 7 байт
Попробуйте онлайн!
Как это работает
псевдокод:
источник
C #,
9485 байтМой первый ответ!
Предыдущая попытка (мне понравилась
goto
):Ungolfed:
Примечание: в C #
Random.Next(N)
метод возвращает неотрицательное целое число в диапазоне [0, N-1], поэтому мы можем просто проверить, что возвращаемое число больше 0.источник
using System;
в свой счетчик байтов. Вы не можете объявитьr
рядный, нет необходимости , чтобы установить его в переменную:new Random().Next(i++)
. Вам не нужна конечная точка с запятой в функции гольфа.new Random().Next(i++)
но когда я пытался выполнить это, результатом всегда было либо то, что программа останавливается, ничего не печатая, либо программа никогда не останавливается. Когда я объявляюr=new Random()
и используюr
переменную, программа останавливается более случайным образом, как запрашивает OP.R,
474643 байта43 байта из-за Робина Райдера в комментариях.
Попробуйте онлайн!
объяснение
источник
function(s)
корочеs=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
еще короче.T
иF
с анонимными функциями, так как это изменяет глобальную переменную и означает, что функция может быть вызвана только один раз. Смотрите здесь : «Функция решения работает последовательно независимо от того, сколько раз она была вызвана ранее».05AB1E , 8 байтов
Попробуйте онлайн!
объяснение
источник
Javascript,
605854 байтаБудет выводить строку
s
. Разделитель, который печатается, если программа завершается, равенNaN
или0
.Math.random()
возвращает значение от 0 до 1. Если это значение меньшеn/(n+1)
, тоs
будет напечатано.4 байта сохранены благодаря @Neil
источник
n/++n
?alert
вместоconsole.log
сохранения 6 байт - фрагмент могalert = console.log
бы показывать не навязчивый вывод при желании (если это разрешено - не сохраняет байт, просто помогает сохранитьJava 8,
726261 байт-10 байт благодаря @cliffroot .
-1 байт благодаря @JollyJoker .
Разделитель это новая строка.
Объяснение:
Попробуй это здесь.
источник
if
условие вfor
блок условия?for
петле.for
цикл должен заканчиваться, чтобы он не нуждался в явномreturn
. Второе выражение внутри для утверждения.int n=2
и1f/n++
работать?Mathematica, 43 байта
JungHwan Min сохранил 1 байт (выше) и предложил что-то лучшее (ниже)
Mathematica, 37 байт
источник
RandomInteger@n!=0
такой же, какRandomInteger@n<1
в этом случае, иn++
может быть объединен сRandomInteger@n
. Кроме того,For
(почти всегда) корочеWhile
: -5 байтFor[n=1,RandomInteger@n++>0,Print@#]&
For[n=1,!n∣Hash[# n++],Print@#]&
также будет работать с 34 байтами, предполагая, что хеш довольно случайный. Однако случайность зависит от входных данных. Например попробуйте% /@ Alphabet[]
Clojure,
6156 байтО, почему я не пошел с
for
в первую очередь? Но на самом деле, чтобы быть педантичнымdoseq
, нужно использовать, какfor
лениво.Оригинал:
источник
(>(+(rand-int n)2)0)
всегда правда?n
!> <> ,
124112 байтПопробуйте онлайн! (Вы также можете посмотреть его на рыбной площадке , но из-за некоторых ошибок вы должны добавить
}
послеl
четвертой строки после и добавить несколько строк новой строки после кода, чтобы заставить его работать должным образом.)Случайность хитрая в> <>. Единственная случайная инструкция
x
, которая выбирает направление рыбы случайным образом из четырех вариантов (влево, вправо, вверх и вниз), превращая его во что-то с вероятностью 1 / n непросто.Этот код делает это с помощью самоизменяющихся возможностей> <>, чтобы построить Башню Случайности ниже кода, поэтому на четвертом этапе, например, код выглядит следующим образом:
Рыба начинается у основания башни. На каждом уровне башни
x
ловушка находится между двумя зеркалами, поэтому рыба может убежать, только пройдя налево или направо. Любое из этих направлений отправляет рыбу на следующий уровень башни, но движение влево также толкает0
к стеку. К тому времени, когда рыба достигает вершины башни, в стопке содержится некоторое количество0
s, и это число следует биномиальному распределению с n испытаниями и p = 1/2.Если длина стека равна 0 (с вероятностью 1/2 n ), программа останавливается. Если длина равна 1 (с вероятностью n / 2 n ), рыба печатает ввод и новую строку и строит еще один уровень башни. Если длина чего-то еще, рыба сбрасывает стог и возвращается на дно башни. По сути, из возможностей, которые действительно что-то делают, n из них выводят строку ввода, а одна из них останавливает программу, давая необходимые вероятности.
источник
Python 3 ,
726966 байтПопробуйте онлайн!
источник
random()<1/i
.randint
включительно. Затем вы можете сократить эту строку доwhile randint(0,i):print(s);i+=1
QBIC ,
1917 байтСбросил
=1
, переключил условно, сохранил 2 байтаобъяснение
источник
Braingolf , 23 байта
Попробуйте онлайн!
Генерирует случайное число,
x
где0 <= x < n+1
, завершается, еслиx
равно 0, в противном случае увеличиваетсяn
и зацикливается. Разделитель есть|
Объяснение:
источник
Алиса , 18 байт
Попробуйте онлайн!
объяснение
источник
PHP , 31 байт
Попробуйте онлайн!
источник
Perl, 26 байт
24-байтовый код + 2 для
-nl
.Попробуйте онлайн!
источник
Древесный уголь , 14 байтов
Попробуйте онлайн! Ссылка на подробную версию кода. Используется
_
как разделитель. Примечание: кэширование вывода отключено, поэтому, пожалуйста, не забивайте сервер Денниса!источник
MATL , 9 байт
Попробуйте онлайн!
объяснение
источник
Perl 6 ,
50 41 38 3626 байтПопытайся
Попытайся
Попытайся
Попытайся
(с
-n
аргументом командной строки)Попытайся
источник
Python 3 , 55 байт
объяснение
Чтобы избавиться от необходимости импортировать случайные файлы, я использовал тот факт, что встроенный хэш-код выбирается случайным образом при каждом запуске процесса Python (по крайней мере, в MacOS). Каждый хэш последнего хеша должен генерировать серию псевдослучайных чисел.
Если хеш достаточно псевдослучайный, то модуль
i
с вероятностью равен нулю1/i
.Заметки
Я немного обеспокоен избыточным хэшем, но без использования do-while или условия в Python я немного застрял.
источник
I'm a little bothered...
рекурсии?C #
Это та же длина, что и в верхнем ответе C #, но:
Просто хотел отметить, что некоторая математика может дать правильную вероятность.
Эквивалентно
И функция f (x) = 1 / x-1 имеет вид:
f (1) = 0
f (1/2) = 1
f (1/3) = 2
f (1/4) = 3
Таким образом, 1/2 шанс округления до 0, 1/6 шанс округления до 1, а 1 / (n + 1) (n + 2) шанс округления до n.
Может быть, какой-то другой язык мог бы извлечь выгоду из этого.
РЕДАКТИРОВАТЬ: исправил мою ошибку
Я думал о чем-то, чтобы сделать это меньше.
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Я просто все виды неправильно. Вытащил Random из цикла, потому что если он оценивается несколько раз, он не будет работать.
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Я избавился от переменной я. Я собираюсь прекратить пытаться уменьшить это сейчас. Нет, солгал. Избавился от другого байта.
источник
Древесный уголь , 17 байт
Попробуйте онлайн! Подробный код включен. Уважает спецификации, потому что он использует случайный диапазон от
0
доn
.источник
C, 41 байт
Предполагается, что
rand
это посеяно. Попробуйте онлайн!источник
rand
, посеян». - Это правильное предположение?rand
Стандарт требует, чтобы по умолчанию фиксированное начальное значение равнялось 1, и все известные мне реализации делают именно это. Если эта функция выполняет только то, что запрашивает вызов, в сочетании с другим кодом, я думаю, что другой код должен быть включен в ответ и в число байтов.Braingasm , 22 байта
редактировать: то же самое количество байтов, но я понял, что могу пробраться в новую
L
функцию имитации ленты .Используется
0
как разделитель. Работает так:источник
Python , 54 байта
Попробуйте онлайн!
Генерируется количество копий как
floor(1/p)-1
сp
единообразно выбранным из единичного интервала. Количество копий - этоn
когда1/p-1
междуn
иn+1
, когда это происходит1/(n+2) < p < 1/(n+1)
. Это происходит с вероятностью1/(n+1)-1/(n+2)
или1/((n+1)*(n+2)
. Это желаемая вероятность выводаn
копий:1/2
вероятности 0,1/6
вероятности 1,1/12
вероятности 2, ...источник
form random import*
внизу?f=
и не помещая его в заголовокC ++,
979657 байтВот моя первая попытка на Codegolf :)
Я сохранил один байт, используя
for
Сохранено 39 байт, поскольку никто не считает, что включает
ungolfed
источник
F #, 161 байт
Определенно, не лучший язык для гольфа, но я решил попробовать его (кроме того, я ничего не знаю о F #, поэтому любые советы по улучшению моего ответа будут приветствоваться).
Выполнить с:
Записывает новую строку как разделитель.
источник
Рубин , 29 + 1 = 30 байт
Использует
-n
флаг.Попробуйте онлайн!
источник
puts$_
на,print
но не ясно, что правила поддерживают это.JS (ES6), 47 байт
В отличие от другого ответа ES6, здесь используются рекурсивные бомбы и бомбы предупреждения вместо рекурсии. Разделитель, который печатается при остановке программы, не определен.
источник
PowerShell, 31 байт
Get-Random $i
выводит разделительn
where0 <= n < $i
, неявный символ новой строки.источник
Python, 75 байт
Другой ответ Python короче, но я хотел попробовать это по-другому:
источник