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:
- Passé comme argument de ligne de commande
- Lire à partir de l'entrée standard
- 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.
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 legetInput()
? Aka la réponse Python actuelle est-elle valide?n
, génère un programme qui est le "programme initial" d'un quine ouroboros d'n
itérations, et que notre réponse ne devrait pas compter comme l'une desn
itérations. Est-ce correct?Réponses:
05AB1E , 28 octets
-4 octets + correction grâce à Kevin Cruijssen
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.
la source
d
est non négatif (>=0
) au lieu de positif (>0
). Le problème est que pour vérifierd
sans l'éclater, vous devez d'abord le dupliquer, mais il doit également être éliminé à l'itération0"quinsting"
, sinon il produira le dupliqué0
. :("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 les0"34çìD«s<Ddiì"34çìD«s<Ddiì
sorties d' itération-1
de l'D
uplicate ..)Enchantements runiques , 39 octets
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
n
est placée à l'avant et analysée en tant que littéral de nombre continu à l'aide´
."3X4+kSq
est 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 laissantl1=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).C
est un octet plus court que2+
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 de2?
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.
la source
Java 10, 145 octets
Essayez-le en ligne et consultez les résultats de certaines itérations .
Explication:
explication quine :
var s
contient le code source non formaté%s
est utilisé pour mettre cette chaîne en elle-même avecs.format(...)
%c
,,%1$c
et34
sont utilisés pour formater les guillemets doubless.format(s,34,s)
met tout cela ensemblePartie défi:
La première fonction lambda prend une
long
entrée en paramètre.Long N=n;
lors de la première itération. OuLong N=%s;
pour les prochaines itérations.N>0?N-1+"L":"n"
remplira cela%s
avec une valeurN-1
, ajoutée avecL
car c'est un long et pour le convertir en une chaîne pour le%s
, siN
est supérieur à 1. SiN
vaut 0 à la place (l'entrée initiale était0
ou c'est la dernière itération de l'interquine- ' loop '), il remplira%s
à lan
place l'initiale .la source
long
paramètre de fonction, et les autres fonctions lambda prennent unVoid
paramètre inutilisé , que j'utilise également toujours pour les défis indiquant de ne prendre aucune entrée carv->
1 octet est plus court que()->
.Haskell ,
195164 octetsEssayez-le en ligne!
Cela utilise une technique de quine assez simple. Nous le modifions avec une variable
a
qui 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 lea
réglage sur le numéro d'entrée. Sia
n'est pas zéro, nous émettons notre source avec una
ensemble de moins. De cette façon, lea
compte à rebours est nul avant de sortir la source d'origine.la source
Gelée ,
2220 octetsEssayez-le en ligne!
Essayez des appels répétés de code
la source
R , 92 octets
Essayez-le en ligne!
Si
deparse
est réputé tricher, voici une alternative:R , 108 octets
Essayez-le en ligne!
la source
Perl 6 , 44 octets
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é.
la source
C # (Visual C # Interactive Compiler) , 112 octets
Beaucoup d'octets enregistrés grâce à @NickKennedy!
Essayez-le en ligne!
la source
n
s qui devraient être desl
s. Que diriez-vous de tio.run/##Sy7WTS7O/P@/…Python 3.8 (pré-version) ,
60565553 octetsEssayez-le en ligne!
-2 octets grâce à Jo King
À partir de la version 53 octets, fonctionne également en Python 2 et Python 3.
la source
:=
est un ajout bienvenu à Python, c'est sûr.:=