Nous sommes le 10 août 2019, mais votre tâche implique toujours l'an 2000. Bizarre, non?
Créez un programme qui s'imprime, avec un numéro à deux chiffres qui lui est ajouté. La première fois que vous l'exécutez, il devrait ajouter 00 à sa sortie (son code source, car il s'agit d'une variante quine). Lorsque vous exécutez cette sortie, le programme d'origine sans un numéro à deux chiffres, il doit sortir le programme d'origine, mais avec 01 ajouté. Exécutez cette sortie pour obtenir le programme OG avec 02 ajouté, puis celle pour obtenir le programme avec 03 ... Cette chaîne devrait continuer jusqu'à 99. Ce programme devrait sortir BREAKING NEWS: WORLD ENDS
.
Si votre programme est Y2Kparanoia: yes
alors:
- Il devrait sortir
Y2Kparanoia: yes00
- Cette sortie devrait imprimer
Y2Kparanoia: yes01
- Cette sortie devrait imprimer
Y2K paranoia: yes02
- Répétez jusqu'à l'étape 100: ce programme affiche les nouvelles du Jugement Dernier spécifiées
C'est le golf de code, donc le programme le plus court qui peut s'imprimer tout en suivant ces étapes l'emporte.
2Kparanoia: yes97
et produire2Kparanoia: yes98
, donc (4) ne devrait-il pas lireRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (c.-à-d.2Kparanoia: yes99
produit les nouvelles)Réponses:
Perl 6 ,
122 114106 106 octets-8 octets grâce à Shelvacu
Essayez-le en ligne!
Prend le format quine standard et ajoute la chaîne de nouvelles de rupture ainsi qu'un nouvel appel de fonction avec le numéro ajouté. Cela permet
END
d'exécuter la fonction à la fin du programme.la source
END
et uneour
variable:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Rubis,
158154146 146128122100 octetsInspiré par cette réponse .
EDIT: J'ai pu le supprimer
(s.split(35.chr)[0]+35.chr).inspect
et le remplacer pars[0..-2]
(plage de chaque valeur sauf la dernière) et la%{ ... }
syntaxe de chaîne que j'ai utilisée auparavant. Enregistré 22 octets!Ancienne version:
EDIT: a enregistré une paire de parens (et la paire correspondante dans la section des données) en réalisant qu'il
"BREAKING NEWS: WORLD ENDS"
s'agit d'une chaîne de format parfaitement valide, et ruby ignore tous les paramètres extraneos.Au début, j'ai réalisé que puisque le nombre doit aller à la toute fin du programme, et que ruby ne permet pas d'utiliser des variables avant qu'elles ne soient déclarées, je devrais faire exécuter du code après les chiffres d'une manière ou d'une autre. J'aurais pu faire quelque chose
def a(s) ... end;a 1
qui deviendrait...end;a 100
, mais l'utilisation de laEND
syntaxe moins connue de ruby utilise moins d'octets. Cependant, le bloc à l'intérieurEND
est dans une portée différente, doncS
doit être une variable globale ou une constante.Explication:
END{ ... };S=1
: Exécuter un bloc de code juste avant la fin du programme; Réglez la constanteS
sur1
(ou100
-199
dans les futures itérations)$><<( ... )
:$>
est un raccourci en rubis pour stdout, et<<
sur un E / S écrit sur l'E / S. Les parens sont obligatoires, sinon cela devient($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]
: Si je décomposais cela en un code légèrement plus raisonnable, ce serait:L'
%
opérateur appliqué à une chaîne est effectivementprintf
, le LHS étant la chaîne de format et le RHS les arguments.%{ ... (q=%%{%s}) ... S=1%02d}
: ruby a une syntaxe intéressante pour les chaînes qui permet également à des paires de crochets d'apparaître dans la chaîne sans s'échapper tant qu'elles sont équilibrées. Ceci est très utile, car sinon un quine similaire devrait s'échapper de la chaîne pour la mettre en elle-même en tant que littéral de chaîne. Les deux substitutions dans la chaîne de format sont%s
pour une chaîne régulière et%02d
pour un nombre rempli à droite à une taille de 2 avec le caractère0
.Mes réflexions sur le raccourcissement supplémentaire:
Ce serait bien de pouvoir utiliser à laEDIT: Les constantes sont globales et peuvent être un seul caractère!s
place de$s
, mais la définition de ss=$s;
ou la création d'une fonctiondef a(s) ...
utilisent toutes deux plus d'octets qu'elles n'en économisent, et je ne vois pas d'autre moyen de le faire.S
c'était toujours moins alors100
, afin qu'il puisse être comparé en utilisant des nombres à 2 chiffres au lieu de nombres à 3 chiffres. Cependant, si j'utiliseS=0
à la fin, les deux chiffres suivants sont interprétés comme octaux,8
et9
sont invalides et tout est superposé.S=
n'est tout simplement pas valide, et je ne connais pas d'autre moyen de rendre une valeur valide avant et après l'ajout de deux chiffres. À noter,0
(et tous les autres entiers) est vrai en rubis.Si vous avez des idées sur la façon de raccourcir cela, faites-le moi savoir!
Essayez-le en ligne!
la source
s=100-1
? Alorss
sera 99, 0, -1 ...- 99, et-s
sera -99, 0 ... 99.Aller,
382 366 354 340 305 298272 octetsNe gagnera pas mais je me suis amusé avec le défi.
Essayez-le sur le Go Playground!
Basé sur une quine. Si la variable
n
est inférieure à 199, elle ajoute à la variable de chaînen
un accent grave (\x60
), le caractère de Go pour les chaînes multilignes, suivi d'une virgule,
. Il continue en imprimant les 147 premiers caractères des
(pour éviter d'imprimer le,
car cela ne se produit qu'à la fin) puis s'imprimes
dans son ensemble, et finalement imprime100
sin == 1
etn+1
sinon. Le résultat est que les exécutions successives changent la variablen
à la fin du programme en 100, 101, etc. Si la variablen
est 199 ou plus, elle imprime les dernières nouvelles.la source
Haskell ,
240232218216 216 octetsEssayez-le en ligne!
Adapté d'une quine
la source
JavaScript (ES6), 116 octets
94 octets, si le filtrage des fonctions est autorisé
la source
f=${f}
), ce n'est pas une quine selon codegolf.meta.stackexchange.com/a/4878/13400C # (compilateur interactif Visual C #) , 193 octets
Essayez-le en ligne!
la source
Pyth ,
8180 octetsEssayez-le en ligne!
Explication:
Et le code dans la chaîne est (dernières nouvelles raccourcies):
la source