Votre tâche consiste à créer un programme qui, lorsqu'il est exécuté, se retourne en sortie (c'est ce qu'on appelle une quine). Cependant, ce quine doit, lorsqu'il est copié n
fois, renvoie le quine, mais avec chacun de ses caractères dupliqués à la place n
, où n
est un entier positif.
Si votre programme d'origine est Derp
:
Derp -> Derp (must return itself as output to be a quine)
DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)
DerpDerpDerp -> DDDeeerrrppp
etc. etc.
Gardez à l'esprit que vous êtes autorisé à avoir des espaces dans votre programme "de base", mais ils sont comptés lors de "l'imbrication". Dites que votre programme est
Derp
{newline}
(La nouvelle ligne signifie une nouvelle ligne de fin et il y a un espace supplémentaire après le Derp
). Lorsqu'il est dupliqué pour devenir
Derp
Derp
{newline}
Vous devez sortir
DDeerrpp
{newline}
{newline}
Gardez à l'esprit qu'il y a 2
des espaces supplémentaires après le DDeerrpp
.
Règles et spécifications:
- Votre programme doit contenir au moins deux caractères distincts (ce qui implique que votre code doit être d'au moins 2 octets).
- Les règles de quine standard s'appliquent.
C'est le code-golf , donc le code le plus court en octets gagne!
la source
Réponses:
Fission , 6 octets
Essayez-le en ligne! Essayez deux copies! Essayez trois!
Explication
Ceci est juste le quine standard de Fission . Il se trouve que cela fonctionne pour ce défi, car Fission a des points d'entrée explicites dans le programme. En particulier, en dupliquant le programme, on en ajoute un autre
R
qui ajoute un autre atome (pointeur d'instruction). Étant donné que le code source est toroïdal, le code efficace en cours d'exécution ne change pas autrement - pour chaque atome, le code est toujours le même localement. Cependant, les atomes sont exécutés par étape de verrouillage, de sorte que les éléments qu'ils impriment sont entrelacés et nous obtenons une copie supplémentaire de chaque caractère dans la sortie.Par souci d'exhaustivité, je vais juste répéter brièvement comment fonctionne le programme lui-même. Que nous répétions ou non le programme (par exemple
'!+OR"'!+OR"'!+OR"
), chaque atome voit le code suivant:Le
"
mode bascule l'impression de chaîne, de sorte que le programme commence par imprimer'!+OR
directement sur STDOUT, qui est tout le quine sauf la citation.'!
Définit ensuite la masse de l'atome sur le code de caractère de!
, l'+
incrémente, ce qui donne"
et l'O
imprime tout en détruisant simultanément l'atome. Le programme se termine alors, car il n'y a plus d'atomes.la source
Python 2.7,
377310304194191 191 octets!C'est mon premier golf, donc je ne m'attendais pas à ce qu'il soit trop bon. Mais je pensais que le concept dans la solution que j'ai trouvée était quelque peu drôle, donc je le poste quand même.
En effet, c'est une quine; vous pouvez l' essayer ici . Il abuse assez fort du module d'inspection.
Si nous essayons de l'exécuter avec le même code source x2, nous obtenons également la bonne sortie; vous pouvez l' essayer ici . x3, x4, etc. fonctionnent tous comme prévu.
Non golfé avec explication:
la source
inspect
? (voir la méta publication pertinente ). Sur PPCG, nous avons des définitions spécifiques de ce qui rend un quine valide, et «lire la source» est généralement considéré comme de la triche.import threading,inspect as i
peut êtreimport threading as T,inspect as i
CJam , 19 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
RProgN , 66 octets
Que les blancs soient ma mort
Expliqué
Seigneur, je suis un monstre ...
Essayez-le en ligne!
la source
~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R
fonctionne bien en général, ce n'est pas une solution valide, car il n'y a aucun moyen de répliquer le marqueur ZSS.Perl 5, 107 octets
Non golfé:
Essayez-le en ligne!
la source
Python 3 ,
122121112 112 octetsEssayez-le en ligne: un exemplaire | deux exemplaires | trois exemplaires | quatre exemplaires, avec vérification automatique
Comment ça fonctionne
Cela utilise le quine Python standard: Stockez le code que vous souhaitez exécuter dans une variable (sous forme de chaîne); inclure une certaine logique dans cette chaîne pour s'imprimer, tout ce qui précède et tout ce qui se trouve après; puis exécutez cette chaîne.
Le code qui est exécuté via la chaîne s est le suivant.
La première ligne importe inconditionnellement le module atexit , ce qui nous permettra d'enregistrer un gestionnaire de sortie. Essayer d'importer plusieurs fois le même module n'affecte en rien le script. Ensuite, il essaie d' incrémenter la variable n , pour garder une trace du nombre de copies du code source qui ont été exécutées.
La deuxième ligne n'est exécutée que si la première contient une erreur. Ce sera le cas lors de la première itération, car n n'est pas encore défini. Dans ce cas, nous initialisons n comme 1 et enregistrons un lambda qui effectue la magie réelle.
Le gestionnaire de sortie enregistré
sera appelé juste avant la fin du programme. Le lambda lui - même crée la chaîne
"s=%r;exec(s);"%s
-%r
crée une représentation de chaîne de l'argument droit ( s ), qui comprend tout entre les guillemets simples et les citations elles - mêmes - Itère puis sur ses personnages. Pour chaque caractère c , nous imprimons simplement n copies de c . Passerc*n
l'argument nomméend
àprint
signifie qu'aucun saut de ligne ne sera ajouté.la source
CJam , 14 octets
Essayez-le en ligne!
Explications
la source