Ouroboros Quine au niveau n

11

Cette quine ouroboros en 128 langues (un programme qui sort un programme dans une autre langue, qui sort un programme dans une autre langue encore, (125 langues plus tard), qui sort le programme original) est assez impressionnante. Mais malheureusement, il a un nombre statique d'itérations.

Ecrire un programme qui sort un programme (pas nécessairement dans une autre langue, mais il peut l'être), qui sort un programme, qui sort un programme, etc., qui après n itérations, sort le programme original pour la première fois (ie pas d'intermédiaire devrait être le même que l'original, car sinon un quine qui ignore son entrée fonctionnerait), où n est un entier non négatif fourni en entrée. L'entrée ne peut pas être juste un nombre dans le code source d'origine (par exemple, mettre x = <the value of n>au début de votre programme), il doit être l'un des suivants:

  1. Passé comme argument de ligne de commande
  2. Lire à partir de l'entrée standard
  3. Passé comme argument à une fonction, qui retourne / sort le nouveau programme.

Pour les étapes intermédiaires des ouroboros, votre programme peut être soit un programme pleinement fonctionnel, soit une fonction sans arguments, qui, une fois appelée, renverra / affichera la suivante.

Vous ne pouvez pas lire à partir du fichier source lui-même, ou utiliser des modules internes de type quine (je ne pense pas qu'il y en ait qui le feraient, mais il pourrait y en avoir)

Pour être clair, si n = 0, le programme doit sortir son propre code source.

Si n = 1, le programme doit sortir un programme différent, qui sort le code source d'origine.

Etc...

Le moins d'octets gagne!

Éditer:

J'aurais dû écrire "Pour les étapes intermédiaires des ouroboros, votre programme peut être soit un programme pleinement fonctionnel sans entrée , soit une fonction sans argument". Si votre programme sort le suivant dans la chaîne, puis attend l'entrée, c'est bien, mais votre programme ne devrait pas avoir besoin de la valeur d'origine de n.

Leo Tenenbaum
la source
Lié , lié .
Kevin Cruijssen
Peut-on 1 index n? Donc n = 1 signifie imprimer le code source, n = 2 signifie imprimer le code qui imprimera le code source, etc.
Expired Data
1
Les versions d'itération auront-elles toujours l'entrée initiale? Supposons donc que ma première entrée soit 3 et que j'exécute le programme qu'il produit. Y aura-t-il toujours une entrée 3, ou aucune entrée du tout? S'il n'y a pas d'entrée, je suppose que nous devons gérer cela au cas où quelque chose comme getInput()serait utilisé sans aucune entrée fournie. Ou peut-on dire que nous entrons quelque chose de aléatoire qui n'est pas utilisé pour des itérations ultérieures, pour éviter les erreurs pour le getInput()? Aka la réponse Python actuelle est-elle valide?
Kevin Cruijssen
Je soupçonne que ce qu'on nous demande de faire, étant donné un nombre entier n, génère un programme qui est le "programme initial" d'un quine ouroboros d' nitérations, et que notre réponse ne devrait pas compter comme l'une des nitérations. Est-ce correct?
Erik the Outgolfer le
@KevinCruijssen J'aurais probablement dû être plus clair à ce sujet. Les étapes intermédiaires ne peuvent avoir d'entrée sous aucune forme. Je suppose que si le programme sort le suivant et attend ensuite l'entrée, ce serait bien.
Leo Tenenbaum

Réponses:

5

05AB1E , 28 octets

-4 octets + correction grâce à Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

Essayez-le en ligne!


Explication

Cela fonctionne en ajoutant le nombre restant à imprimer au début du code, ce qui signifie qu'il est ajouté à la pile de la même manière qu'une entrée. Dans le cas de base d'entrée de "0", il ne concaténera pas le 0 sur le devant.

Données expirées
la source
dest non négatif ( >=0) au lieu de positif ( >0). Le problème est que pour vérifier dsans l'éclater, vous devez d'abord le dupliquer, mais il doit également être éliminé à l'itération 0"quinsting", sinon il produira le dupliqué 0. :(
Kevin Cruijssen
"34çìD«s<©di®ì"34çìD«s<©di®ìpour 28 octets peut-être (ce qui est encore assez proche de votre approche prévue)? (J'ai bien peur que votre version actuelle pour les 0"34çìD«s<Ddiì"34çìD«s<Ddiìsorties d' itération -1de l' Duplicate ..)
Kevin Cruijssen
4

Enchantements runiques , 39 octets

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Essayez-le en ligne!

Serait de 4 octets plus court que 05AB1E en utilisant la même tactique si les entrées étaient inférieures ou égales à 10. Mais comme nous devons prendre en charge des valeurs arbitrairement grandes, cela devient plus compliqué.

La valeur numérique de nest placée à l'avant et analysée en tant que littéral de nombre continu à l'aide ´. "3X4+kSqest le code quine de base. Si aucune valeur n'est présente à l'avant, la longueur de la pile ne sera que de 1 (la quine), sinon 2 laissant l1=d*?déterminer comment gérer les choses à partir de là.

  • S'il y a une valeur, S:1-}'LA2+-}s'exécute: échangez la valeur vers le haut, soustrayez 1, dupliquez-la, en laissant une copie au bas de la pile, obtenez le journal 10 de cette valeur multiplié par 100 (ce qui entraîne la longueur de caractère de la valeur, plus 1 pour le ´), supprimez autant de caractères de la fin de la chaîne (se tronquant effectivement de la fin, à la fois là où il n'est pas nécessaire et parce qu'il a la mauvaise valeur). Cest un octet plus court que 2+et donne la même valeur.

  • S'il n'y a pas de valeur, lisez-en une dans l'entrée.

Peu importe: :0)2*?dupliquez et comparez avec zéro.

  • En cas de poussée non nulle ´.

  • Si zéro, entrez la valeur. Nous pouvons tricher en utilisant !au lieu de 2?et enregistrer un octet parce que lorsque ´tente d'exécuter le premier octet, il voit qu'il n'est pas numérique et quitte immédiatement le mode numérique à la même position.

Imprimez la pile entière de haut en bas.

Draco18s ne fait plus confiance à SE
la source
3

Java 10, 145 octets

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Essayez-le en ligne et consultez les résultats de certaines itérations .

Explication:

explication :

  • Le var scontient le code source non formaté
  • %s est utilisé pour mettre cette chaîne en elle-même avec s.format(...)
  • %c,, %1$cet 34sont utilisés pour formater les guillemets doubles
  • s.format(s,34,s) met tout cela ensemble

Partie défi:

La première fonction lambda prend une longentrée en paramètre.

  • Ceci est défini en variable Long N=n;lors de la première itération. Ou Long N=%s;pour les prochaines itérations.
  • La vérification ternaire N>0?N-1+"L":"n"remplira cela %savec une valeur N-1, ajoutée avec Lcar c'est un long et pour le convertir en une chaîne pour le %s, si Nest supérieur à 1. Si Nvaut 0 à la place (l'entrée initiale était 0ou c'est la dernière itération de l'interquine- ' loop '), il remplira %sà la nplace l'initiale .
