Ruby, 158 154 146 128 122 100 bytes
Inspirado por esta resposta .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
Edição: Consegui removê (s.split(35.chr)[0]+35.chr).inspect
-lo e substituí-lo por s[0..-2]
(intervalo de todos os valores, exceto o último) e a %{ ... }
sintaxe da string que eu usei antes. Economizou 22 bytes!
Versão antiga:
EDIT: Salva um par de parênteses (e o par correspondente na seção de dados) ao perceber que "BREAKING NEWS: WORLD ENDS"
é uma sequência de formato perfeitamente válida e o ruby ignora todos os 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
Ao iniciar isso, percebi que, como o número precisa ir até o final do programa, e o ruby não permite o uso de variáveis antes de serem declaradas, eu precisaria executar o código após os dígitos de alguma forma. Eu poderia ter feito algo como o def a(s) ... end;a 1
que se tornaria ...end;a 100
, no entanto, usar a END
sintaxe menos conhecida do ruby usa menos bytes. No entanto, o bloco interno END
está em um escopo diferente, portanto S
deve ser uma variável global ou constante.
Explicação:
END{ ... };S=1
: Execute o bloco de código imediatamente antes do programa terminar; Defina constante S
como 1
(ou 100
- 199
em futuras iterações)
$><<( ... )
: $>
é um atalho em ruby para stdout e <<
em um IO grava no IO. Os parênteses são necessários, caso contrário, torna-se($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]
: Se eu dividisse isso em um código um pouco mais razoável, seria:
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
O %
operador aplicado a uma string é efetivamente printf
, com o LHS sendo a string de formato e o RHS sendo os argumentos.
%{ ... (q=%%{%s}) ... S=1%02d}
: ruby tem uma sintaxe interessante para strings que também permite que pares de colchetes apareçam dentro da string sem escapar enquanto estiverem equilibrados. Isso é muito útil, pois, caso contrário, um quine semelhante teria que escapar da string para inseri-la como uma literal de string. As duas substituições na cadeia de caracteres de formato são %s
para uma cadeia regular e %02d
para um número preenchido à direita para um tamanho de 2 com o caractere 0
.
Meus pensamentos em diminuir ainda mais:
Seria bom poder usar em s
vez de $s
, mas definir s s=$s;
ou tornar uma função def a(s) ...
usa mais bytes do que economiza, e não consigo pensar em outra maneira de fazê-lo. EDIT: As constantes são globais e podem ser um caractere!
- Seria bom se
S
fosse sempre menor do 100
que isso, para que pudesse ser comparado usando números de 2 dígitos em vez de números de 3 dígitos. No entanto, se eu usar S=0
no final, os próximos dois dígitos serão interpretados como octais, 8
e 9
são inválidos e tudo é beliche. S=
simplesmente não é válido e não conheço outra maneira de validar um valor antes e depois de anexar dois dígitos. É importante notar que 0
(e todos os outros números inteiros) é verdade em rubi.
Quaisquer pensamentos sobre como tornar isso mais curto, por favor me avise!
Experimente online!
2Kparanoia: yes97
e produzindo2Kparanoia: yes98
, então (4) não deveria lerRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (ou seja,2Kparanoia: yes99
produz as notícias)