Напишите программу, способную генерировать себя случайным образом.
Он должен делать это на основе токенов, используемых в его исходном коде. Если исходный код вашей программы состоит из 50 уникальных токенов и имеет длину 60 токенов, то программа должна вывести 60 токенов, где каждый токен случайным образом выбирается из одного из 50 уникальных токенов.
Например, у этой программы был бы один шанс из 50 ^ 60 воспроизвести себя.
Что такое токен? Это зависит от языка. Например, идентификаторы ( foo_bar
), ключевые слова ( while
) и цифры ( 42
) будут считаться токенами в большинстве языков. Пробелы не учитываются в большинстве языков.
Дополнительные правила:
- Вывод может содержать только токены, найденные в исходном коде программы, разделенные соответствующим разделителем
- Вывод должен быть той же длины, что и исходный код программы, с учетом токенов
- Можно использовать только один язык программирования
- Исходный код должен иметь как минимум 3 уникальных токена
- Исключить комментарии из исходного кода
- Программа должна иметь только один шанс, чтобы воспроизвести себя
Подсчет очков: побеждает программа, которая имеет наилучшие шансы воспроизвести себя.
code-challenge
quine
Остин Хенли
источник
источник
Ответы:
Python 2, 3 ^ -3 = 0,037
exec
Злоупотребление очень удобно для уменьшения количества токенов. Теперь обновлено, чтобы не читать исходный файл!Дополнительная строка
''
междуexec
и гигантской строкой в тройных кавычках просто добавляет число маркеров к необходимому минимуму 3. Он объединяется во вторую строку из-за неявной конкатенации буквенных строк.Оригинальная версия с открытием исходного файла:
Строго говоря, грамматика Python помещает токен ENDMARKER в конец исходного файла, и мы не можем создать исходный файл с произвольно разбросанными ENDMARKER. Мы притворяемся, что его не существует.
источник
".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''
.Javascript, 102 токена, 33 уникальных, 7,73 × 10 -154
Обратите внимание, это настоящая квинна. Он не читает файл или не использует
eval
илиFunction.toString
источник
Python: P (создание программы в 1 пробной версии) = 3,0317 * 10 ^ -123
34 уникальных токена, 80 всего токенов. Обратите внимание, что в конце каждой строки есть пробел.
Пример вывода:
Спасибо другому решению Python от user2357112 за напоминание, что я должен отказаться от последнего токена и использовать его, о
__file__
котором я раньше не знал.источник
J - 1 в 11 17 = 1,978 x 10 -18
У J есть несколько удобных маленьких инструментов для выполнения таких работ.
Прежде всего, любая строка чисел, разделенная пробелами, является одним токеном . Это означает одномерный массив этих чисел. Вот как работает лексер J. Кстати, это семнадцать
11
секунд, если кому-то интересно.(,,,{:,{:)'QUINE'''
это обычный трюк с квиннами в J, созданный для использования как можно меньшего числа токенов:{:
означает Tail , поэтому он добавляет строку к себе, а затем добавляет две копии последнего символа в конце этого. Поскольку последний символ представляет собой одинарную кавычку (J использует строки в стиле Pascal), результат будетQUINE'QUINE'''
.;:
является токенизатором и разбивает входную строку, как если бы это был код J, возвращая список блоков. Длина этого результата составляет 17.~.
берет все уникальные элементы этого массива. Длина этого результата составляет 11.?
называется Roll . Для каждого целого числа в своем аргументе он выбирает случайное положительное число, большее или равное нулю, меньше этого числа. Так что здесь J сгенерирует 17 чисел от 0 до 10 включительно.{
использует случайные индексы для выбора элементов из нашего списка уникальных токенов в коробках.;
открывает все эти поля и запускает результат вместе.Вот несколько примеров. Строки с отступом - это входные приглашения, а строки, находящиеся на одном уровне с левой стороной, - это вывод интерпретатора.
источник
постскриптум
Это было весело
Существует 17 уникальных жетонов и 54 жетона всего на 1 шанс 3,6e-67.
источник
Пробелы,
3 ^ -2053 ^ -1893 ^ -1813 ^ -132 ~ = 10 ^ -63Это программа Whitespace, которая при засеве случайными символами имеет шанс 1 на 3 ^ 132 воспроизвести себя (3 различных токена, повторяемые 132 раза). При запуске он должен содержать не менее 132 случайных символов (в пробеле нет встроенной функции выбора случайных чисел или даты), например
some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws
. Счет мог бы улучшиться, если бы программу можно было играть в гольф больше, но это моя первая «настоящая» программа для пробелов, поэтому я просто оставлю ее с моим скудным количеством игры в гольф.Простой код пробела или его запуск : (чтобы попробовать, нажмите «изменить», скопируйте содержимое внутри тегов <pre>; должно быть 132 символа с EOL в стиле Unix)
Код с аннотацией к какой команде есть что (технически не квин, так как он не воспроизводит комментарии):
Если семя просто оказывается эквивалентным (символы берутся из мода 3 для преобразования в токены), то это будет успешно:
Это довольно простая программа, примерно эквивалентная этой Ruby-программе:
источник
Perl, 27 токенов, P = 1,4779 x 10 -34
Последнее редактирование: используйте
@ARGV=$0
вместоopen*ARGV,$0
сохранения токена.=
,/
,@
,$
)W
)Поэтому я думаю, что это делает вероятность (pow (2,2 * 4) * pow (4,4)) / pow (27,27), около 1,48E-34.
Если исходный код находится в файле с именем
ARGV
, то вы можете использовать это решение с 26 токенами с P = ~ 2,193 x 10 -31 :источник
P = (4 * 2! + 4!) / 27!
что составляет около 1,7632684538487448 x 10 ^ -26Perl 6 ,1 в 33 знак равно 0.037037 ...
(Я знаю, что это не код-гольф, но ...)
Попробуйте онлайн!
Почти так же, как ответ Python, где первый токен является строковым литералом, который оценивается. Токены
Объяснение:
источник