Tâche
- Prenez un seul caractère Unicode en entrée.
- Afficher un programme dans le même langage qui obéit également à cette spécification, mais qui ne contient pas le caractère d'entrée.
- Si votre programme est exécuté avec l'entrée a , puis le programme de sortie est ensuite exécuté avec l'entrée b , le programme qu'il génère est autorisé à contenir le caractère a . Cependant, b n'est toujours pas autorisé à apparaître dans ce programme. En d'autres termes, seule l'entrée dans la dernière incarnation du programme est interdite.
- Indépendamment de ce que le titre peut dire, les règles de quine standard s'appliquent.
Le programme le plus court gagne. Le programme doit comporter au moins un octet.
Exemple
Si le programme est ABCD. (# est un commentaire)
> slangi "ABCD"
A
EBCD # "FBCD" "JGGJ" "UGDKJGDJK" are all OK
> slangi "EBCD"
C
ABGD # "EBGD" "UIHDAIUTD" are all OK
> slangi "ABGD"
B
AFCD
> slangi "AFCD"
Z
ABCD
Où slangi
est un interprète pour une langue fictive.
code-golf
restricted-source
quine
Akangka
la source
la source
e
.e
, pourtant Gadsby le fait.Réponses:
CJam,
45413835 octetsSi le caractère d'entrée n'est aucun des caractères
"$&)+,/:?HOX\_`el{}
, ce programme imprime la version suivante, légèrement modifiée de lui-même. Essayez-le en ligne!Sinon, le programme imprime la version obscurcie suivante de la modification. Essayez-le en ligne!
Notez que certains des caractères ne sont pas imprimables. Essayez-le en ligne!
Comment ça marche
Dans le premier programme de sortie possible, nous évitons d'utiliser
~
pour pouvoir l'utiliser dans l'autre programme. Par conséquent, au lieu de_~
, le programme modifié se termine parOX$_?
, qui fonctionne comme suit.Enfin, dans le programme de sortie restant,
encapsule tous ces caractères dans un tableau, poussant donc la chaîne suivante.
If-
soustrait 18 de chaque code de caractère, en poussant la chaîneque
~
l'évalue.la source
JavaScript (ES6),
356340327308303263Utilisant maintenant
Function`...```
pour le deuxième programme:La fonction s'emballe dans l'un des trois programmes possibles:
Le premier programme fait appel
eval
à un littéral de chaîne contenant le code de la fonction avec chaque caractère échappé comme valeur octale.Le deuxième programme redirige le navigateur vers une
javascript:
URL contenant le code de la fonction avec chaque URL de caractère encodée. C'est la seule façon dont je pouvais penser pour évaluer le code sans utiliser de parenthèses. Il échappe également aux lettres en «eval».Le dernier programme est douloureusement long. Il construit le code de la fonction en ajoutant un (
+9-8
) à la fois pour obtenir chaque code de caractère. Ceci afin d'éviter d'utiliser les chiffres octaux.Le programme correct est indexé en recherchant une chaîne soigneusement construite pour le caractère d'entrée:
Voici une version non golfée et non testée. Cela pourrait ne pas fonctionner en raison de nouvelles lignes dans la source.
la source
function f(){ ... };f()
peut être(f=_=>{ ... })()
. Voici un exemple: es6fiddle.net/iiz2nq0lf=(_=prompt())=>...;f()
. L'entrée est stockée sous_
.Function`[code]`.call``;
travail pour vous, au lieu de rediriger? Voici un exemple de travail: es6fiddle.net/ij023v49 (Voir? Nonevil()
! Erm, je veux direeval()
...)this
objet sera cette chaîne de modèle vide. Il repose sur leFunction
constructeur, qui vous permet de créer une fonction, au lieu de l'exécutereval()
. La fonction aura le code contenu dans le premier paramètre. Je l'utilise beaucoup pour obtenir le vraiwindow
, en utilisantFunction('return this')()
. Comme vous ne pouvez pas l'utiliser()
, j'ai abusé de la gentillesse d'ES6 pour essayer de cracher une fonction utilisable sans laquelle vous pouvez exécuter()
. Pour cela, vous avez besoin de la.call()
méthode, qui appelle la fonction avec un nouvelthis
objet.