Número mínimo de números para somar exatamente n


15

Primeira pergunta aqui, não grite comigo se isso for uma duplicata ou um mau desafio.

Introdução

Eu mesmo pensei nesse desafio e parece ser um bom quebra-cabeça básico para jogadores iniciantes de código. Também pode me ajudar a decidir qual idioma do código de golfe aprender.

Desafio

Dada uma matriz de números inteiros menores ou iguais a n, produza ou retorna o número mínimo de números da matriz que somam exatamente n.

Você pode optar por escrever uma função ou um programa completo.

Entrada

Você pode assumir com segurança 0 <= n < 2^31.

Pegue uma matriz ou lista de qualquer tipo ( vectorpara C ++ ou Java é LinkedListpermitido), junto com ne um parâmetro opcional length, que especifica o comprimento da matriz.

Você também pode considerar a entrada como uma sequência separada npor espaço, separada por vírgula ou espaço:

1 5 7 3 7 3 6 3 2 6 3,10

1 5 7 3 7 3 6 3 2 6 3 10

se for mais fácil.

Resultado

Saída ou retorne o número mínimo de números da matriz que somam exatamente n. Usando o exemplo acima:

1 5 7 3 7 3 6 3 2 6 3,10

Seu programa deve imprimir:

2

porque o número mínimo de números que soma 10é 2( 7e 3).

No caso de não haver solução, imprima ou retorne um negativo, 0"Nenhuma solução" (embora isso não seja inteligente), ∞(como sugerido) ou qualquer outro valor falso, com exceção de uma sequência vazia.

Exemplo de entrada e saída

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

Resultado:

2
3
-1

Pontuação

Isso é código-golfe, então o código mais curto em bytes vence.

A resposta principal será aceita no Natal.


Editei suas especificações, porque geralmente permitimos os mesmos métodos de E / S para funções e programas; veja o consenso aqui . Sinta-se à vontade para reverter se não concorda.
— lirtosiast

Podemos produzir falsepara casos sem soluções?
— ETHproductions

@ETHproductions Claro, acrescentará isso.
— TheCoffeeCup

Você considera a saída vazia falsey, já que a string vazia é falsey em Pyth?
— lirtosiast

@ThomasKwa Eu não gosto de saídas de string vazias, mas você pode incluí-lo como "se x foi permitido ..." em sua resposta ...
— TheCoffeeCup 10/15 /

Respostas:


7

Pitão, 12 11 bytes

lhafqsTQyEY

Isso leva ncomo a primeira linha de entrada e a lista na segunda linha.

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)

Experimente aqui .


1
Seu código e sua explicação não coincidem.
— Isaacg

@isaacg Agora corrigido.
— lirtosiast

5

Japonês , 30 21 18 bytes

Acontece que havia um método muito mais eficiente. ;)

Uà f_x ¥V} ml n- g

Teste online! (Nota: n-foi alterado para n@X-Y}por motivos de compatibilidade)

Isso recebe a entrada como uma matriz separada por espaço ou vírgula, seguida por um número. Saídas undefinedpara casos de teste sem soluções.

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

Não acredito que não pensei nessa versão quando escrevi originalmente ...

Várias otimizações foram feitas desde então, que são úteis aqui:

  • A Uno início do programa geralmente pode ser deixada de fora.
  • Ãé um atalho para } .
  • n agora classifica os números corretamente por padrão.

Cada um deles retira um byte, totalizando 15:

à f_x ¥VÃml n g

Teste online!


Isso é 25 bytes, não 21. #
— 558 Albert Renshaw

1
O @AlbertRenshaw Japt suporta a codificação IEC_8859-1 , na qual cada um desses caracteres tem 1 byte. Você pode salvar este programa como um arquivo de texto codificado em IEC_8859-1 e carregá-lo no intérprete online .
— ETHproductions

Ah legal! Obrigado por me informar
— Albert Renshaw

1

Mathematica, 73 65 bytes

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

Função pura, retorna ∞se não houver solução.


1

Python 3, 128 bytes

Isso não é tão divertido quanto eu gostaria, mas vou trabalhar nisso mais 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

1

Mathematica, 45 bytes

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

1

CJam, 34 bytes

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

Experimente online . O formato de entrada é a soma seguida pela lista de valores, por exemplo:

18102 [143 1623 1646 16336 1624 983 122]

Observe que isso gerará uma exceção se nenhuma solução for encontrada. A exceção vai para stderr quando o CJam é executado na linha de comando e o resultado correto (0 ) ainda é impresso no stdout. Portanto, isso atende ao consenso estabelecido em Deve-se permitir que os envios saiam com erro?

O código pode parecer mais longo do que o esperado. O principal motivo é que o CJam não possui built-in para gerar combinações. Ou pelo menos essa é a minha desculpa, e eu estou cumprindo.

Explicação:

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.

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

Explicação

Toma um Arrayde se Numberum Numbercomo argumentos. Retorna um número de Infinityse nenhum resultado. É uma função recursiva que subtrai ne remove cada elemento da matriz, um por um, até 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

Teste

Esse teste é definido mcomo Infinitymais tarde, em vez de como um argumento padrão, para fazê-lo funcionar no Chrome (em vez de apenas no Firefox).


1

Haskell, 72 bytes

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

Retorna 0se não houver solução.

Exemplo de uso: 10 # [1,5,7,3,7,3,6,3,2,6,3]-> 2.

Encontre todas as sub-listas da lista de entrada lcom uma soma de n. Pegue o comprimento de cada sub-lista e classifique. Anexar um0 e pegue o primeiro elemento.

Se uma lista de singleton é permitido para a saída, por exemplo [2], podemos salvar 7 bytes: n#l=minimum[length x|x<-subsequences l,sum x==n]. No caso de não haver solução, a lista vazia []é retornada.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.