Desafio:
Crie um programa ou função que aceite uma entrada inteira, que emita um novo programa / função, conforme especificado abaixo.
Entrada:
Inteiro n
: Tempo em segundos antes da bomba-relógio explodir.
Resultado:
O programa original que teve o tempo em segundos n
como entrada, produzirá um novo programa / função que faz o seguinte:
- Os
n
segundos se passaram desde que o programa anterior foi executado? ImpressãoBOOM!
- Senão: Imprima um programa / função que, quando executado, redefine o timer para
n
segundos (e age da mesma forma que o primeiro programa / função emitido).
NOTA: Não é exatamente o mesmo que o primeiro programa / função emitido (pelo menos na maioria dos idiomas), porque o horário de início mudou (veja o exemplo de esclarecimento abaixo).
Exemplo de pseudocódigo:
Digamos que o programa original seja ABC
e a entrada seja 60
segundos:
ABC
e 60
saídas DEF(60)
.
- Se
DEF(60)
for executado dentro de 60 segundos, será exibidoDEF_G(60)
, que age exatamente da mesma formaDEF(60)
, mas com uma nova hora de início. - Se
DEF(60)
for executado após 60 segundos, será emitidoBOOM!
.
Exemplo de esclarecimento, o que quero dizer com 'horário de início':
- O programa base com
60
segundos de entrada é executado em12:00:00
. Emite o primeiro programa de saída com um horário de início de12:00:00
. - Este primeiro programa de saída com horário de início
12:00:00
é executado em12:00:45
. Ele gera um segundo programa de saída com um horário de início de12:00:45
. - Este terceiro programa de saída com um horário de início
12:00:45
é executado em12:01:25
. Ele gera um quarto programa de saída com um horário de início de12:01:25
. - Este quarto programa de saída com um horário de início
12:01:25
é executado em12:05:00
. Ele irá produzirBOOM!
.
Observe como a primeira saída seria impressa BOOM!
depois 12:01:00
, mas o programa de saída progrediu, mesmo estando 12:01:25
na etapa 3, ele ainda emitirá o próximo programa em vez de BOOM!
(porque os programas de saída de saída têm horários de início além do primeiro programa de saída) .
Regras do Desafio:
- Regras de quine padrão se aplicam.
- Pelo menos
n
segundos deveriam ter passado. Portanto, se a entrada é60
e a hora de início foi12:00:00
,12:01:00
ela ainda emitirá o programa v2, mas12:01:01
será emitidaBOOM!
. - Os programas de saída não receberão nenhuma entrada ( exceto um parâmetro vazio não utilizado, se for mais curto ). O horário de início deve ser atribuído aos próximos programas como valor 'codificado' (é por isso que a saída de um programa de saída não é exatamente a mesma que a anterior (na maioria dos idiomas).
- Somente o tamanho do seu programa / função principal é contado em termos de bytes.
- Você pode emitir o programa / função como string (ou formato razoável comparável, como byte / matriz de caracteres / lista), como função se o seu idioma suportar isso ou outros formatos razoáveis (pergunte se você não tem certeza).
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Respostas:
JavaScript, 51 bytes
Teste no navegador
versão antiga
Teste no navegador
fonte
return()=>
. E embora eu quase nunca programa em JavaScript, verifiquei seu script de teste e até o modifiquei adicionando um teste para a função de saída da função: Teste aqui com o quarto teste de função da função. Tudo parece funcionar, e é surpreendentemente curto, devo acrescentar, então +1 de mim. PS: Nas regras declaradas, ele deve gerar uma string em vez de uma função. Mas vou mudar um pouco as regras para permitir as duas coisas. Você poderia modificar o script para que ele também produza as funções a serem registradas durante o teste?f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'
deve funcionarJavaScript, 53 bytes
Mostrar snippet de código
Resposta antiga (retornar deve ser uma string)
JavaScript, 78 bytes
Mostrar snippet de código
fonte
Java 8, 234 bytes
Desculpe postar meu próprio desafio imediatamente. Pretende-se principalmente como um esclarecimento adicional do desafio, e eu estava duvidando de adicioná-lo à pergunta em si ou postá-lo como resposta (e decidi publicá-lo como uma resposta para não bagunçar o post do desafio).
E embora eu gostaria de dizer que também é algo para (tentar e) vencer, isso nem vale a pena mencionar porque, bem ... Java (quase) sempre é vencido. ; p
Experimente online.
Exemplo de saída:
Experimente a função lambda gerada aqui.
Exemplo de saída:
Explicação:
A função principal pega uma entrada inteira e retorna uma String. Basicamente, retorna uma função que é quine, com a entrada inteira e o tempo de início (em segundos como carimbo de data / hora) como valores codificados.
Função principal:
n=60
foi usado nos exemplos abaixo:Primeiro programa de saída:
Segundo programa de saída:
O mesmo que o primeiro programa de saída, exceto que
70492.687613232
é substituído por70548
.fonte
Perl 5 +
-p
, 88 bytesOs programas de saída devem ser executados com
-M5.010
forsay
, mas não-p
.Experimente online!
fonte
05AB1E , 50 bytes
Definitivamente, pode-se jogar um pouco mais, mas é bastante complicado produzir uma semiquina que produza um programa com valores modificados.
Experimente online ou tente uma execução de exemplo de 20 segundos .
Explicação:
Exemplo de programa resultante:
Que é baseado no Quine padrão:
"34çìD«"34çìD«
.Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) Para entender por que
‘ÒÞ!
é"BOOM!"
.NOTA: A razão pela qual o espaço existe
çì
é porque, caso contrário, ele é interpretado como uma string de dicionário (triumph
) devido ao’...’
.fonte