Meta quine checker


10

Ця задача, якщо ви її приймаєте, полягає в написанні трьох функцій або програм 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

1
@PyRulez Я думаю, що це в дусі цього виклику, тому я збираюся це дозволити. Але функція не може отримати доступ до власного вихідного коду.
jimmy23013

Відповіді:


1

CJam, 254 байти

Приклад відповіді, не гольф.

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

3 функції:

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}
{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}
{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

A і F не приймають жодних параметрів і повертають рядок. B, G і C приймають блок CJam як параметр і повертають 1 для truthy, або 0 для falsey.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.