Найдите отверстие 1 здесь .
Создайте квин, который при запуске выдает свой собственный блок исходного кода несколько раз. Фактически, он должен вывести его n раз, где n в следующем простом числе.
Я думаю, что пример показывает это лучше всего.
[MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
Каждая программа будет выводить свой базовый «блок» (так [МОЙ КУИН]) следующее простое число раз.
Встроенные функции для вычисления того, является ли число простым числом (например, функция isPrime) или для определения следующего простого числа (например, функция nextPrime ()), не допускаются.
- Это означает, что функции для перечисления количества делителей не допускаются
- Функции, которые возвращают простую факторизацию, также запрещены
Это должен быть настоящий quine (за исключением некоторой задержки, см. Следующий пункт), поэтому вы не должны читать свой собственный исходный код.
Поскольку такие языки, как Java и C #, уже находятся в невыгодном положении, вам не нужно выводить полностью рабочий код. Если это можно было бы поместить в функцию (которая вызывается) и вывести следующую строку, то у вас все хорошо.
Это код-гольф, поэтому выигрывает самый короткий код!
Ответы:
CJam, 31 байт
Попробуйте онлайн в интерпретаторе CJam .
идея
Чтобы проверить простоту, мы будем использовать теорему Вильсона , которая утверждает, что целое число n> 1 является простым тогда и только тогда, когда (n - 1)! -1 (mod n) , что верно тогда и только тогда, когда (n - 1)! + 1% n == 0 .
Код
источник
mp
(простое?) существует сейчас, так что в последней версии CJam можно было бы сыграть еще немного.CJam,
3635 байтЭто,
безусловно,может быть дальше.Как это работает:
Спасибо Мартину за напоминание мне об
]W=
уловке :)Попробуйте онлайн здесь
источник
Mathematica,
248222 байтаРедактировать: Исправлено использование функции, связанной с простыми числами, но также немного улучшено квинирование.
Изменить: Спасибо Деннис за то, что познакомил меня с теоремой Уилсона.
Это предполагает, что ядро завершается между последующими запусками quine (или, по крайней мере
n
, сбрасывается), потому что оно полагается наn
неопределенность до[MyQuine]
запуска первого экземпляра .Это, вероятно, может быть значительно сокращено, но у меня нет большого опыта работы с куинами, особенно в Mathematica.
Вот объяснение:
Это ничего не делает, но если оно объединено в конце предыдущей квине, оно умножает результат последнего выражения на
1
(что не является опцией), а точка с запятой подавляет вывод. Это гарантирует, что только последняя копия[MyQuine]
печатает что-либо.Это инициализирует
n
к1
в первой копии ,[MyQuine]
а затем увеличивает его на1
каждой последующей копии - то есть это только подсчитывает , сколько копий есть вn
.Перейдите к концу сейчас:
Это находит следующее простое число, используя теорему Вильсона .
Это фактическая Куайн. Он создает
NextPrime@n
копии самого кода. Это также немного странно. Да, я умножаю две строки там, и нет, это не имеет значимого результата.QUINE_PREFIX
содержит весь код до двух строк иQUINE_SUFFIX
содержит весь код после двух строк. Теперь обычно вы используетеApply
(или@@
), чтобы превратить список в серию аргументов. Но вы можете заменить любогоHead
сApply
- например , умножением. Таким образом, несмотря на то, что это продукт, я все равно могу превратить его в два аргумента своей функции. Эта функция делает:Где
#
первый аргумент (строка префикса),#2
второй аргумент (строка суффикса),##
это последовательность обоих аргументов. Мне нужно подготовить, чтобы1
сохранить умножение - иначе##
бы всплыл список аргументов дляToString
. В любом случае,ToString[1##,InputForm]&@@("abc"*"def")
возвращается"abc"*"def"
... как раз то, что мне нужно!Я думаю, что со всеми вещами, которые мне нужны вокруг квайна, здесь
eval
лучше будет использовать квинну на основе. Я посмотрю на это позже или завтра.источник
J - 60 символов
Использует следующий простой метод, как и другие ответы. (Это
4 p:
немного.)Милый маленький J трюк в том, что он
f :g
действует,f
когда ему дают один аргумент, аg
когда дают два. Итак, если вы выписываете, говорите,f :;'a'f :;'a'f :;'a'
что это действует какf'a';'a';'a'
, что здорово, потому что это коробочный список, элементы'a'
которого и длина которого являются числом вхождений.Таким образом, мы можем поднять это до мелочей.
f
Мы используем как выглядят(foo $~ bar)
, гдеfoo
строит часть строки , которые мы повторить снова и снова,bar
находит следующее простое число и умножает его на 60, длину строки вfoo
.источник
Python 2.7, 214
источник