В этом вопросе будет использована простая модель Маркова. Для получения дополнительной информации о цепях Маркова см. Http://setosa.io/ev/markov-chains/ .
Возьми строку. Для этого примера мы будем использовать слово:
reader
Теперь для каждого символа возьмите символы, которые появляются после каждого вхождения символа в строке. ( `^`
представляет начало строки и `$`
представляет конец)
`^` -> {'r'} # After the start of the string, there is an `r`.
'r' -> {'e', `$`} # After the first `r` (*r*eader), there is an `e`
# after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}
Теперь, начиная с начала строки, выберите случайным образом один из символов в следующем наборе. Добавьте этот символ, а затем выберите его из следующего набора и так далее, пока не дойдете до конца. Вот несколько примеров слов:
r
rereader
rer
readereader
Если персонаж появляется после другого символа несколько раз, он более вероятен. Например, cocoa can
после a c
есть две трети шансов получить o
и одна треть шансов получить a
.
'c' -> {'o', 'o', 'a'}
Вызов
Создайте программу, которая не требует ввода и выводит случайную строку, сгенерированную с использованием цепочки Маркова, как описано выше, где вход в цепочку является источником программы.
- В программе должно быть как минимум два символа, два из которых должны быть одинаковыми (чтобы предотвратить «скучные» цепочки, которые имеют только один вывод)
- Вы можете изменить модель, чтобы использовать байты вместо символов, если хотите, но измените «символы» на «байты» в правиле 1
- Программа должна выводить строки случайным образом с ожидаемой частотой в теории
Это код-гольф , поэтому выигрывает самая короткая программа!
источник
^
и$
в кавычках? это могло бы сделать более понятным удаление из кавычек или размещение их в обратных кавычках.Ответы:
Пип , 64 байта
Это было весело
<tab>
представляет буквенный символ табуляции (0x09
). Попробуйте онлайн!Как?
TL; DR: синтаксис экранированной строки, repr и eval.
Для строк, которые должны содержать буквенные
"
символы, Pip экранировал строки , используя\"
в качестве разделителя. Стандартный quine, использующий экранированные строки, будет выглядеть так:То есть:
Y
ank (сохраняя какy
) строку, содержащую"V Y".RPy
и всеV
это.RPy
принимает ответy
, к которому мы добавляем литеральную строкуV Y
. Наконец, выведите результат eval.Структура марковской квайны аналогична, за исключением того, что мы хотим сохранить код, а не выводить его, а затем сделать с ним что-то еще.
t:V Y\"...\"
присваивает eval результатt
. Внутри eval'd-кодаm:"..."
присваивает строку кодаm
, которую мы будем оценивать в концеVm
.ST["t:V Y"RPy";Vm"C9]
создает список, содержащийи преобразует его в строку, которая по умолчанию объединяет все элементы. Этот раздел эквивалентен
"V Y".RPy
оригинальному Quine. Поскольку это последнее выражение в большой строке eval, его значение - это то, чтоV
возвращает оператор, и, следовательно, то, что ему присваиваетсяt
.Таким образом, после eval и присваивания,
t
он равен полному коду иm
содержитТеперь
Vm
оценивает это как код. Давайте разберемся, что происходит.Пара замечаний:
xxy
будет возвращать только,xx
а неxy
в матчах. К счастью, в этом коде нет двойных символов, так что это не имеет значения.источник
JavaScript,
217215 байтОбратите внимание, что это использует
uneval
, который поддерживается только Firefox. Образцы прогонов:Как вы можете видеть, это в основном бред, но этого и следовало ожидать;) OP создал JSFiddle, который демонстрирует, что вероятность того, что вывод будет синтаксически верным JS, составляет около 6,3%.
Если бы были разрешены функции самостоятельного чтения, это могло бы быть 78 байтов ES6:
Очень, очень редко, это выводит синтаксически допустимый JS:
Мой любимый из названий функций, которые он создал,
.splendom()
(split
+length
+random
)источник
a.splerength.r()
, что могло бы быть в силе;)Perl, 103 байта
Основываясь на стандартной квине и моем ответе на этот вопрос :
Пример вывода
Как и в случае с другим вопросом, некоторые результаты генерируют допустимый Perl:
но шансы немного ниже, на ~ 2%.
источник
q{
является началом строкового литерала, и}
закрывать его нет. Perl на самом деле довольно плохо запускает случайные последовательности байтов (и когда это происходит, обычно это происходит из-за раннего строкового литерала или комментария).Машинный код MS-DOS (файл .COM), 63 байта - не конкурирующий
Не конкурирует, потому что квин не должен иметь доступ к своему исходному коду.
126-байтовый вариант будет соответствовать требованию «не иметь доступа к своему исходному коду»!
63-байтовый вариант выглядит так:
Я также не уверен насчет распределения вероятностей случайного генератора:
Программа использует тот факт, что счетчики часов и другая информация, измененная прерываниями, хранятся в сегменте 0 для генерации случайных чисел.
Примеры полученных результатов:
Преобразованная в ассемблерный код программа выглядит так:
источник
С, 306
328585611615623+673707байтовИсходный код:
С символами новой строки и пробелами добавлены для удобочитаемости / объяснения:
объяснение
Line 01
:p[][]
содержит количество символов, следующих за другим.Line 02
:X
содержит исходный код программы, экранированный с%c%s%c
.Line 03
:Y
будет содержать буквальный источник программы.c
,j
,*a
Рассчитывают переменные.Line 05
:Y
Содержит квинну.Line 06
: Считать буквы вp[][]
.Line 07
: Печать текущего состояния.Line 08
: Случайно найти следующий символ, пропорциональный количеству вp[][]
.Образец вывода:
p[++);p[99]=Y;putfor(aind(a++j,*a+j=j,c][c,*an(arile(pr*Y,Y[256]<<1);)][*Y,Y;)wha+++j=*aintfor*Y;prin(a+j]=j][256<1)pr(a;a;f(p[char(Y;for());};a;ma;ma=%s%chain(Y;ar(j][256<<<1)p[256<<raile(cha][9]<rin(j,34,34,Y[256]+j,Y,34,Y,c=Y,*a;*a;for(){0}
источник
Рубин, 152 байта
Образец вывода:
или
В Quines используется форматирование строк с помощью
"s%s"
и выполняется цепочка Маркова путем взятия всех двухсимвольных срезов, их перетасовки и превращения в хэш-словарь, где для дублированных ключей последнее появление определяет значение. Чтобы избежать добавления дополнительной логики для начала, я отслеживаю использование самого последнего выходного символа$/
, который автоматически инициализируется новой строкой, и гарантирую, что в коде всегда следуют символы новой строки0
, с того же символа, с которого начинается код. В конце я манипулирую исходным кодом, чтобы он был только один,!
поэтому мы всегда заканчиваем после взрыва, используя его<<33
для добавления без литерала. Это можно было бы использовать в дальнейшем, используя непечатный символ из одной цифры вместо ASCII 33, но это казалось слишком раздражающим.источник
p<<<<<33
Оператор супер-супер-супер-конкат? ;-)Has(s).ears(2)
заставляет ли меня смеяться объект !Ржавчина, 564 байта (неконкурентоспособна)
Так как я уже написал довольно аккуратный вопрос Rust для другого вопроса, я решил приспособить его для этого, поскольку он казался достаточно простым. Хотя оригинал был небольшим, для этого я сделал очень небольшую попытку минимизировать размер. Вот расширенная версия, чтобы объяснить, что происходит:
Пример вывода 1:
Пример вывода 2:
источник
Python 2, 211 байт
Выводит результат в
stderr
.Попробуйте онлайн
Образец вывода:
Краткое объяснение:
s='s=%r;print s%%s';print s%s
формат Quine. Я создаю строкуs
, которая будет содержать всю программу.X
содержит процедуру, выполняемую рекурсивно.o
, которая будет напечатана вstderr
по достижении конца цепочки Маркова.$$
, состоящей из двух символов, чтобы программа работала для всех строк. Я мог бы использовать персонаж не в моей программе, какchr(0)
, но я думаю, что это дольше.c
который (вместе сo
) инициализируется первым символом программы.c
в строкеt
(переменная, содержащая квинус исходного кода)q
, будет выбран для следующего выбораc
.источник
PHP,
144135130120272220212 байтИли отформатирован для удобства чтения:
Образец вывода:
и:
и:
и:
Обман PHP, 117
Для любопытных, если мы обманываем, читая наш собственный источник, мы можем сделать 117:
источник