Tricherie cyclique quine


19

Concept

Écrivez un programme qui génère du code dans son langage de programmation. Ce code, une fois exécuté, doit sortir le programme d'origine.

Règles

  • Comme il s'agit d'une quine de triche, vous pouvez lire le code source d'origine.
  • Le premier programme de sortie doit être dans la même langue que le programme d'origine.
  • Vous ne pouvez pas générer de quine normal. Les deux programmes doivent être différents.
  • Des échappatoires standard s'appliquent.
  • C'est le donc la réponse la plus courte l'emporte, mais elle ne sera pas sélectionnée.

Je ne suis pas encore tout à fait sûr de ce qui constitue une semi-quine.
Conor O'Brien

@ ConorO'Brien Il génère un programme qui
génère le

1
Je vois. Le libellé est assez vague.
Conor O'Brien

2
Pourquoi la réponse la plus courte ne sera-t-elle pas sélectionnée? S'agit-il d'un catalogue?
ATaco

1
Pour mémoire, je dirais que c'est un quine mutuel (ce défi nécessite cependant différentes langues).
Martin Ender

Réponses:


28

Bash + coreutils, 11 octets

tr xy yx<$0

Ceci imprime

tr yx xy<$0

Essayez-le en ligne!

À son tour, qui imprime

tr xy yx<$0

1
Pas une triche et dans une langue commune.
denson

8
Je pense que la trcommande est redirigée vers $0son propre code source. C'est donc "tricheur".
Roman Gräf

21

Escargots, 0 octets



Le deuxième programme est

1

Le premier programme compte le nombre de correspondances du motif vide sur l'entrée vide (qui a vraiment la zone 0, mais le motif est toujours exécuté au moins une fois comme un hack pour permettre aux programmes de décider ce qu'ils veulent imprimer sur l'entrée vide). Le deuxième programme commence par un quantificateur (comme {1}dans regex), ce qui provoque une erreur d'analyse. Étant donné que le programme n'analyse pas correctement, STDOUT est la chaîne vide.


Je pensais qu'il y avait probablement un langage qui faisait cela (c'est-à-dire qu'un programme nul réussit avec un résultat non vide, mais ce résultat ne fait rien en tant que programme). J'ai essayé HOMESPRING mais je n'ai pas réussi à faire travailler l'interprète. On dirait que vous avez trouvé une autre langue où cela fonctionne, cependant. (Avez-vous un lien vers un interprète?)


20

7 , 2 octets

7 utilise un jeu de caractères à 3 bits, mais prend les entrées emballées en octets (et selon la méta, les langues avec des jeux de caractères sous-octets sont comptées en utilisant des octets pour le fichier sur le disque ). Voici un xxdvidage du programme:

00000000: 4cf4                                     L.

Lorsque vous donnez ce fichier à l'interpréteur 7, il affichera le programme suivant:

00000000: 4fa6 7f                                  O..

qui à son tour sortira à nouveau le programme d'origine.

