Chaîne quine bidirectionnelle


9

PPCG n'a pas déjà assez de quines ...

Défi:

Votre tâche consiste à créer un programme "A0". Lorsque ce programme est exécuté sans entrée, il ne produit rien. Lorsque ce programme est exécuté avec une entrée, il génère "A1". Lorsque "A1" est exécuté sans entrée, il génère "A0". Lorsque "A1" est exécuté avec une entrée, il affiche "A2". À peu près, «A (k)» affichera «A (k-1)» lorsqu'il sera exécuté sans entrée et affichera «A (k + 1)» lorsqu'il sera exécuté avec une entrée.

Détails

Je crois que ce défi est assez simple; il n'y a pas vraiment d'autres règles. Soit dit en passant, chaque programme doit contenir au moins 1 octet. Vous pouvez supposer que l'entrée ne sera composée que de caractères ASCII et vous pouvez ignorer les espaces blancs si vous le souhaitez, mais vous ne pouvez pas spécifier une entrée spécifique. La sortie peut être vers STDOUT ou STDERR, mais tous vos programmes doivent sortir vers le même. L'autre peut également contenir du texte (vous pouvez donc exporter vers STDOUT puis quitter avec une erreur). Merci à @Dennis de l'avoir signalé.

Tous les programmes doivent être dans la même langue et chaque programme doit être unique des autres.

Le score est égal à la durée du programme "A0". Comme c'est un défi de code-golf, le score le plus bas gagne!


Je suis triste de prédire que la plupart des soumissions auront A (k) et A (k + 1) différant par l'ajout d'un seul caractère à une chaîne croissante :(
Sparr

@Sparr Malheureusement, c'est probablement ce qui se passera. :( Oh bien, je n'arrive pas à comprendre comment établir une règle claire contre cela.
HyperNeutrino

vous ne pouvez sortir vers l'un des deux que je ne suis pas dure si j'interprète correctement. Si nous imprimons la sortie souhaitée sur STDOUT, STDERR doit-il être vide? Parce qu'il est généralement autorisé à quitter avec une erreur.
Dennis

Tous les programmes doivent-ils être différents? La question ne dit pas cela.

4
Aussi, puis-je suggérer un titre un peu plus expressif comme "Chaîne de Quine bidirectionnelle"? "super meta quine" ne dit pas grand-chose au-delà des programmes imprimant d'autres programmes et rendra plus difficile la recherche de ce défi à l'avenir.
Martin Ender

Réponses:


1

Pip , 28 octets

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Essayez-le en ligne!

Explication

Il s'agit d'une version modifiée de la quine Pip la plus courte connue V Y"`V Y`.RPy". Ce quine fonctionne en définissant une chaîne, en la tirant dans la yvariable, puis en l'évaluant. Lorsqu'elle est évaluée, la chaîne prend la repr de y(encapsulant ainsi la valeur de yentre guillemets) et concatène le motif littéral `V Y`au début de celui-ci.

Notre stratégie consiste à mettre un 0dans le programme, puis à remplacer 0par 10s'il y a eu des entrées ou à remplacer 10par 0s'il n'y a pas eu d'entrée. (Ainsi, A ( k ) contiendra un nombre composé de k 1 est suivi par un 0.) 0et 10sont pratiques parce qu'il ya des variables intégrées ( iet trespectivement) avec ces valeurs, afin que nous puissions les référer à sans utiliser les chiffres réels .

Donc, au lieu de RPy, nous voulons RP yRits'il y a eu une entrée et RP yRtisinon. Nous pouvons combiner les deux cas en échangeant les valeurs de teti s'il y a input ( I#q Sti), puis en faisant RP yRti. (Nous devons tester #qla longueur de l'entrée, car les entrées comme 0sont falsey.)

Il ne nous reste plus qu'à obtenir un littéral 0dans le code et à gérer le cas particulier de A0 ne produisant aucune sortie. Les deux peuvent être résolus en testant 0+iet en retournant usi c'est falsey:

  • Pour toute k > 0, le nombre dans A ( k ) sera non nul et donc vrai (par exemple 110+i).
  • Pour k = 0, le nombre dans A ( k ) sera nul:
    • S'il y a une entrée, i et tsont échangés et iest 10. 0+iest toujours vrai.
    • S'il n'y a pas d'entrée, iest toujours 0 et 0+iest falsey. Au lieu du quine core, nous produisons u, qui est une variable intégrée pour nil. L'impression nulle ne produit aucune sortie.

Bon travail! Fonctionne comme un charme.
HyperNeutrino

1

Python 2, 93 octets

Il y a un saut de ligne arrière.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Essayez-le avec entrée | Essayez-le sans entrée

Ceci est modifié de ma réponse à une question similaire.

S'il y a une entrée, elle incrémentera p. Ainsi le programme sera p=2+..., p=3+...etc.


Cela ne reconnaît pas 0 comme entrée
fəˈnɛtɪk

@LliwTelracs L'entrée doit être entourée de guillemets (elle doit être une piqûre). Voir les hyperliens dans la réponse.
mbomb007

En l'état, votre programme fonctionne avec des chaînes et tous les nombres autres que 0.
fəˈnɛtɪk

1
@LliwTelracs Alors n'essayez pas d'utiliser des chiffres. Selon le consensus, je peux utiliser input()et exiger que les entrées soient entourées de guillemets, plutôt que d'utiliser raw_input(). Si vous souhaitez saisir zéro, utilisez "0".
mbomb007

Bonne solution! Je m'attendais à ce que la plupart des réponses s'allongent infiniment (techniquement, celle-ci le fait mais pas dans le même sens). Bon travail!
HyperNeutrino
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.