Rubis, 158 154 146 146 128 122 100 octets
Inspiré par cette réponse .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
EDIT: J'ai pu le supprimer (s.split(35.chr)[0]+35.chr).inspect
et le remplacer par s[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.
END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%{END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%%{%s})%%[q,S<2?0:S-99]}
S=1%02d})%[q,S<2?0:S-99]}
S=1
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 la END
syntaxe moins connue de ruby utilise moins d'octets. Cependant, le bloc à l'intérieur END
est dans une portée différente, donc S
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 constante S
sur 1
(ou 100
- 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:
if S > 198
"BREAKING NEWS: WORLD ENDS"
else
q = ...
number_to_append = if S < 2
0
else
S - 100 + 1
end
q % [q, number_to_append]
end
L' %
opérateur appliqué à une chaîne est effectivement printf
, 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ère 0
.
Mes réflexions sur le raccourcissement supplémentaire:
Ce serait bien de pouvoir utiliser à la s
place de $s
, mais la définition de s s=$s;
ou la création d'une fonction def a(s) ...
utilisent toutes deux plus d'octets qu'elles n'en économisent, et je ne vois pas d'autre moyen de le faire. EDIT: Les constantes sont globales et peuvent être un seul caractère!
- Ce serait bien si
S
c'était toujours moins alors 100
, afin qu'il puisse être comparé en utilisant des nombres à 2 chiffres au lieu de nombres à 3 chiffres. Cependant, si j'utilise S=0
à la fin, les deux chiffres suivants sont interprétés comme octaux, 8
et 9
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!
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)