Ruby, 158 154 146 128 122 100 bytes
Inspirado por esta respuesta .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
EDITAR: pude eliminarlo (s.split(35.chr)[0]+35.chr).inspecty reemplazarlo con s[0..-2](rango de cada valor excepto el último) y la %{ ... }sintaxis de cadena que usé antes. ¡Guardado 22 bytes!
Versión antigua:
EDITAR: guardó un par de parens (y el par correspondiente en la sección de datos) al darse cuenta de que "BREAKING NEWS: WORLD ENDS"es una cadena de formato perfectamente válida, y ruby ignora los parámetros 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
Al iniciar este me di cuenta de que, dado que el número tiene que ir al final del programa, y el rubí no permite el uso de variables antes de que se declaran, que tendría que hacer que el código se ejecute después de los dígitos de alguna manera. Podría haber hecho algo como lo def a(s) ... end;a 1que sería ...end;a 100, sin embargo, usar la ENDsintaxis menos conocida de Ruby usa menos bytes. Sin embargo, el bloque interior ENDtiene un alcance diferente, por lo que Sdebe ser una variable global o constante.
Explicación:
END{ ... };S=1: Ejecute el bloque de código justo antes de que finalice el programa; Establezca constante Sen 1(o 100- 199en futuras iteraciones)
$><<( ... ): $>es un atajo en ruby para stdout, y <<en un IO escribe en el IO. Los padres son obligatorios, de lo contrario se convierte en($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]: Si tuviera que dividir esto en un código un poco más razonable sería:
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
El %operador aplicado a una cadena es efectivo printf, con LHS como cadena de formato y RHS como argumentos.
%{ ... (q=%%{%s}) ... S=1%02d}: ruby tiene una sintaxis interesante para las cadenas que también permite que aparezcan pares de llaves dentro de la cadena sin escapar siempre que estén equilibradas. Esto es muy útil, ya que de lo contrario una quine similar tendría que escapar de la cadena para colocarla en sí misma como un literal de cadena. Las dos sustituciones en la cadena de formato son %spara una cadena normal y %02dpara un número rellenado a la derecha a un tamaño de 2 con el carácter 0.
Mis pensamientos sobre acortar aún más:
Sería bueno poder usarlo en slugar de hacerlo $s, pero al definir s s=$s;o hacer una función, def a(s) ...ambos usan más bytes de los que guardan, y no se me ocurre otra forma de hacerlo. EDITAR: ¡Las constantes son globales y pueden ser un solo personaje!
- Sería bueno si
Ssiempre fuera menor 100, de modo que pudiera compararse usando números de 2 dígitos en lugar de números de 3 dígitos. Sin embargo, si utilizo S=0al final, los dos dígitos siguientes se interpretan como octal, y 8y 9son válidos y todo está litera. S=simplemente no es válido, y no conozco otra forma de hacer que un valor sea válido tanto antes como después de agregar dos dígitos. Es de destacar que 0(y cualquier otro número entero) es verdadero en rubí.
Cualquier idea sobre cómo hacer esto más corto, ¡hágamelo saber!
Pruébalo en línea!
2Kparanoia: yes97y produciendo2Kparanoia: yes98, así que ¿no debería (4) leerRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (es decir,2Kparanoia: yes99produce la noticia)