Ця задача, якщо ви її приймаєте, полягає в написанні трьох функцій або програм A, B і C:
- A - це квітка, яка видає всі A, B і C (що також є всім вмістом коду у вашій подачі).
- B приймає параметр F і перевіряє, чи це така квінка (виводить FBC), чи робить щось інше.
- C приймає параметр G і перевіряє, чи G можливо працює як B (перевіряючи, чи F видає FGC). Неможливо визначити, чи є функція перевірки quine, тому давайте зробимо щось простіше:
- Він повинен повернути правду, якщо G дійсний для B.
- Він повинен повернути фальси, якщо G поверне фальси для всіх дійсних лайків, або G поверне триутю для всіх дійсних некін.
- Він може повернути що завгодно, вийти з ладу або не припинити роботу тощо, якщо це будь-який з інших випадків.
Зауважте, що B можливий. A і F не мають жодного вводу, тому ви можете просто запустити їх і перевірити результат.
Правила
- Має бути якийсь спосіб сказати, які частини - це A, B і C з виводу А. Наприклад: у кожної є один рядок, або вони розпізнаються як три функції в інтерпретаторі.
- Кожна функція повинна працювати лише з визначенням себе, а не з повним кодом.
- Ви можете використовувати функцію / програму або її вихідний код, або пару обох як вхід B (або G) і C.
- Ви можете перевизначити truthy / falsey до підмножини цих значень. Ви також можете постійно вимагати повернення F певного типу, наприклад, одного рядка.
- Ви можете вимагати A, B, F і G, якщо вони викликаються з допустимими параметрами, послідовно не мають інших типів інших входів або вибраних вами побічних ефектів, таких як доступ до глобальних змінних чи читання stdin тощо.
- Ви також можете припустити, що F і G, якщо вони викликаються з дійсними параметрами, завжди закінчуються.
- F повинен працювати в тому ж самому стані, що і А. Отже, він не може залежати від B або C або існування іншої змінної, якщо тільки ця змінна не буде визначена в її власній частині у її виході.
- Жодні функції та програми не можуть читати власний вихідний код.
- Це код-гольф, найкоротший код (який є результатом A) у байтах виграш.
Загалом, B все ще неможливо, оскільки F може не припинятися, як і на практиці багатьох мов, тому що він вимагає комбінацій здібностей, таких як тимчасове перенаправлення stdout або функція-стринг або exec. Найкраще, на що можна сподіватися, - це, мабуть, напівпрацююче рішення в рамках LISP.
—
Пітер Тейлор
Як би ви перевірили G з усіма лайками та некінами? Зараз я працюю над рішенням Mathematica.
—
LegionMammal978
@PeterTaylor "Ви також можете припустити, що F і G, якщо вони викликаються з допустимими параметрами, завжди завершуються." І "вихід" може означати повернення, не обов'язково друкувати в stdout.
—
jimmy23013
@ LegionMammal978 Неможливо перевірити всі лайки та не-лайки. Але завдання C - це щось простіше, де потрібно перевірити лише одну лайку і одну некінну.
—
jimmy23013
@PyRulez Я думаю, що це в дусі цього виклику, тому я збираюся це дозволити. Але функція не може отримати доступ до власного вихідного коду.
—
jimmy23013