Necesito preparar dígitos hechos de cartón para mostrar algún número ( ejemplo ). No sé de antemano qué número debo mostrar, lo único que sé es que no es mayor que n
.
¿Cuántos dígitos de cartón debo preparar?
Ejemplo: n = 50
Para mostrar cualquier número en el rango 0 ... 50, necesito los siguientes dígitos:
- Un cero, para mostrar el número 0, o cualquier otro número redondo
- Dos copias de los dígitos 1, 2, 3 y 4, para mostrar los números correspondientes.
- Una copia de los dígitos 5, 6, 7 y 8, para el caso aparecen como dígitos menos significativos en el número
- El dígito 9 nunca es necesario, porque puedo usar el dígito invertido 6 en su lugar
Total: 13 dígitos
Casos de prueba (cada línea es un caso de prueba en el formato "entrada; salida")
0 1 1 2 9 9 11 10 50 13 99 17 100 18 135 19 531 22 1000 27 8192 34 32767 38
Respuestas:
Jalea , 9 bytes
Pruébalo en línea!
Cómo funciona
fuente
0rDŒr€ẎQṪÞẎḟ9ĠẎL
.Python 2 , 49 bytes
Pruébalo en línea!
Una fórmula aritmética torpe. Suponga que
n
encaja dentro de unint
para queL
no se agregue un.Gracias a Neil por guardar 5 bytes al señalar que los 9 que no se usan podrían manejarse haciendo en
n*9+8
lugar den*9+9
, por lo que, por ejemplo,999*9+8=8999
no se transfiere a 9000.fuente
33333
requiere cinco 3 pero22222
solo cuatro.n*9
[0] es tentador, pero falla para los números que comienzan con1
y menos111..
.(n*9+8)/10**len(`n`)
para evitar usarmin
.Haskell ,
11711410895898887848263 bytes6 bytes guardados gracias a Laikoni
146 bytes guardados gracias a nimiPruébalo en línea!
fuente
maximum[a,b]
es lo mismo quemax a b
. 2.) Las comprensiones de la lista son a menudo más cortas quefilter
:max d$sum[1|x<-show a,x==b]
g
con un literal de la función pointfree:sum.(#[-9..])
.length[x|x<-...]
essum[1|x<-...]
.g=
(pero tal vez desee incluirlo en la versión TIO).Mathematica, 49 bytes
fuente
JavaScript (ES6),
6053 bytesUna especie de solución recursiva hacky. Esto genera los números que requieren agregar un dígito:
y luego cuenta cuántos son menos que la entrada. Por un milagro feliz, eliminar el dígito en
9
realidad elimina varios bytes de la función, porque la secuencia se puede generar así (suponiendo una división de enteros):Tenemos que tener en cuenta el hecho de que los números menores de 10 todavía requieren el cero, pero esto es tan simple como sumar
n > 9 ? 0 : 1
al resultado.Casos de prueba
Mostrar fragmento de código
fuente
n>9^1
probablemente puede sern<10
true
información0
, así que dudo un poco en hacerlo.0>9
es falso,false^1
es 1 ...?true
en lugar del número1
.Lote, 67 bytes
En la formulación estándar de este problema, necesita separar
6
y9
dígitos, pero no es necesario que lo muestre0
. A medidan
que aumenta el valor máximo requerido, la cantidad de números requeridos aumenta cada vez que alcanza un repdigit (porque no tiene suficiente de ese número) y cada vez que alcanza una potencia de10
(cuando necesita un cero adicional). En total, cada potencia10
necesita10
más números que la anterior, que se pueden calcular comofloor(log10(n))*10
. Para valores den
entre potencias de 10, el número de dígitos intermedios intermedios se puede calcular comofloor(n/((10**floor(log10(n))*10-1)/9))
o alternativamentefloor(n*9/(10**floor(log10(n))*10-1))
.Calculo
floor(log10(n))
por medio del bucle en la primera línea. Cada vez,%2
gana un extra0
y%3
gana un extra-~
. Esto significa que10%2
es10*10**floor(log10(n))
y%30
esfloor(log10(n))
.La duplicación de
6
y9
tiene dos efectos: en primer lugar, solo se9
requieren números para cada potencia10
y, en segundo lugar, la detección de repdigits debe ignorar los9
repdigits. Afortunadamente, como son menos de una potencia de 10, esto se puede lograr ajustando la fórmula para obtenerfloor((n*9+8)/(10**floor(log10(n))*10))
.Tratar con el cero es razonablemente simple: esto solo requiere un número adicional cuando
n<10
, es decirfloor(log10(n))==0
.fuente
Mathematica, 83 bytes
fuente
Python 3 , 75 bytes
Pruébalo en línea!
fuente
PHP , 60 bytes
Pruébalo en línea!
fuente