Как мы знаем, quine - это программа, которая выводит собственный исходный код. Однако также возможно написать программу, которая выводит другую, другую программу, которая снова выводит первую программу. Например, программа Python 2
x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3
при запуске выведет следующий текст:
print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""
Когда программа запускается как программа Python, она снова выведет исходный код. Это называется повторяющейся квинной . Поскольку вам нужно запустить его дважды, чтобы вернуть исходный код, мы говорим, что он имеет период 2 . Но, конечно, возможны гораздо более высокие периоды.
Ваша задача состоит в том, чтобы написать итеративную квинну с как можно более длительным периодом ( 100 байт или меньше) на выбранном вами языке. (Обратите внимание, что мой пример выше не соответствует этой спецификации, так как он составляет 119 байт, включая завершающий перевод строки.)
Обратите внимание на следующие правила и пояснения:
- Применяются обычные правила quine, т.е. ваша программа не может использовать языковые функции, которые позволили бы ей напрямую обращаться к своему исходному коду.
- Итерированные выходные данные должны в конечном итоге вернуться к исходному коду, и вам необходимо включить демонстрацию или доказательство того, что это произойдет.
- Вы также должны включить объяснение того, почему цикл такой длинный, как вы говорите. Это не должно быть на уровне математического доказательства, но оно должно быть убедительным для того, кто знаком с вашим языком. (Это правило здесь, потому что я ожидаю, что некоторые ответы будут включать очень, очень большие числа.)
- Можно сказать что-то вроде «по крайней мере 1 000 000 итераций», а не указывать точное число, если вы можете доказать, что это по крайней мере так долго. В этом случае ваш счет будет 1 000 000. В противном случае ваш счет - это период вашей квинны.
- Ограничение в 100 байт применяется только к вашей исходной программе - программы, которые она выводит, могут быть длиннее, хотя, конечно, в конечном итоге им придется вернуться к 100 байтам, чтобы вывести ваш исходный код.
- Вы можете предположить, что ваша машина имеет бесконечную оперативную память и бесконечное время выполнения, но вы не можете предполагать, что типы данных с неограниченной точностью (например, целые числа), если у вашего языка их нет. Вы можете предположить, что нет ограничений на длину ввода, которую может обработать ваш парсер.
- Самый высокий балл побеждает.
Обратите внимание: существует проблема, которая называется Quit Whining; Начните Quining, который также включает в себя итерацию Quines. Однако, помимо того, что они основаны на одной и той же концепции, это совершенно разные типы задач. Другой - прямой гольф, в то время как этот (намеренно!) Действительно замаскированная проблема бобра. Методы, необходимые для получения хорошего ответа на этот вопрос, вероятно, будут сильно отличаться от того, что необходимо для ответа на другой вопрос, и это очень сильно задумано.
источник
Ответы:
PHP, период 2 100 000 000
Кто бы мог подумать, что это возможно в PHP ?! :-)
Это на самом деле мой первый в истории quine длиной 99 байт:
Хотя PHP поддерживает большие числа, чем
2 * 10^8
при переключении сinteger
наdouble
, инкремент больше не работает (приводит к бесконечному циклу), и я не нашел другого решения, которое укладывается в 100 байтов. Еще.Доказательство довольно простое, поскольку он просто рассчитывает на каждую итерацию, пока не достигнет точки сброса в 2,1 миллиарда.
Кредиты Дэйва , который разместил подход в псевдокоде в комментариях и на Боб Twells , от которого я скопированного кода для минимального PHP Куайно.
Тестовая программа (sloooooow):
Ну, по крайней мере, я первый, кто ответит.
источник
Mathematica, период
E8.5678 # 3E2.1923 # 4~ E6.2695 # 3 # 2Обратите внимание, что оценки описаны в нотации Hyper-E . Итерации заменяют финал
Nest[#!,9,9^9^99!]
десятичными разложениямиNest[#!,9,9^9^99!]
- 1,Nest[#!,9,9^9^99!]
- 2,Nest[#!,9,9^9^99!]
- 3, ..., 3, 2, 1 и обратно вNest[#!,9,9^9^99!]
.источник
ToString[#0, InputForm]
{"_~"}_~
, поэтому я думаю, что он должен быть действительным ...R, случайный период с ожиданием 2 ^ 19936-0,5
Стандартный генератор случайных чисел R имеет период 2 ^ 19937-1 и равнораспределение в 623 последовательных измерениях. Таким образом, где-то (но только один раз) в его периоде будет 623-длинный вектор нулей. Когда мы доберемся (и выровняемся с началом последовательности), сумма следующих 623 случайных чисел U [0,1] будет равна нулю, и мы вернемся к нашей исходной программе.
Обратите внимание, что программа с очень высокой вероятностью пройдет через одно и то же ненулевое состояние несколько раз, прежде чем вернуться в ноль. Например, сумма 311,5 является наиболее вероятной, и существует множество способов, которые могут произойти, но ГСЧ допускает, чтобы период для 0 был длиннее периода для 311,5.
источник
JavaScript, период 9 007 199 254 700 000
Выиграть не собираюсь, но работать с JavaScript над этой задачей было весело:
Следует следующий цикл:
Примечание: Вы можете сделать его на 18 байт короче, удаляя только ~ 0,08% от оценки, например так:
источник
C, период 2 100 000 000
Исходя из ответа PHP (очевидно). Буду обновлять с объяснениями, когда у меня будет время.
источник
C (gcc) , 66 байт, период 2 ^ 64
Попробуйте онлайн!
2 ^ 64 числа доступны в виде
unsigned long
целого числа. Следовательно, период 2 ^ 64.источник
Python 2
Период:9 ↑ ( ( 99 ↑ ↑ ( 9 ↑ ( ( 99 ↑ ↑ ( 9 ↑ ( ( 99 ↑ ↑ ( 9 ↑ ↑ 5 - 1 ) ) ↑ 9 ) - 1 ) ) ↑ 9 ) - 1 ) ) ↑ 9 ) + 1
Спасибо @Bubbler за увеличение периода от9 ↑ 9 ↑ ( 99 ↑ ↑ 12 ) + 1 к данному моменту
Попробуйте онлайн!
В коде
b=0
измененияb=1
затемb=2
и так до тех пор, пока он не достигнет,b=decimal expansion of the period
затем сбрасывается обратно кb=0
источник
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9
намного выше чем9**9**99**99**99**99**99**99**99**99**99**99**99**99
. Тем не менее, вы могли бы сделать что-то вродеeval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))
гораздо больших чисел.Gol> <> , 70 байт, период 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250
Другой мудрый известен как действительно большой (3.25E270)
На самом деле это измененная версия ответа, который я поставил на 500-байтовый итератор
Надеюсь, я правильно понял счет, и ошибок нет. Там нет реального способа фактически вычислить это значение, это теоретическое. Но человек, это огромное количество !!!
Попробуйте онлайн!
источник