Kevin Cruijssen
la source
La spécification dit que les sorties intermédiaires doivent être un programme complet ou une fonction sans arguments
Embodiment of Ignorance
@EmbodimentofIgnorance Je sais, c'est ce que j'ai. La première fonction lambda prend un longparamètre de fonction, et les autres fonctions lambda prennent un Voidparamètre inutilisé , que j'utilise également toujours pour les défis indiquant de ne prendre aucune entrée car v->1 octet est plus court que ()->.
Kevin Cruijssen
2

Haskell , 195 164 octets

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Essayez-le en ligne!

Cela utilise une technique de quine assez simple. Nous le modifions avec une variable aqui est fixée à un nombre. Si ce nombre est zéro (ce qu'il est au début), nous prenons l'entrée et la sortie de notre source avec le aréglage sur le numéro d'entrée. Si an'est pas zéro, nous émettons notre source avec un aensemble de moins. De cette façon, le acompte à rebours est nul avant de sortir la source d'origine.

Ad Hoc Garf Hunter
la source
2

R , 92 octets

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Essayez-le en ligne!

Si deparseest réputé tricher, voici une alternative:

R , 108 octets

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Essayez-le en ligne!

Nick Kennedy
la source
1

Perl 6 , 44 octets

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Essayez-le en ligne!

Prend l'entrée via l'entrée standard et renvoie un programme où la seule chose modifiée est le premier nombre. Chaque programme suivant sortira alors le même programme, sauf avec ce nombre décrémenté.

Jo King
la source
1

C # (Visual C # Interactive Compiler) , 112 octets

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Beaucoup d'octets enregistrés grâce à @NickKennedy!

Essayez-le en ligne!

Incarnation de l'ignorance
la source
Les sorties intermédiaires ne sont ni un programme complet ni une fonction qui prend un seul argument. Je pense aussi que vous avez des ns qui devraient être des ls. Que diriez-vous de tio.run/##Sy7WTS7O/P@/…
Nick Kennedy
1

Python 3.8 (pré-version) , 60 56 55 53 octets

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Essayez-le en ligne!

-2 octets grâce à Jo King

À partir de la version 53 octets, fonctionne également en Python 2 et Python 3.

sept négatif
la source
La fonction intermédiaire ne semble pas être un programme complet ou une fonction qui ne prend aucun argument.
Nick Kennedy
Cet opérateur de morse :=est un ajout bienvenu à Python, c'est sûr.
mbomb007
"Pour les étapes intermédiaires des ouroboros, votre programme peut être soit un programme pleinement fonctionnel, soit une fonction sans arguments , qui, une fois appelée, renverra / affichera la suivante."
mbomb007
@NickKennedy Mis à jour pour se conformer à la spécification et sauvé par hasard 4 octets.
négatif sept
1
53 octets sans utiliser:=
Jo King