Défi
Créez deux programmes, A et B, qui sont tous deux des programmes de chat dans la même langue. Une fois concaténé, AB (également dans la même langue) devrait être un quine.
Par exemple, supposez hello
et world
sont les deux programmes de chat en langage XYZ. Si helloworld
c'est une quine dans ladite langue, alors votre solution est valide.
Pour ceux d'entre vous qui ne connaissent pas les chats et les quines, un programme cat est celui qui imprime exactement ce qui lui a été donné via stdin et un quine est un programme qui imprime son propre code source.
Scoring et règles
- Le nombre total d'octets du programme AB concaténé est votre score. Comme c'est du golf de code, le score le plus bas l'emporte.
- Les failles standard sont interdites
- L'entrée doit provenir de stdin et la sortie doit aller à stdout.
- Les programmes cat n'ont pas besoin de prendre d'arguments; il suffit de copier stdin sur stdout.
- Le quine devrait fonctionner lorsque le programme ne reçoit aucune entrée, mais ne doit pas fonctionner correctement (mais peut) pour d'autres entrées.
- Le quine n'a pas besoin de se terminer, à condition d'imprimer exactement son code source une fois, rien de plus.
- Le quine doit être d'au moins un octet de long.
- A et B peuvent être le même programme.
- BA n'a pas besoin d'être une quine ou même un programme valide.
AB
doit pas être vide, car de nombreuses langues ont un chat de 0 octet permettant un quine de 0 octet.Réponses:
V , 2 + 2 == 4 octets
Essayez la quine!
Essayez le chat!
A est
2i
B est aussi
2i
Comment ça marche?
Tout d'abord, quelques explications sur le fonctionnement de V. Une chose notable qui rend cette réponse possible est que dans V, le programme vide est un programme cat. Ce n'est pas un cas particulier, c'est inhérent au fonctionnement de V. Au démarrage, toutes les entrées sont chargées dans un "tampon", chaque commande modifie le tampon d'une manière ou d'une autre, puis lorsque le programme est terminé, le tampon est implicitement imprimé. Cela signifie que toute chaîne de NOP est également un programme cat.
La
i
commande signifie entrer en mode d'insertion , ce qui signifie que chaque caractère suivant uni
sera ajouté dans le tampon. Avec un nombre le précédant, ce texte sera dupliqué n fois.Cela signifie que pour le programme cat, rien ne sera ajouté au tampon et il sera imprimé tel qu'il a été lu. En d'autres termes:
Mais pour la quine, il y a du texte après
i
:Non-réponse effrontée
V , 0 octet
Essayez-le en ligne!
A est le programme vide.
B est également le programme vide.
: P
la source
Rubis, 71 octets
Peut être divisé en chats comme suit:
et
Les deux chats sont identiques à l'exception du 2 principal, qui est un no-op dans les trois programmes. Le
<<2
est une chaîne héréditaire, ce qui signifie que tout ce qui commence sur la ligne suivante jusqu'à ce qu'un 2 se terminant sur sa propre ligne soit une chaîne, que nous concaténons à lui-même (*2
) et ajoutons une traînée 2. Chez les chats, la chaîne héréditaire est bien formée mais vide, de sorte que l'expression régulière ne correspondra pas et nous passerons à l'$<.read
expression et à la sortie STDOUT. Une fois que nous avons concaténé les chats, cependant, la chaîne ne se terminera pas avant la troisième ligne, donc l'expression régulière correspond et nous court-circuitons et sortons le quine.la source
Pyth,
29 octets (5 + 24)27 octets (5 + 22)C'était amusant.
Essayez la quine ici
Essayez le premier chat ici
Essayez le deuxième chat ici
Des explications
la source
C # (compilateur Visual C #) , 551 octets
A: 95 octets
Essayez-le en ligne!
B: 438 + 18 octets
Essayez-le en ligne!
A + B: 533 + 18 octets
Essayez-le en ligne!
A et B prennent l'entrée comme argument de ligne de commande. A + B ignore toute entrée. 18 octets sur B et A + B sont ajoutés pour le
/p:StartupObject=B
option envoyée à MSBuild. C'est seulement strictement nécessaire sur A + B, mais il semblait être de la triche de ne pas l'avoir aussi en B. De cette façon, les drapeaux de compilation pour A + B sont les drapeaux de compilation pour A (aucun) plus les drapeaux de compilation pour B.Explication
Le programme A est simple. La classe A contient une variable statique (inutilisée)
i
initialisée à2
et affiche son premier argument lors de son exécution. le//
à la fin est important pour le code A + B, mais ne fait rien dans A lui-même.Le programme B est bizarre dans l'isolement, mais essentiellement le même. Il crée une classe A contenant une variable statique
i
initialisée à0
, puis exécute la méthode Main de classe B, qui fait la même chose que le programme A carA.i
est inférieure à 1, et renvoie avant tout ce qui est bizarre. Les nouvelles lignes ne sont pas nécessaires ici, mais sont importantes pour A + B.Lorsqu'il est combiné, le
//
programme A commente la déclaration de classe A du programme B, mais à cause de la nouvelle ligne, la classe B est correcte, ceA.i
qui permet de se référer à la2
valeur du programme A à la place. L'indicateur du compilateur fait exécuter le programme B.Main () car A.Main () existe également. Le résultat est que le programme A + B ne produit pas son argument, mais passe à la place au segment suivant de B.Main (), qui est fondamentalement juste le quine C # standard .la source
Haskell , 116 + 20 =
187175174136 octetsUn tas d'octets économisés depuis que Ørjan Johansen m'a montré
interact
Cat 1
Essayez-le en ligne!
Cat 2
Essayez-le en ligne!
Quine
Essayez-le en ligne!
Le principe de base à l'œuvre ici est que lorsque nous ajoutons le deuxième chat au premier, nous changeons le nom de la fonction avec laquelle nous interagissons de
a
àidmain
. Puisqueinteract id
c'est un chat nous voulonsidmain
une fonction qui retourne une quine. La solution évidente serait d'utiliserconst
, cependant, car nous pouvons supposer que l'entrée est également vide(++)
. De là, nous trouvons le code source via des moyens assez standard, nous avons une variableg
qui code la source et nous utilisons un wrapper spécial pour l'imprimer sous forme de chaîne et sous forme de code. Il y a une légère exception que nous devons mettre notre encodeur à l'avant parce que nous devons déjà terminer avecinteract id
. Cela signifie un supplémentg=
n'est pas codé et doit être géré manuellement. Notre prochain chat est assez standard, sauf que nous devons en faire un code valide lorsqu'il est collé à la fin de l'autre chat, nous avons donc besoin que les deux chats soient des instances de gardes de modèle.Stratégie alternative, 43 + 105 =
186148Cat 1
Essayez-le en ligne!
Cat 2
Essayez-le en ligne!
Quine
Essayez-le en ligne!
la source
getContents
+putStr
parinteract id
. Essayez-le en ligne! (Le quine ne fonctionne plus avec une entrée non vide, ce qui permet d'utiliser une(++ ...)
section pour leidmain
.)interact
, je suppose que c'est parce que je fais rarement des trucs IO avec Haskell. J'ai édité le post.Python 3, 286 octets
Mon premier golf Python et ma première quine! Pas très élégant, mais ça marche.
Programme A (238 octets)
(pas de nouvelle ligne de fin)
Programme B (48 octets)
(pas de nouvelle ligne de fin)
Essayez-le en ligne
Remerciements
la source
end=open...
et utiliser%r
au lieu de%s
ne pas avoir à faire la nouvelle ligne et les citations%r
. Je ne sais pas ce que vous voulez dire sur la nouvelle ligne.%s
formater une nouvelle ligne, vous pouvez simplement faire le littéral\n
. Vous pouvez également utiliser;
pour fractionner les instructions au lieu de\n
(sauf qu'ilif
doit être sur sa propre ligne).%
peut être échappé dans la chaîne en faisant%%
. Le seul argument nécessaire pour formater la chaîne est la chaîne elle-même, tout le reste peut être rayélocals()
pour économiser 2 octets.C ++ (clang) , 313 + 102 = 415 octets
Programme A (se termine par une nouvelle ligne):
Programme B (ne se termine pas par une nouvelle ligne):
Pas terriblement sournois, et comme d'habitude, le C ++ n'est pas génial pour quining. Je ne serai pas surpris s'il existe des moyens de raser les octets ici et là avec la même idée. Le seul petit hic est de changer le comportement de quelque chose après qu'il a été défini, et un initialiseur de variable dynamique avec effet secondaire fait l'affaire. (Cela peut-il même être fait en C sans extensions de compilateur?)
Essayez-le en ligne: A , B , AB
(Le seul problème de portabilité que je connaisse est que le programme suppose de
<cstdio>
placer les noms à la fois dans l'espace de noms global et dansstd
.)la source
Befunge-98 (FBBI) , 8 + 15 = 23 octets
A + B: (ne fonctionne que pour aucune entrée)
Essayez-le en ligne!
UNE:
Essayez-le en ligne!
B:
Essayez-le en ligne!
la source
Python 3 , 100 + 37 = 137 octets
Programme A:
Essayez-le en ligne!
Programme B:
Essayez-le en ligne!
Make Quine AB
Essayez-le en ligne!
Fonctionne uniquement lorsque l'entrée est vide, sinon elle ajoute l'entrée à la sortie.
la source
Attaché , 15 + 126 = 141 octets
UNE:
Essayez-le en ligne!
B:
Essayez-le en ligne!
A + B:
Essayez-le en ligne!
Explication
Chacun des programmes cat encode
AllInput[]|Echo
, qui est un simple programme cat. B est la phase quine principale; seule, c'est une fonction vectorisée (via unaire@
) appelée sans entrée (appelée comme|Call
). Ainsi, le premier conditionnelIf[_,A,B]
s'exécuteB
, ce qui est tout simplementAllInput[]|Echo
.Lorsque A + B est exécuté, unaire
@
devient binaire en@
raison de laEcho
fusion avec le lambda:Maintenant, cela signifie que le lambda est exécuté avant l'
Echo
est. Revenons au conditionnel, cette fonction a maintenant tout STDIN comme argument. Donc,If[_,A,B]
exécuteA
, qui est le cadre standard de quine.la source
Stax , 16 + 12 = 28 octets
Cat 1:
Exécuter et déboguer
Cat 2:
Exécuter et déboguer
Quine:
Exécuter et déboguer
la source
Cat 1:
Lua , 41 octets
Essayez-le en ligne!
Cat 2:
Lua , 70 octets
Essayez-le en ligne!
Quine:
Lua , 111 octets
Essayez-le en ligne!
io.input(arg[0])
dans Cat 2 définit le fichier actuel comme entrée standard, et par conséquent, le chat imprime le code sourcela source
> <> , 12 +3 = 15 octets
Programme A:
Essayez-le en ligne!
Et programme B:
Essayez-le en ligne!
Faire le programme AB:
Essayez-le en ligne!
la source
JavaScript (Node.js) , 199 octets
Essayez-le en ligne!
Cat A, 57 octets
Essayez-le en ligne!
Cat B, 142 octets
Essayez-le en ligne!
la source