Votre tâche est simple: écrire un programme (ou une fonction) qui ne prend aucune entrée et génère (ou retourne) son code source. Le hic, c'est que lorsque le programme est encapsulé "quotes"
(caractère Unicode 34), il devrait à nouveau sortir son code source (maintenant cité).
Les règles standard pour les quines s'appliquent. Il s'agit de code-golf , donc le programme le plus court (en octets) gagne.
!
..."
? Certaines langues prennent en charge deux ou trois guillemets.Réponses:
Noodel ,
97 octetsCette version fonctionne de la même manière que l'autre, juste que j'ai oublié que Noodel a un moyen d'exécuter un bloc de code une fois et j'ai fait le langage ...
Ḷ1ḥ-Ð1ḥ@€
Essayez-le :)
Comment ça fonctionne
Devis-Sécurité
Placer le
"
caractère avant et après le programme fonctionne car Noodel dispose d'un ensemble de caractères dédiés à ce que j'appelle les imprimables . Ceux-ci sont immédiatement analysés en tant que littéraux de chaîne lorsqu'ils sont placés par eux-mêmes et permettent d'imprimer facilement quelque chose à l'écran. Ainsi, contrairement à la plupart des langues, Noodel considère l' ensemble ASCII normal qui est considéré comme digne d'être imprimé comme des littéraux de chaîne directs (sauf pour l'espace et le saut de ligne) qui y cite le code est simplement considéré comme poussant sur les chaînes."Essayez-le :)"
Extraits
la source
e
soit valide. La question ne demande pas le caractère codé en octet 34, mais le caractère Unicode 34. Quel que soit le codage que vous utilisez, il n'y en a qu'un:"
"
? (Désolé, j'essaie juste de m'assurer que je comprends ce que vous dites) De plus, dois-je supprimer tout le texte de la réponse concernant l'utilisatione
?"
travaux, je supprimerais simplement la discussion et utiliserais simplement"
.Python
23,181152130 130124122 octetsEssayez-le en ligne! Le TIO est livré avec un en-tête et un pied de page qui testent automatiquement la validité du quine. Vous pouvez les effacer pour simplement exécuter la quine.
Ce code fonctionne en utilisant les chaînes entre guillemets triples en Python.
""" """
est égal à' '
et"""" """
est égal à'" '
.Le code utilise
exec
, mais pas pour la façon "non quiney" d'exécuter des données en tant que code, juste pour définir une variable à l'intérieur d'une expression. Leexec
est également correctement encodé dans les données.La première instruction compare la chaîne, éventuellement avec un guillemet ajouté, à
" "
, et définit la variableoct
conséquence. (La variable aurait pu être une courte fonction intégrée.)Le reste du code implémente ensuite le quine Python traditionnel en utilisant
%r
le formatage de chaîne, avec du code supplémentaire qui supprime les guillemets supplémentaires sioct
est inchangé.Une version alternative utilisant le "cheaty"
exec
arrive à 126 octets avec du code moins répété:Essayez-le en ligne!
la source
StandardML ,
182 176108 octetsVersion non cotée : essayez-la sur codingground.
Version citée: Essayez-la sur codingground.
Notez que la sortie ressemble à ceci
car le code est interprété déclaration par déclaration (chacun
;
termine une déclaration) et montre la valeur et le type de chaque déclaration.Contexte
En SML, il y a un quine de la forme
<code>"<code in quotes>"
:et un sous la forme
"<code in quotes>"<code>
:Les deux s'appuient sur le fait que la
<code>
partie-ne contient pas de guillemets et peut donc être citée sans avoir besoin de s'échapper quoi que ce soit, les éléments"
nécessaires pour sortir le quine sont donnés parstr(chr 34)
.Ils s'appuient également fortement sur l'identifiant implicite
it
qui est utilisé quand aucun identifiant explicite n'est donné dans une déclaration.Dans le premier quine
str(chr 34);
se lieit
à la chaîne contenant"
,fn x=>
démarre une fonction anonyme prenant un argumentx
, puis concatènex^it^x^it
et imprime la chaîne résultante. Cette fonction anonyme est directement appliquée à une chaîne contenant le code du programme, donc la concaténationx^it^x^it
donne<code>"<code>"
.La deuxième quine commence avec juste le code du programme en tant que chaîne
";str(chr 34)^it;print(it^it)";
qui est liée àit
.str(chr 34)^it;
Concatène ensuite une citation au début de la chaîne et comme encore aucun identificateur explicite n'est donné, la chaîne résultante"<code>
est liée àit
. Enfinprint(it^it)
concatène la chaîne avec elle-même,"<code>"<code>
qui est ensuite imprimée.Explication
Edit: n'est plus à jour avec la version 108 octets, mais on pourrait aussi le comprendre après avoir lu cette explication.
Le quine sans danger pour les devis combine les deux approches ci-dessus et est lui-même de la forme
"<code>"<code>
. Remettre cela entre guillemets donne""<code>"<code>"
donc une chaîne vide, puis une quine de l'autre forme.Cela signifie que le programme reçoit soit sa propre source sous la forme
"<code>
de l'identifiantit
, soitit
juste"
et nous recevons notre propre source<code>
comme argument et doit donc être une fonction qui gère un tel argument.Pour identifier dans ce cas , nous sommes, nous vérifions si la taille
it
est supérieure à 1. Sinon,it
est"
et nous sommes dans le second cas, de sorte que leselse
rendements -Part une fonction anonymefn x=>print(it^it^x^it^x^it)
qui est alors appelé parce que son suivi par la source en tant que chaîne . Notez leit^it^
début qui est nécessaire pour la chaîne vide au début du programme.Si
size it
est plus grand que 1, nous sommes dans lathen
partie -et exécutons justeprint(it^it)
, non? Pas tout à fait, car j'ai négligé de vous dire que SML est fortement typé, ce qui signifie qu'un conditionnelif <cond> then <exp_1> else <exp_2>
doit toujours avoir le même type, ce qui signifie à nouveau que les expressions<exp_1>
et<exp_2>
doivent avoir le même type. Nous connaissons déjà le type de laelse
partie: Une fonction anonyme qui prend une chaîne et appelle ensuiteprint
a typestring -> <return type of print>
, etprint
a typestring -> unit
(unit
est en quelque sorte similaire àvoid
dans d'autres langues), donc le type résultant est à nouveaustring -> unit
.Donc, si la
then
pièce était juste deprint(it^it)
typeunit
, nous obtiendrions une erreur de non-correspondance de type. Et alorsfn _=>print(it^it)
? (_
est un caractère générique pour un argument qui n'est pas utilisé) Cette fonction anonyme en elle-même a un type'a -> unit
où'a
représente un type arbitraire, donc dans le contexte de notre conditionnel qui applique unstring -> unit
type, cela fonctionnerait. (La variable type'a
est instanciée avec typestring
.) Cependant, dans ce cas, nous n'imprimerions rien car la fonction anonyme n'est jamais appelée! Rappelez-vous, lorsque nous allons dans lathen
partie -le code global est"<code>"<code>
, donc le<code>
partie -évalue une fonction mais, comme rien ne vient après, elle n'est pas appelée.Au lieu de cela , nous utilisons un sequentialisation qui a la forme
(<exp_1>; ...; <exp_n>)
où<exp_1>
à<exp_n-1>
peut avoir des types arbitraires et le type de<exp_n>
fournit le type de l'ensemble sequentialisation. D'un point de vue fonctionnel, les valeurs de<exp_1>
à<exp_n-1>
sont simplement ignorées, mais SML prend également en charge les constructions impératives afin que les expressions puissent avoir des effets secondaires. En bref, nous prenons(print(it^it);print)
lathen
partie -part, imprimant donc d'abord et retournant ensuite la fonctionprint
qui a le bon type.la source
V ,
27, 23 octetsEssayez-le en ligne!
Comme il contient des caractères non imprimables, voici une version lisible:
et voici un hexdump:
Donc, la toute première chose que nous devons faire est de déterminer si le premier caractère est une citation.
éP
insère un caractère «P», mais"éP
est un NOOP. Après cela, nous exécutons une légère modification sur le quine extensible standard, qui est:Nous allons toutefois procéder légèrement différemment. Tout d'abord, nous devons insérer le texte de départ "éP". Nous faisons donc
Voici où la ramification se produit. Le texte actuellement dans le tampon est
Sauf si nous l'avons mis entre guillemets, dans ce cas, le «P» n'aurait jamais été inséré, et le tampon est:
Puisque nous enregistrons toujours, nous pouvons faire ce que nous voulons ici, et il sera ajouté au tampon lorsque cela se produira
"qp
. Donc, à partir d'ici, il est assez facile de supprimer conditionnellement les guillemets:la source
JavaScript (ES6),
239237 octetsPrenez soin d'essayer chaque version dans un nouvel environnement (par exemple, un nouvel onglet de navigateur)
Il doit y avoir au moins un moyen de simplifier cela ...
la source