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 ( vector
para C ++ ou Java é LinkedList
permitido), junto com n
e um parâmetro opcional length
, que especifica o comprimento da matriz.
Você também pode considerar a entrada como uma sequência separada n
por 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
( 7
e 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.
fonte
false
para casos sem soluções?Respostas:
Pitão,
1211 bytesIsso leva
n
como a primeira linha de entrada e a lista na segunda linha.Experimente aqui .
fonte
Japonês ,
302118 bytesAcontece que havia um método muito mais eficiente. ;)
Teste online! (Nota:
n-
foi alterado paran@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
undefined
para casos de teste sem soluções.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:
U
no 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:
Teste online!
fonte
Mathematica,
7365 bytesFunção pura, retorna
∞
se não houver solução.fonte
Python 3, 128 bytes
Isso não é tão divertido quanto eu gostaria, mas vou trabalhar nisso mais tarde.
fonte
Mathematica, 45 bytes
fonte
CJam, 34 bytes
Experimente online . O formato de entrada é a soma seguida pela lista de valores, por exemplo:
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:
fonte
JavaScript (ES6), 84 bytes
Explicação
Toma um
Array
de seNumber
umNumber
como argumentos. Retorna um número deInfinity
se nenhum resultado. É uma função recursiva que subtrain
e remove cada elemento da matriz, um por um, atén == 0
.Teste
Esse teste é definido
m
comoInfinity
mais tarde, em vez de como um argumento padrão, para fazê-lo funcionar no Chrome (em vez de apenas no Firefox).Mostrar snippet de código
fonte
Haskell, 72 bytes
Retorna
0
se 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
l
com uma soma den
. 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.fonte