Meta quine checker

10

Ce défi, si vous l'acceptez, consiste à écrire trois fonctions ou programmes A, B et C:

  • A est un quine qui génère tous les A, B et C (qui est également tout le contenu du code dans votre soumission).
  • B prend un paramètre F et vérifie s'il s'agit d'une telle quine (sortie FBC), ou fait quelque chose de différent.
  • C prend un paramètre G et vérifie si G fonctionne éventuellement comme B (vérifie si F sort FGC). Il est impossible de décider si une fonction est un vérificateur de quine, alors faisons quelque chose de plus simple:
    • Il doit retourner vrai si G est valide pour B.
    • Il doit renvoyer falsey si G renvoie falsey pour toutes les quines valides, ou G retourne true pour toutes les non-quines valides.
    • Il peut renvoyer n'importe quoi, planter ou ne pas se terminer, etc., si c'est l'un des autres cas.

Notez que B est possible. A et F n'ont aucune entrée, vous pouvez donc simplement les exécuter et vérifier le résultat.

Règles

  • Il devrait y avoir un moyen de savoir quelles parties sont A, B et C à partir de la sortie de A. Par exemple: chacune a une ligne, ou elles sont reconnues comme trois fonctions dans l'interpréteur.
  • Chaque fonction doit s'exécuter avec uniquement la définition d'elle-même, pas votre code complet.
  • Vous pouvez utiliser une fonction / programme ou son code source, ou une paire des deux comme entrée de B (ou G) et C.
  • Vous pouvez redéfinir truey / falsey à un sous-ensemble de ces valeurs. Vous pouvez également demander systématiquement à F de renvoyer le type de votre choix, comme une chaîne unique.
  • Vous pouvez exiger A, B, F et G, s'ils sont appelés avec des paramètres valides, n'ont pas systématiquement certains types d'autres entrées ou effets secondaires que vous choisissez, tels que l'accès aux variables globales, ou la lecture de stdin, etc.
  • Vous pouvez également supposer que F et G, s'ils sont appelés avec des paramètres valides, se terminent toujours.
  • F devrait fonctionner dans le même état que A. Il ne peut donc pas dépendre de B ou C ou de l'existence d'une autre variable, à moins que cette variable ne soit définie dans sa propre partie dans sa sortie.
  • Aucune fonction ni aucun programme ne peut lire son propre code source.
  • Il s'agit de code-golf, le code le plus court (qui est la sortie de A) en octets gagne.
jimmy23013
la source
B est toujours impossible en général car F peut ne pas se terminer, ainsi qu'en pratique dans de nombreux langages car il nécessite des combinaisons de capacités comme la redirection temporaire de stdout et soit fonction vers chaîne ou exec. Le mieux que vous puissiez espérer est probablement une solution à moitié fonctionnelle dans un LISP.
Peter Taylor
Comment vérifieriez-vous G avec tous les quines et non-quines? Je travaille actuellement sur une solution Mathematica.
LegionMammal978
@PeterTaylor "Vous pouvez également supposer que F et G, s'ils sont appelés avec des paramètres valides, se terminent toujours." Et "sortie" peut signifier un retour, pas nécessairement une impression sur stdout.
jimmy23013
@ LegionMammal978 Il est impossible de vérifier tous les quines et non-quines. Mais la tâche de C est quelque chose de plus simple, où il vous suffit de vérifier une quine et une non-quine.
jimmy23013
1
@PyRulez Je pense que c'est dans l'esprit de ce défi, donc je vais le permettre. Mais la fonction ne peut pas accéder à son propre code source.
jimmy23013

Réponses:

1

CJam, 254 octets

Un exemple de réponse, pas de golf.

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

Les 3 fonctions sont:

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

A et F ne prennent aucun paramètre et renvoient une chaîne. B, G et C prennent un bloc CJam comme paramètre et renvoient 1 pour true, ou 0 pour falsey.

jimmy23013
la source