Теорема о бесконечной обезьяне гласит, что, учитывая бесконечное время, машина, отправляющая бесконечный поток случайных символов, всегда будет печатать любой заданный текст.
Это звучит для меня как отличная идея для испытания.
Процесс
Для обезьяньей строки A необходимо выполнить следующие шаги:
- Возьми пустую строку. Мы назовем эту строку B.
- Выберите равномерно произвольный печатный символ ASCII (символы в диапазоне
0x20
до0x7E
) и добавьте этот символ в B. - Если A является подстрокой B, B является нашей обезьяньей строкой. В противном случае повторите шаг 2, пока A не станет подстрокой B.
Этот процесс является лишь примером, более простые методы могут существовать в зависимости от вашего языка. Вам не нужно точно следовать этому методу, если достигается такое же распределение выходов.
Соревнование
Напишите программу или функцию, которая, учитывая непустую строку в любом приемлемом формате , возвращает обезьянью версию этой строки.
Ваша программа должна практически работать только для входов длиной 3 или меньше. Для более длинных входов допускается досрочное завершение с или без вывода чего-либо.
пример
К сожалению, довольно сложно создавать примеры для этого вопроса из-за его случайного характера и больших результатов.
Тем не менее, я могу предоставить один пример для ввода hi
, на Hastebin.
счет
Поскольку это код-гольф , выигрывает представление с наименьшим количеством байтов.
B
напрямую, добавляя неотрицательное числоn
случайных символов вA
. Единственная реальная проблема - узнать распределениеn
(я держу пари на геометрическом распределении).W!}zH+ZOrd\k
, выглядят очень похоже на то, что напечатала обезьяна.Ответы:
C 192 байта
Попробуйте онлайн!
Сейчас это беспорядок, но, по крайней мере, он работает даже для угловых случаев ...
C636261 байтСпасибо @Jonathan Frech за сохранение байта!
Попробуйте онлайн!источник
i
становится достаточно большим, чтоs[i]
ссылается на нулевой терминатор строки (символ 0).ababc
and the monkey generate!!abababc
will your program halt?Python, 79 bytes
Try it online!
This is theoretically sound, but will crash early due to python's recursion limits (you can set them further to get longer results)
Python, 84 bytes
Try it online!
This one is ought to work for relatively longer strings, since it doesn't rely on recursion, at the cost of 5 bytes.
источник
s+'randint(32,126)'
randint(32,126)
would produce a string of the number, not the ascii char mappingOhm v2, 10 bytes
Try it online!
Explanation:
источник
GNU sed + coreutils, 75 + 1(r flag) = 76 bytes
Try it online! (It takes a lot of runs to get an answer for a length 2 input, because most of the time you run out of allowed TIO computation time.)
Explanation:
Benchmark: approximate, for scaling purposes only
источник
Funky, 64 bytes
This uses a few tricks I've been wanting to use in Funky, like a variable name after a keyword as in
whileS
, and using the fact that strings implicitly parent to thestring
library.Ungolfed
Try it online!
источник
Haskell, 100 bytes
Try it online!
Basic idea is to generate an infinite list of characters with
randomRs
and stop it once we find the string.источник
isPrefixOf
isn't in the standard Prelude…C# (.NET Core), 86 bytes
I don't really like how much creating the
Random
instance takes, but I don't think there's a way around it.Try it online!
источник
Random.Next(Int32,Int32)
является эксклюзивной и поэтому не является одним из сгенерированных чисел. Это можно исправить, заменив126
на127
.Random
, you can remove the variable declaration! 79 bytesPerl 5, 31 +2 (-pa) bytes
Try it online
источник
\E$
is extraneousJapt, 26 bytes
Try it online!
источник
R,
797675 bytes-3 bytes thanks to MickyT for changing the random sampler
-1 byte thanks to Robin Ryder for tweaking the random sampler again
Try it online!
источник
intToUtf8(runif(1,32,127))
32+95*runif(1)
as your random sampler.Charcoal,
151412 bytesTry it online! Link is to verbose version of code. Edit: Saved 2 bytes due to a subsequent bug fix in Charcoal. Explanation:
источник
Ruby, 42 bytes
Try it online!
источник
Pyth - 14 bytes
Try it online here.
источник
W!}Qk=+kpOrd\
is 14 bytes as well, SE is messing with formatting because of unprintable but range is generated the same wayMathematica, 65 bytes
Try it online!
-3 bytes from Jonathan Frech
источник
FromCharacterCode[RandomInteger@94+32]
is equivalent to the shorterRandomChoice@CharacterRange[32,126]
.Lua,
99102 bytesTry it online!
источник
MATL,
1716 bytesTry it online!
-1 byte thanks to Giuseppe
источник
Octave, 62 bytes
Try it online!
Explanation:
Many thanks to Luis Mendo for the edits!
источник
isvector
bynnz
? Andstrfind
byregexp
. Also, you can userandi(95)+31
, or maybe replace the wholesprintf
statement byo=[o,randi(95)+31];
(implicit conversion to char)Japt,
161411 bytesTry it
источник
Alice, 21 bytes
Try it online!
Explanation
This is framework for mostly linear programs that operate entirely in Ordinal (string-processing) mode. The IP bounces diagonally up and down through the program twice, which means that the actual code is a bit weirdly interleaved. The commands in the order they're actually executed are:
Let's go through this:
источник
Perl 6, 39 bytes
Try it online!
(...)[*-1]
returns the last element of the sequence defined by...
, of which:""
is the first element;* ~ (" " .. "~").pick
generates the next element by appending a random character in the appropriate range to the previous element; and* ~~ /$_/
is the ending condition, which is that the current element matches the main function's input argument$_
as a literal substring.источник
*~~
for -3 tio.run/##K0gtyjH7n1upoJamYPu/…Java 8,
817978 bytes-1 byte thanks to @OlivierGrégoire for pointing me to a (big >.<) mistake I've made..
Explanation:
Try it here.
источник
32+Math.random()*95
. There... bug fixed and a byte saved! ;-)05AB1E,
109 bytes (-1 @ Emigna)Try it online!
Do the monkey with me.
источник
Ω
instead of.R
.QBIC, 33 bytes
Explanation
Sample run:
источник
PHP, 55+1 bytes
Run as pipe with
-nR
. Not suitable for TIO cause of probable timeout.Insert a space between the quotation marks for PHP older than 7.1.
This 51+1 bytes version will fail if input is
0
:источник
Javascript 74 bytes
call like this:
источник
~b.search
instead ofb.includes
.Julia 0.6, 53 bytes
Try it online!
источник
Pushy,
2018 bytesTry it online!
The program keeps a stack
len(input)
characters long, and constantly removes the first and appends a new random char, until the initial input string is reached. Each character is printed as it is added, creating the desired effect.Explanation:
источник
Brachylog, 17 bytes
Try it online!
Can randomly stack overflow. This makes use of two recently added features in Brachylog: global variables, and the apply-to-tail metapredicate
ᵗ
.источник
Pyth, 13 bytes
where the unprintable character is 0x7F.
Test
источник
Bash 94 bytes
Try it online
источник