La tâche
Dans ce défi, votre tâche consiste à écrire trois programmes qui forment une sorte de système de type quine mutuel. Appelons les programmes A
, B
et C
. Si l'un des programmes reçoit la source d'un autre programme en entrée, il doit sortir la source du troisième programme. Par exemple, si A
est donné B
en entrée, il sort C
. Si les programmes sont donnés leur propre source en entrée, ils doivent sortir les trois chaînes "three"
, "mutual"
et "quines"
(sans les guillemets). Dans tous les cas, ils peuvent générer une nouvelle ligne de fin supplémentaire. Pour toute autre entrée, les programmes peuvent faire n'importe quoi, y compris planter.
Exemple
Par exemple, supposons que les codes source de A
, B
et C
sont aSdf
, ghJk
et zxcV
. Ensuite, les programmes doivent se comporter comme suit.
Source Input Output
--------------------
aSdf aSdf three
aSdf ghJk zxcV
aSdf zxcV ghJk
ghJk aSdf zxcV
ghJk ghJk mutual
ghJk zxcV aSdf
zxcV aSdf ghJk
zxcV ghJk aSdf
zxcV zxcV quines
Règles et notation
Les solutions A
, B
et C
peuvent être soit des fonctions soit des programmes complets, mais elles doivent être totalement indépendantes: aucun code partagé n'est autorisé.
Les failles standard et les règles de quine s'appliquent, de sorte que les programmes ne peuvent en aucun cas accéder à leurs propres codes source.
Votre score est le nombre d'octets combinés de A
, B
et C
un score inférieur étant meilleur.
public static void main
partie quelque part.) Ou tout simplement que vous ne pouvez pas écrire une fonction qui est appelée par les trois?Réponses:
CJAM,
16514711410899 octetsMerci à @ MartinBüttner pour une suggestion qui a permis d'économiser 48 octets!
Essayez-le en ligne dans l' interpréteur CJam .
Vérification
Idée
L'ensemble {0, 1, 2, 3} est un groupe sous l'opération ^ (OU binaire exclusif), où chaque élément est son propre inverse.
Si les trois programmes sont identiques à l'exception du premier caractère (un élément de {0, 1, 2, 3} ), nous pouvons les distinguer et les imprimer facilement:
Nous commençons par XORing le chiffre au début du code source et de l'entrée.
Si le résultat est à 0 , la source et l'entrée correspondent.
Ainsi, nous imprimons l'un des trois mots, sélectionnés par ce chiffre commun.
Si le résultat n'est pas 0 , c'est l'élément de {1, 2, 3} qui n'est ni dans la source ni dans l'entrée.
Ainsi, nous l'imprimons, suivi du reste de l'entrée.
Comment ça marche
la source