Alors qu'est-ce qui se passe ici? Il n'y a pas de lecture de source impliquée (en fait, je ne pense pas qu'il soit possible de lire la source en 7), bien que sans doute le programme triche d'une autre manière; laissez-moi savoir ce que vous pensez. Voici comment fonctionne le programme. (Notez que chaque commande 7 a deux variantes, dont certaines n'ont pas de nom et ne peuvent pas apparaître dans le programme d'origine. Il y a douze commandes au total, en six paires. J'utilise gras pour les commandes actives, non gras pour passif et dans les cas où la commande active n'a pas de nom, je lui donne le même nom que la commande passive correspondante et je compte sur les caractères gras pour les distinguer. Dans le cas où les deux sont nommés, par exemple, 7qui est la variante active de 1, chaque commande obtient son propre nom et le gras est juste une mise en évidence de la syntaxe.)

231 7 23 Programme original, déballé en octal
231 Poussez 237 sur la pile
    23 Poussez 23 sur la pile
             (implicite) ajouter une copie du haut de la pile au programme
      2       Haut de la pile en double (actuellement 23 )
        3      Haut de la sortie en sortie, pop deuxième élément de pile

À ce stade, l'interpréteur 7 voit que le haut de la pile contient des commandes ( 2et 3) qui ne sont pas représentables, il échappe donc au haut de la pile, produisant 723(ce qui est). La première sortie de commande sélectionne le format de sortie; dans ce cas, c'est le format 7, "formatez la sortie de la même manière que le programme". Les commandes sont donc compressées en octets. Ensuite, le programme continue:

231 7 23 23
             (implicite) ajouter une copie du haut de la pile au programme
        2     Dupliquer le haut de la pile (actuellement 237 )
          3    Sortir le haut de la pile, faire éclater le deuxième élément de la pile
           7   Poussez un élément vide sur la pile

À ce stade, il n'y a que des éléments de pile vides sur la pile, donc le programme se ferme. Nous sortons 23plus tôt. Si nous nous échappons 237(et nous devons le faire, car il contient des commandes non représentables), nous obtenons 7231. Cela obtient la sortie directement, ce qui rend la sortie finale du programme 237231(formaté de la même manière que le programme, c'est-à-dire compressé en octets). Voilà 4fa67f. (On peut noter que cela 1était totalement inutile en termes d'affecter la sortie; la seule raison pour laquelle il est là est de rendre les deux programmes différents.)

La course se 237231déroule presque exactement de la même manière; la différence est que l'inutile 1s'exécute juste après la première impression (et l'élément vide est implicitement supprimé la deuxième fois que la fin actuelle du programme est atteinte). Encore une fois, les résultats 231finissent par se produire eux-mêmes, les résultats 23finissent par se produire précédés par un 7, et nous obtenons 231723, le programme original.

L'observateur pourrait noter que les deux programmes, bien qu'ils soient de la même longueur dans l'octal "natif" de la langue, sont de longueurs différentes sur le disque. En effet, un programme 7 peut être rempli avec un nombre arbitraire de 1 bits et le format compressé supprime le remplissage de fin. Voici comment l'encodage se produit:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

En d'autres termes, deux octets, 4C F4suffisent pour représenter le programme, c'est donc tout ce que j'ai utilisé.


11

Python 3, 297 279 251 243 225 218 208 180 126 126 111 octets

Non-triche:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

Cela imprime:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

qui, une fois exécuté, imprime le programme original.


Hou la la! Cool! Je n'aurais jamais pensé à ça.
dkudriavtsev

8

Lot, 14 octets

@echo @type %0

Qui, lorsqu'ils sont exécutés en tant que cyclicquine.batsorties

@type cyclicquine.bat

Qui lors de l'exécution génère le fichier de commandes d'origine.


8

RProgN , 4 octets.

La communauté semble considérer ce genre de chose comme une quine de triche , qui satisfait ainsi les critères.

1
2

Avec une nouvelle ligne de fin.

Ceci imprime

2
1

Avec une nouvelle ligne de fin, qui imprime le premier code.

RProgN imprime la pile en éclatant, donc de haut en bas.

Essayez-le en ligne!


Il y a eu une discussion en ligne il y a quelque temps, ce qui impliquait que 1\n1\ndans RProgN, il y aurait une quine sans tricherie, car chacun des 1 s'imprime mutuellement (et cela ne serait considéré comme de la triche que si chacun d'eux s'imprimait). Tout cela implique vraiment que la tricherie dans les quines peut parfois être difficile à définir. (Cependant, cette réponse est correcte dans les deux cas, car la question ne nécessite pas réellement la quine pour tricher, elle le permet simplement .)

Aussi, bien que j'étais réticent à dire, dans RProgN 1\nest techniquement un quine valide, comme ce 1n'est pas une constante, mais un appel à une fonction qui pousse 1vers la pile.
ATaco

Il existe plusieurs définitions d'un quine approprié utilisé. C'est invalide par au moins un, mais peut-être valide par certains des autres.

@ ais523 Vous avez éveillé ma curiosité, Vous avez spécifié RProgN, mais je ne pensais pas que mon petit langage avait autant (ou pas) d'attention. Est-ce que le chat sur RProgN en particulier, ou un langage avec une syntaxe similaire?
ATaco

Il était d'environ 7 , ce qui a également tendance à imprimer des segments du programme "à l'envers". J'extrapolais à partir des opinions qui y étaient exprimées.

6

Jolf, 6 octets

1q_a_q

Lorsqu'il est exécuté, cela génère:

q_a_q1

Qui à son tour sort 1q_a_q.

Essayez-le ici!

Explication

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)

5

JavaScript (ES6), 69 60 59 octets

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Les sorties:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 octet (@ETHProductions): utilisez 0 dans l'expression régulière au lieu de \ d


Essayez n=>1-nplutôt n=>+!+n.
Conor O'Brien

@Conner O'Brien Malheureusement, le 1testament finira par être remplacé par l'expression régulière.
darrylyeo

@ETHproductions Heh, j'aurais dû y penser.
darrylyeo



1

> <>, 16 octets

"$r00gol?!;50.01

Essayez-le ici!

Les sorties

"$r00gol?!;50.10

Il s'agit d'une modification de celle fournie ici . Je ne sais pas si c'est de la triche, il lit la boîte de code et la sort.


1
vous pouvez changer le 00g en: 2- et il gardera le même nombre d'octets sans lire la boîte de code.
Pélican bleu canard

@Tealpelican, merci! Le but est que cela soit considéré comme de la «tricherie»: p. (Et je ne comprends pas bien cette règle)
redstarcoder
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.