É 10 de agosto de 2019, mas sua tarefa ainda envolve o Y2K. Estranho, certo?
Crie um programa que se imprima com um número de dois dígitos anexado. Na primeira vez em que você o executa, ele deve anexar 00 à sua saída (seu código-fonte, porque esta é uma variante quine). Quando você executa essa saída, o programa original sem um número de dois dígitos, ele deve produzir o programa original, mas com 01 anexado a ele. Execute essa saída para obter o programa OG com 02 anexado e, em seguida, para obter o programa com 03 ... Essa cadeia deve continuar até 99. Esse programa deve ser gerado BREAKING NEWS: WORLD ENDS
.
Se o seu programa for Y2Kparanoia: yes
:
- Deve produzir
Y2Kparanoia: yes00
- Essa saída deve imprimir
Y2Kparanoia: yes01
- Essa saída deve imprimir
Y2K paranoia: yes02
- Repita até a etapa 100: este programa exibe as notícias do dia do juízo final especificadas
Esse é o código de golfe, portanto, o programa mais curto que pode ser impresso ao mesmo tempo em que segue essas etapas vence.
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)Respostas:
Perl 6 ,
122 114106 bytes-8 bytes graças a Shelvacu
Experimente online!
Adota o formato padrão de quine e adiciona a sequência de notícias de última hora, bem como uma nova chamada de função com o número anexado. Isso é usado
END
para executar a função quando o programa termina.fonte
END
umaour
variável:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Ruby,
158154146128122100 bytesInspirado por esta resposta .
Edição: Consegui removê
(s.split(35.chr)[0]+35.chr).inspect
-lo e substituí-lo pors[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.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 aEND
sintaxe menos conhecida do ruby usa menos bytes. No entanto, o bloco internoEND
está em um escopo diferente, portantoS
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 constanteS
como1
(ou100
-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:O
%
operador aplicado a uma string é efetivamenteprintf
, 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 caractere0
.Meus pensamentos em diminuir ainda mais:
Seria bom poder usar emEDIT: As constantes são globais e podem ser um caractere!s
vez de$s
, mas definir ss=$s;
ou tornar uma funçãodef a(s) ...
usa mais bytes do que economiza, e não consigo pensar em outra maneira de fazê-lo.S
fosse sempre menor do100
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 usarS=0
no final, os próximos dois dígitos serão interpretados como octais,8
e9
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 que0
(e todos os outros números inteiros) é verdade em rubi.Quaisquer pensamentos sobre como tornar isso mais curto, por favor me avise!
Experimente online!
fonte
s=100-1
? Entãos
serão 99, 0, -1 ...- 99 e-s
serão -99, 0 ... 99.Go,
382366354 340305298272bytesNão vou ganhar, mas eu me diverti com o desafio.
Experimente no Go Playground!
Baseado em uma solução. Se a variável
n
for menor que 199, ela adiciona à variável de sequêncian
um acento grave (\x60
), o caractere de Go para sequências de múltiplas linhas, seguido por uma vírgula,
. Ele continua imprimindo os primeiros 147 caracteres des
(para impedir a impressão,
porque isso ocorre apenas no final), depois imprimes
como um todo e, finalmente, imprime100
sen == 1
e den+1
outra forma. O resultado é que execuções sucessivas alteram a variáveln
no final do programa para 100, 101 etc. Se a variáveln
for 199 ou mais, ela imprime as últimas notícias.fonte
Haskell ,
240232218216 bytesExperimente online!
Adaptado de um quine
fonte
JavaScript (ES6), 116 bytes
94 bytes, se funções de stringing forem permitidas
fonte
f=${f}
), isso não é um problema, de acordo com codegolf.meta.stackexchange.com/a/4878/13400C # (compilador interativo do Visual C #) , 193 bytes
Experimente online!
fonte
Pitão ,
8180 bytesExperimente online!
Explicação:
E o código na string é (as últimas notícias abreviadas):
fonte