Número mínimo de números para sumar exactamente n

15

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 ( vectorpara C ++ o Java LinkedListestán permitidos), junto con nun parámetro opcional length, que especifica la longitud de la matriz.

También puede tomar la entrada como una cadena separada npor 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 10es 2( 7y 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.

TheCoffeeCup
fuente
He editado su especificación, porque generalmente permitimos los mismos métodos de E / S para funciones y programas; Vea el consenso aquí . Siéntase libre de retroceder si no está de acuerdo.
lirtosiast
¿Podemos enviar falsepara casos sin soluciones?
ETHproductions
@ETHproductions Claro, agregaré eso.
TheCoffeeCup
¿Considera la salida vacía falsey, ya que la cadena vacía es falsey en Pyth?
lirtosiast
@ThomasKwa No me gustan las salidas de cadenas vacías, pero puede incluir eso como "si se permitiera x ..." en su respuesta ...
TheCoffeeCup

Respuestas:

7

Pyth, 12 11 bytes

lhafqsTQyEY

Esto toma ncomo la primera línea de entrada y la lista en la segunda línea.

lhafqsTQyEY     (Implicit: Q = 1st line of input; E = 2nd line)
         E      The list
        yE      Powerset (sorted by increasing length; empty set first)
   f            Filter by lambda T:
     sT         sum(T)
    q                  ==
       Q                  Q
   fqSTQyE      Sublists that sum to Q, sorted by increasing length
  a       Y     append an empty array (in case none match)
lh              take the length of the first element (0 for empty array)

Pruébalo aquí .

lirtosiast
fuente
1
Su código y su explicación no coinciden.
isaacg
@isaacg Ahora corregido.
lirtosiast
5

Japt , 30 21 18 bytes

Resulta que había un método mucho más eficiente. ;)

Uà f_x ¥V} ml n- g

¡Pruébalo en línea! (Nota: n-se ha cambiado a n@X-Y}por razones de compatibilidad)

Esto toma la entrada como una matriz separada por comas o espacios, seguida de un número. Salidas undefinedpara casos de prueba sin soluciones.

Uà f_  x ¥ V} ®   l} n- g
UàfmZ{Zx ==V} mZ{Zl} n- g

            // Implicit: U = input array, V = input integer
Uà fZ{   }  // Generate all possible combinations of U, then filter to only items Z where
Zx ==V      //   the sum of Z is equal to V.
mZ{Zl}      // Map each remaining combination to its length.
n-          // Sort by subtraction; smaller items end up in the front.
g           // Take the first item.
            // Implicit: output last expression

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í:

  • A Ual 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:

à f_x ¥VÃml n g

¡Pruébalo en línea!

ETHproductions
fuente
Son 25 bytes, no 21.
Albert Renshaw
1
@AlbertRenshaw Japt admite la codificación IEC_8859-1 , bajo la cual cada uno de estos caracteres tiene 1 byte. Puede guardar este programa como un archivo de texto con codificación IEC_8859-1 y luego subirlo al intérprete en línea .
ETHproductions
¡Oh bien! Gracias por informarme
Albert Renshaw
1

Mathematica, 73 65 bytes

Min[Length/@Select[IntegerPartitions[#2,#2,#],Sort@#==Union@#&]]&

Función pura, regresa si no hay solución.

LegionMammal978
fuente
1

Python 3, 128 bytes

Esto no es tan divertido como me gustaría, pero trabajaré en ello más tarde.

from itertools import*
def s(a,n):
 for i in range(len(a)):
  for j in permutations(a,i+1):
   if sum(j)==n:return i+1
 return 0
Sherlock9
fuente
1

Mathematica, 45 bytes

Min@Cases[Subsets@#,i_/;Tr@i==12:>Length@#2]&
alephalpha
fuente
1

CJam, 34 bytes

0q~_,2,m*\f.*{:+1$=},\;0f-{,}$0=,+

Pruébalo en línea . El formato de entrada es la suma seguida de la lista de valores, por ejemplo:

18102 [143 1623 1646 16336 1624 983 122]

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:

0       Push 0 result for exception case.
q~      Get and interpret input.
_,      Copy and get length of input value list.
2,      Push [0 1].
m*      Cartesian power. This generates all possible lists of 0/1 values with the
        same length as the input value list.
\       Swap input value list to top.
f.*     Apply element-wise product of input value list with all 0/1 lists.
        We now have all combinations of values, with 0 in place of unused values.
{       Start filter block.
  :+      Sum values.
  1$      Copy target sum to top.
  =       Compare.
},      Filter.
\;      Swap target sum to top and discard.
0f-     Remove 0 values. We now have all solution lists.
{,}$    Sort by length.
0=      Get first solution, which after sorting is the shortest.
        This will raise an exception if the list of solutions is empty, bailing
        out with the initial 0 on the stack.
,       Get length of solution.
+       Add the 0 we initially pushed for the exception case.
Reto Koradi
fuente
1

JavaScript (ES6), 84 bytes

f=(a,n,m=1e999,x)=>n&&a.map((v,i)=>(x=[...a],x.splice(i,1),x=f(x,n-v)+1)<m?m=x:0)&&m

Explicación

Toma una Arrayde Numbers y una Numbercomo argumentos. Devuelve un número de Infinitysi no hay resultado. Es una función recursiva que resta ny elimina cada elemento de la matriz uno por uno hasta n == 0.

f=(a,n,m=1e999,x)=> // m and x are not passed, they are here to declare them in the local
                    //     scope instead of globally, initialise m to Infinity
  n&&               // if n == 0, return 0
  a.map((v,i)=>     // iterate over each number in a
    (x=[...a],      // x = copy of a
    x.splice(i,1),  // remove the added number from the array
    x=f(x,n-v)+1)   // x = result for the numbers in this array
      <m?m=x:0      // set m to minimum result
  )
  &&m               // return m

Prueba

Esta prueba se establece men Infinitymás tarde en lugar de como un argumento predeterminado para que funcione en Chrome (en lugar de solo Firefox).

usuario81655
fuente
1

Haskell, 72 bytes

import Data.List
n#l=head$sort[length x|x<-subsequences l,sum x==n]++[0]

Devuelve 0si 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 lque tienen una suma de n. 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 .

nimi
fuente