Preciso preparar dígitos feitos de papelão para exibir algum número ( exemplo ). Não sei de antemão qual número devo exibir - a única coisa que sei é que não é maior que n
.
Quantos dígitos de papelão devo preparar?
Exemplo: n = 50
Para exibir qualquer número no intervalo de 0 a 50, preciso dos seguintes dígitos:
- Um zero, para exibir o número 0 ou qualquer outro número redondo
- Duas cópias dos dígitos 1, 2, 3 e 4, para exibir os números correspondentes
- Uma cópia dos dígitos 5, 6, 7 e 8, caso apareçam como dígito menos significativo no número
- O dígito 9 nunca é necessário, porque eu posso usar o dígito invertido 6
Total: 13 dígitos
Casos de teste (cada linha é um caso de teste no formato "entrada; saída")
0 1 1 2 9 9 11 10 50 13 99 17 100 18 135 19 531 22 1000 27 8192 34 32767 38
Respostas:
Geléia , 9 bytes
Experimente online!
Como funciona
fonte
0rDŒr€ẎQṪÞẎḟ9ĠẎL
.Python 2 , 49 bytes
Experimente online!
Uma fórmula aritmética desajeitada. Suponha que
n
se encaixe em umint
para que umL
não seja anexado.Agradecemos a Neil por salvar 5 bytes, apontando que 9 não sendo usados podem ser manipulados fazendo-o em
n*9+8
vez den*9+9
, para que, digamos,999*9+8=8999
não passe para 9000.fonte
33333
requer cinco 3, mas22222
requer apenas quatro.n*9
[0] é tentador, mas falha nos números que começam com1
e menos isso111..
.(n*9+8)/10**len(`n`)
para evitar o usomin
.Haskell ,
11711410895898887848263 bytes6 bytes salvos graças a Laikoni
146 bytes salvos graças a nimiExperimente online!
fonte
maximum[a,b]
é o mesmo quemax a b
. 2.) As compreensões de lista geralmente são mais curtas quefilter
:max d$sum[1|x<-show a,x==b]
g
com uma função literal pointfree:sum.(#[-9..])
.length[x|x<-...]
ésum[1|x<-...]
.g=
(mas talvez você queira incluí-lo na versão TIO).Mathematica, 49 bytes
fonte
JavaScript (ES6),
6053 bytesUma espécie de solução recursiva hacky. Isso gera os números que exigem a adição de um dígito:
e depois conta quantos são menores que a entrada. Por um feliz milagre, remover o dígito
9
na verdade remove vários bytes da função, porque a sequência pode ser gerada assim (assumindo a divisão inteira):Precisamos levar em conta o fato de que números abaixo de 10 ainda exigem zero, mas isso é tão simples quanto adicionar
n > 9 ? 0 : 1
ao resultado.Casos de teste
Mostrar snippet de código
fonte
n>9^1
Provavelmente, pode sern<10
true
informações0
, por isso estou um pouco hesitante em fazer isso.0>9
é falso,false^1
é 1 ...?true
no lugar do número1
.Lote, 67 bytes
Na formulação padrão desse problema, você precisa separar
6
e9
dígitos, mas não é necessário exibi-lo0
. À medida que o valor máximon
exigido aumenta, o número de numerais necessários aumenta toda vez que você alcança um repdigit (porque você não tem o suficiente desse número) e toda vez que você alcança uma potência de10
(quando você precisa de um zero extra). No total, cada potência de10
precisa de10
mais numerais do que a anterior, que pode ser calculada comofloor(log10(n))*10
. Para valoresn
entre potências de 10, o número de repdigits intermediários pode ser calculado comofloor(n/((10**floor(log10(n))*10-1)/9))
ou alternativamentefloor(n*9/(10**floor(log10(n))*10-1))
.Eu calculo
floor(log10(n))
por meio do loop na primeira linha. Cada vez,%2
ganha um extra0
e%3
ganha um extra-~
. Isso significa que10%2
é10*10**floor(log10(n))
e%30
éfloor(log10(n))
.A duplicação de
6
e9
tem dois efeitos: primeiro, existem apenas9
números necessários para cada potência de10
, e segundo, a detecção de repdigit precisa ignorar os9
repdigits. Felizmente, como são um a menos de 10, isso pode ser alcançado ajustando a fórmula para resultarfloor((n*9+8)/(10**floor(log10(n))*10))
.Lidar com o zero é razoavelmente simples: isso requer apenas um número extra quando
n<10
, iefloor(log10(n))==0
.fonte
Mathematica, 83 bytes
fonte
Python 3 , 75 bytes
Experimente online!
fonte
PHP , 60 bytes
Experimente online!
fonte