Desafio:
Seu programa utilizará dois números inteiros n
e, k
como entrada, e produzirá o menor número inteiro maior que (mas não igual a) n
que contenha pelo menos k
ocorrências do dígito 5
.
Você pode assumir 1 ≤ k ≤ 15
e 1 ≤ n < 10**15
.
Este é um desafio de tempo restrito . Seu programa deve ser executado no TIO para todos os casos de teste e concluído em 10 segundos no total.
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 com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada. Os parâmetros da função podem ser obtidos em qualquer ordem, mas especifique na sua resposta.
- As brechas padrão são proibidas.
- Você deve adicionar um link com um teste para o seu código (ou seja, TIO ).
- O cabeçalho da resposta deve listar a pontuação em bytes, mas também o tempo total gasto para todos os casos de teste no TIO
- Se o seu idioma não estiver no TIO, o código deverá terminar em menos de 10 segundos na sua máquina, para que você tenha certeza de que é rápido o suficiente em qualquer computador razoável.
- É altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste:
(n, k) -> output
(53, 2) -> 55
(55, 1) -> 56
(65, 1) -> 75
(99, 1) -> 105
(555, 3) -> 1555
(557, 1) -> 558
(5559, 3) -> 5565
(6339757858743, 5) -> 6339757859555
(99999999999999, 15) -> 555555555555555
Exemplo de programa:
Este programa está correto.
(n, k) = (45, 1)
é50
? Algumas das respostas estão erradas.Respostas:
R + stringr,
858476 bytes, 0,062s no TIOExperimente online!
-1 byte graças a Robert S.
-8 bytes graças a Giuseppe.
Uma solução recursiva simples seria aumentar em 1 até que a resposta seja encontrada, mas isso não atenderia à restrição de tempo. Para atender à restrição de tempo, essa função utiliza o fato de que, se houver p faltando 5s, podemos aumentar em 2 * 10 ^ (p-2).
Observe que quando p = 1, o incremento se torna 0,2. Tudo bem, pois após 5 etapas retornamos a um número inteiro e nenhum dos números decimais encontrados nesse período possui um extra de 5. Se, em vez disso, aumentarmos em 5 * 10 ^ (p-2) ou em 1 * 10 ^ (p-2), encontraríamos f (24, 1) = 24,5 em vez de 25, por exemplo.
fonte
if
variante de função.a
estava fazendo, por isso o removi e parece que está tudo bem.Geléia , 37 bytes 0,131 s em TIO
Experimente online!
Isso funciona por
k
, e fazendo um número com esse númerofonte
[557,1]
(resulta em em558
vez de560
); O caso de teste na descrição parece incorreto, pois[557,2]
deve resultar em seu558
lugar.05AB1E ,
3332 bytesPorto da abordagem incrível de @NickKennedy em sua resposta Jelly , por isso não deixe de vota-lo!
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Stax , 17 bytes (6.861 segundos no TIO)
Execute e depure
Este programa recebe
k
en
na entrada padrão separados por espaço. O Stax não possui uma maneira conveniente de executar vários casos de teste no TIO, portanto, executei cada entrada separadamente e adicionei o tempo. 99% do tempo está na inicialização do processo do intérprete. Usando o interpretador javascript no staxlang.xyz, todos os casos de teste são executados em 50 milissegundos.Último caso de teste em Experimente online!
Procedimento :
5
s suficientes , finalize e imprimat
= número de5
s à direita no número10 ** t
fonte
Python 2 ,
7068 bytes (0,025 segundos no TIO)Experimente online!
Isso pode ser um pouco exagerado; está correto em todos os casos e termina em um tempo insignificante para os casos de teste, mas não termina em um tempo razoável para outros casos. Tecnicamente, ele atende aos requisitos.
Em resumo, se o menor número com
k
cinco for maior quen
, usamos esse número, pois é obviamente a solução correta. Caso contrário, recorremos à abordagem recursiva padrão.fonte
Perl 5
-pl
, 44 bytesExperimente online!
Localiza qual é o número sem os 5s à direita. Incrementa essa parte em 1. Continua até 5s suficientes estarem no número. Leva cerca de 0,012s no TIO para executar todos os casos de teste.
fonte
Python 3 ,
144988675 bytesExperimente online!
O algoritmo deve arredondar cada dígito (começando pelo menos significativo) para o valor mais próximo de 5 até que a representação decimal do novo número tenha a contagem desejada.
A abordagem original usava uma compreensão de lista abortável (D = iter (intervalo (k)) e lista (D) no trabalho aqui), mas o @ ASCII apenas me convenceu de que nunca venceria o golfe de código. Não gosto de recursão, mas se o algoritmo for escrito para minimizar a profundidade da recursão, um futuro compilador / intérprete será inteligente o suficiente para reimplementá-lo como um loop while.
fonte
(-(-~n//l+5))%10
por issoPython 3 , 59 bytes
Solução recursiva. A profundidade da recursão é um problema (precisa ser alterada para números mais altos), mas está correta.
Experimente online!
fonte
Python 3, 72 bytes
Experimente online!
fonte
Java 8, 69 bytes, mais de 60 segundos no TIO com o último caso de teste, ~ 1,5 segundos sem.
Alguém tem alguma idéia de como passar no último caso de teste?
fonte
PHP ,
10997 bytes (<0,03s no TIO)Experimente online!
Baseado no algoritmo de @ recursive .
fonte
Retina , 63 bytes
Experimente online! Pega
n
ek
em linhas separadas, mas o link inclui o cabeçalho que converte o conjunto de testes no formato apropriado. Explicação:Converta
k
para unário.Incremento
n
. O*
repete seu argumento correto (aqui o primeiro_
caractere) o número de vezes dado por seu argumento esquerdo (que, como aqui, assume como padrão a correspondência). Isso resulta em uma sequência desse comprimento. O$(
(o)
implícito) concatena isso com o segundo_
e as.
causas que o comprimento resultante deve ser obtido. (Na verdade, a Retina 1 é mais inteligente que isso e apenas realiza o cálculo nos comprimentos subjacentes.)Teste se
5
s suficientes podem ser encontradosn
para corresponder aos_
s da representação unária dek
. Este teste foi jogado no golfe e seria três vezes mais rápido com^
adição após a inicial/
e ainda mais rápido se[^5]
fosse usado em vez de.
.Até o teste passar ...
... incrementa,
n
mas exclui5
s à direita .Excluir
k
.fonte
Molusco , 30 bytes, ~ 0.2s no TIO
Transpiles para esse JS (suíte de testes completa adicionada para o tempo,
inputs
é claro), onde há uma matriz de entradas (n
primeiro,k
segundo)Obrigado @ArBo pela abordagem
Explicação
fonte
C (gcc) ,
159158152150 150149 bytes, ~ 0,04 sEmite a resposta para STDOUT, com zeros à esquerda.
-3 bytes graças ao ceilingcat
Experimente online!
fonte