Convierte un número en una suma de dígitos
Sin ninguna suma: necesitamos la suma más corta
Sin dígitos: solo puede usar dígitos del número
Ejemplo
Se le dará como entrada un número enteron>0
Digamos Vamos n=27
. Debe expresar 27
como una suma , utilizando solo los dígitos [2,7]
, de la manera más corta posible. ¡No tiene que usar todos los dígitos del número dado!
Por lo tanto 27=2+2+2+7+7+7
. A continuación, tomamos esos dígitos y lo considero como : [2,2,2,7,7,7]
.
La respuesta final para n=27
es6
Un ejemplo más para n=195
obtener la suma más corta tenemos que usar los siguientes dígitos:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]
y la respuesta es23
El reto
Dado un número entero n>0
, genera el número mínimo de dígitos (contenido en el número) que suman este número
Casos de prueba
Input->Output
1->1
2->1
10->10
58->8
874->110
1259->142
12347->1765
123456->20576
3456789->384088
Este es el código de golf. ¡La respuesta más corta en bytes gana!
Respuestas:
Casco , 12 bytes
Maneja números de dos dígitos bastante rápido. Pruébalo en línea!
Explicación
fuente
Pyth , 12 bytes
Pruébalo en línea!
Desafortunadamente, errores de memoria en entradas tan grandes como
58
.Explicación
fuente
./
lef<.{TjQ;./
(filtro - subconjunto apropiado - de dígitos de entrada)Mathematica, 78 bytes
encuentra el último caso de prueba en 5 segundos
fuente
Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
R , 78 bytes
Pruébalo en línea! (versión golfizada)
Algoritmo de fuerza bruta puro, por lo que en realidad no resuelve todos los casos de prueba, y creo que trató de asignar 40,000 GB para el último caso de prueba ...
T
en R por defecto1
obtenemos un error off-by-one que corregimos en el paso de retorno, pero también obtenemosF
qué valores predeterminados a0
cuáles vale la pena.explicación no golfista:
Pruébalo en línea! (versión menos golfista)
fuente
Python 2,
168155144 bytesNo es lo más corto que podría ser, pero es el mejor primero y no es realmente malo, en tiempo de ejecución.
Elfilter(None...
es eliminar 0 como un dígito, lo que aprendí que podía hacer al hacer esto.El mayor problema son los marcos de pila de Python, que en realidad no me permiten ejecutar esto en las entradas más grandes. Por lo tanto, no es una solución válida, realmente, jugué con aumentar el límite de recursión que solo condujo a fallas seg. Esto debe hacerse con un bucle y una pila o con mucha más inteligencia para trabajar en Python.
editar: ¡Gracias a caird y Chas Brown por 13 bytes!
fuente
input
y requerir que la entrada esté entre comillas.filter(None,sorted(map(int,set(n)))[::-1])
consorted(set(map(int,n))-{0})[::-1]
(aunqueNone
es bastante bueno saberlo).filter(len,...)
para listas y cadenas yfilter(abs,...)
para enteros y flotantes.Casco , 13 bytes
Bastante ineficiente
Pruébalo en línea!
fuente
JavaScript (ES6), 82 bytes
Toma la entrada como una cadena.
fuente
1/0
?f=
al principio es una gran pista, ya que no lo necesitas para lambdas no recursivas.Ruby , 70 bytes
Muy lento, intente todas las combinaciones posibles aumentando el tamaño hasta llegar a una solución.
Gracias Dennis por Ruby 2.4 en TIO.
Pruébalo en línea!
fuente
Jalea , 23 bytes
Pruébalo en línea!
Esto es tan ineficiente que no se ejecuta para los casos de prueba después del tercero en TIO debido a un límite de tiempo> _ <
¡Cualquier consejo de golf es bienvenido!
fuente
Python 2 ,
183176172166161 bytesPruébalo en línea!
Más tiempo que la otra respuesta de Python, pero realiza todos los casos de prueba combinados más
987654321
en menos de un segundo en TIO.Aprovecha el hecho de que si
d1<d2
hay dígitos, entonces debe haber como máximod2-1
d1
's en la suma (ya que lasd2
instancias ded1
se pueden reemplazar pord1
instancias ded2
una suma más corta). Por lo tanto, al ordenar los dígitos en orden ascendente, hay "solo" en la mayoría de9! = 362880
las sumas posibles a considerar; y una profundidad máxima de recursión de9
(independientemente del valor den
).fuente
Haskell , 91 bytes
Pruébalo en línea! Ejemplo de uso:
f 58
rendimientos8
. Rápido para números de dos dígitos, horrendamente lento para entradas más grandes.La función
f
convierte el número de entradan
en una lista de dígitos mientras filtra los ceros. Luego, esta lista y enn
sí se entregan a la(#)
función, que devuelve una lista singleton.!!0
devuelve el elemento de esta lista singleton.(#)
utiliza listas simples y vacías como tipo de opción. Dada una entrada den=58
ys=[5,8]
, la idea es restar todos los dígitoss
den
, luego aplicar recursivamente(#)
y verificar qué dígito resultó en el número mínimo de pasos y devolver uno más este mínimo como resultado. La primera parte se calcula por(s#).(n-)=<<s
, que es lo mismo queconcat(map(s#)(map(n-)s))
. Entonces, en nuestro ejemplo, primero[58-5,58-8]
se calcula, seguido de lo[[5,8]#53,[5,8]#50]
que resulta en[[7],[7]]
o[7,7]
despuésconcat
. El resultado coincide con el patrónx:m
para asegurarse de que la lista tenga al menos un elemento (de lominimum
contrario, falla), luego se vuelve a ajustar la lista singleton de 1 más el mínimo del resultado. Sin
era un cero menor o la llamada recursiva devolvió una lista vacía, estamos en una rama fallida de la búsqueda y se devuelve una lista vacía. Sin==0
la rama tuvo éxito y[0]
se devuelve.Haskell , 101 bytes
Pruébalo en línea! Un enfoque mucho más eficiente, verifica todos los casos de prueba en menos de un segundo.
Esta vez, la lista de dígitos de la entrada se calcula en orden descendente, lo que permite
(#)
intentar usar el dígito más grande con la mayor frecuencia posible, luego el segundo más grande, y hasta que se encuentre una solución. La primera solución encontrada de esta manera también es la más pequeña.fuente