Primera pregunta aquí, no me grites si esto es un duplicado o un mal desafío.
Introducción
Pensé en este desafío yo mismo, y parece ser un buen rompecabezas básico para los golfistas principiantes. También podría ayudarme a decidir qué lenguaje de golf de código aprender.
Desafío
Dada una matriz de enteros que son menores o iguales que n
, generar o devolver el número mínimo de números de la matriz que suman exactamente n
.
Puede elegir escribir una función o un programa completo.
Entrada
Puede asumir con seguridad 0 <= n < 2^31
.
Tome una matriz o lista de cualquier tipo ( vector
para C ++ o Java LinkedList
están permitidos), junto con n
un parámetro opcional length
, que especifica la longitud de la matriz.
También puede tomar la entrada como una cadena separada n
por espacios, separada por una coma o un espacio:
1 5 7 3 7 3 6 3 2 6 3,10
1 5 7 3 7 3 6 3 2 6 3 10
Si es más fácil.
Salida
Imprima o devuelva el número mínimo de números de la matriz que suman exactamente n
. Usando el ejemplo anterior:
1 5 7 3 7 3 6 3 2 6 3,10
Su programa debe imprimir:
2
porque el número mínimo de números que suman 10
es 2
( 7
y 3
).
En el caso de que no haya solución, imprima o devuelva un negativo, 0
"Sin solución" (aunque eso no sería inteligente), ∞
(como se sugiere) o cualquier otro valor falso, con la excepción de una cadena vacía.
Ejemplo de entrada y salida
Entrada:
1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12
Salida:
2
3
-1
Puntuación
Este es el código de golf, por lo que gana el código más corto en bytes.
La respuesta principal será aceptada en Navidad.
fuente
false
para casos sin soluciones?Respuestas:
Pyth,
1211 bytesEsto toma
n
como la primera línea de entrada y la lista en la segunda línea.Pruébalo aquí .
fuente
Japt ,
302118 bytesResulta que había un método mucho más eficiente. ;)
¡Pruébalo en línea! (Nota:
n-
se ha cambiado an@X-Y}
por razones de compatibilidad)Esto toma la entrada como una matriz separada por comas o espacios, seguida de un número. Salidas
undefined
para casos de prueba sin soluciones.No puedo creer que no pensé en esta versión cuando originalmente escribí esto ...
Desde entonces se han realizado varias optimizaciones que son útiles aquí:
U
al comienzo del programa generalmente se puede omitir.Ã
es un acceso directo para}
.n
ahora ordena los números correctamente por defecto.Cada uno de estos despega un byte, para un total de 15:
¡Pruébalo en línea!
fuente
Mathematica,
7365 bytesFunción pura, regresa
∞
si no hay solución.fuente
Python 3, 128 bytes
Esto no es tan divertido como me gustaría, pero trabajaré en ello más tarde.
fuente
Mathematica, 45 bytes
fuente
CJam, 34 bytes
Pruébalo en línea . El formato de entrada es la suma seguida de la lista de valores, por ejemplo:
Tenga en cuenta que esto generará una excepción si no se encuentra una solución. La excepción se aplica a stderr cuando CJam se ejecuta desde la línea de comandos y el resultado correcto (
0
) todavía se imprime en stdout. Entonces esto cumple con el consenso establecido en ¿Debería permitirse que las presentaciones salgan con un error?El código puede parecer más largo de lo que cabría esperar. La razón principal es que CJam no tiene una función incorporada para generar combinaciones. O al menos esa es mi excusa, y me apego a ella.
Explicación:
fuente
JavaScript (ES6), 84 bytes
Explicación
Toma una
Array
deNumber
s y unaNumber
como argumentos. Devuelve un número deInfinity
si no hay resultado. Es una función recursiva que restan
y elimina cada elemento de la matriz uno por uno hastan == 0
.Prueba
Esta prueba se establece
m
enInfinity
más tarde en lugar de como un argumento predeterminado para que funcione en Chrome (en lugar de solo Firefox).Mostrar fragmento de código
fuente
Haskell, 72 bytes
Devuelve
0
si no hay solución.Ejemplo de uso:
10 # [1,5,7,3,7,3,6,3,2,6,3]
->2
.Encuentre todas las sublistas de la lista de entrada
l
que tienen una suma den
. Toma la longitud de cada sublista y ordena. Añadir un0
y toma el primer elemento.Si se permite que una lista unitaria para la salida, por ejemplo
[2]
, podemos ahorrar 7 bytes:n#l=minimum[length x|x<-subsequences l,sum x==n]
. En caso de que no haya solución,[]
se devuelve la lista vacía .fuente