Эта задача, если вы ее принимаете, заключается в написании трех функций или программ A, B и C:
- A - это квинна, которая выводит все A, B и C (что также является полным содержанием кода в вашем представлении).
- B принимает параметр F и проверяет, является ли он такой формулой (вывод FBC) или выполняет что-то другое.
- C принимает параметр G и проверяет, работает ли G как B (проверяя, выводит ли F FGC). Невозможно решить, является ли функция средством проверки квин, поэтому давайте сделаем что-то попроще:
- Он должен возвращать истину, если G действительна для B.
- Он должен возвращать значение «ложь», если G возвращает значение «ложь» для всех действительных значений quine, или G возвращает значение «истина» для всех допустимых значений не quines.
- Он может вернуть что угодно, аварийно завершить работу или не завершиться и т. Д., Если это какой-либо другой случай.
Обратите внимание, что B возможно. A и F не имеют ввода, поэтому вы можете просто запустить их и проверить результат.
правила
- Должен быть какой-то способ сказать, какие части являются A, B и C из выходных данных A. Например: каждая имеет одну строку или они распознаются как три функции в интерпретаторе.
- Каждая функция должна выполняться только с определением самой себя, а не с вашим полным кодом.
- Вы можете использовать функцию / программу или ее исходный код или их пару в качестве входных данных для B (или G) и C.
- Вы можете переопределить truey / falsey для подмножества этих значений. Вы также можете последовательно требовать, чтобы F возвращал какой-то тип по вашему выбору, например, одну строку.
- Вы можете требовать A, B, F и G, если они вызываются с допустимыми параметрами, постоянно не имеют некоторые типы других входных данных или побочных эффектов, которые вы выбираете, такие как доступ к глобальным переменным или чтение стандартного ввода и т. Д.
- Вы также можете предположить, что F и G, если они вызываются с допустимыми параметрами, всегда завершаются.
- F должен работать в том же состоянии, что и A. Таким образом, он не может зависеть от B или C или существования другой переменной, если только эта переменная не определена в своей части при выводе.
- Никакие функции или программы не могут читать свой собственный исходный код.
- Это код-гольф, выигрывает самый короткий код (который является выходом A) в байтах.
В общем, B по-прежнему невозможен, потому что F может не завершаться, как и на практике во многих языках, потому что он требует комбинаций способностей, таких как временное перенаправление stdout и функция-на-строку или exec. Лучшее, на что вы можете надеяться, это, вероятно, полуработающее решение в LISP.
—
Питер Тейлор
Как бы вы проверили G со всеми quines и non-quines? В настоящее время я работаю над решением Mathematica.
—
LegionMammal978
@PeterTaylor «Можно также предположить, что F и G, если они вызываются с допустимыми параметрами, всегда завершаются». И «выходные данные» могут означать возврат, не обязательно выводить на стандартный вывод.
—
jimmy23013
@ LegionMammal978 Невозможно проверить все квин и не квин. Но задача C более проста: вам нужно проверить только одну квин и одну не квин.
—
jimmy23013
@PyRulez Я думаю, что это в духе этой задачи, поэтому я собираюсь позволить это. Но функция не может получить доступ к своему исходному коду.
—
jimmy23013