Converter um número em uma soma de dígitos
Nenhuma soma: precisamos da soma mais curta
Não há dígitos: você pode usar apenas dígitos do número
Exemplo
Você receberá como entrada um número inteiron>0
Vamos dizer n=27
. Você deve expressar 27
como uma soma , usando apenas os dígitos [2,7]
, da maneira mais curta possível. Você não precisa usar todos os dígitos do número especificado!
Então 27=2+2+2+7+7+7
. Em seguida, tome esses dígitos e contá-los : [2,2,2,7,7,7]
.
A resposta final para n=27
é6
Mais um exemplo para n=195
obter a soma mais curta , temos que usar os seguintes 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]
e a resposta é23
O desafio
Dado um número inteiro n>0
, imprima o número mínimo de dígitos (contidos no número) que somam esse número
Casos de teste
Input->Output
1->1
2->1
10->10
58->8
874->110
1259->142
12347->1765
123456->20576
3456789->384088
Este é o código-golfe . A resposta mais curta em bytes vence!
Respostas:
Casca , 12 bytes
Lida com números de dois dígitos bem rápido. Experimente online!
Explicação
fonte
Pitão , 12 bytes
Experimente online!
Infelizmente, erros de memória em entradas tão grandes quanto
58
.Explicação
fonte
./
lef<.{TjQ;./
(filtro - subconjunto adequado - de dígitos de entrada)Mathematica, 78 bytes
encontra o último caso de teste em 5 segundos
fonte
Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
R , 78 bytes
Experimente online! (versão para golfe)
Algoritmo de força bruta pura, para que ele não resolva todos os casos de teste, e acho que ele tentou alocar 40.000 GB para o último caso de teste ...
T
em R é padronizado para1
obter um erro de um por um que corrigimos na etapa de retorno, mas também obtemosF
quais padrões para os0
quais compensa.explicação ungolfed:
Experimente online! (versão menos golfe)
fonte
Python 2,
168155144 bytesNão é o mais curto possível, mas é o melhor primeiro e não é muito ruim, em termos de tempo de execução.
Ofilter(None...
é remover 0 como um dígito, o que eu aprendi que poderia fazer enquanto fazia isso.O maior problema são os quadros de pilha python, que realisticamente não me permitem executar isso nas maiores entradas. Então, não é uma solução válida, na verdade, eu brinquei com o aumento do limite de recursão, o que levou a seg-falhas. Isso precisa ser feito com um loop e uma pilha ou com muito mais inteligência para trabalhar em python.
edit: Obrigado a caird e Chas Brown por 13 bytes!
fonte
input
e exigir que a entrada esteja entre aspas.filter(None,sorted(map(int,set(n)))[::-1])
porsorted(set(map(int,n))-{0})[::-1]
(emboraNone
seja interessante saber sobre isso).filter(len,...)
para listas e seqüências de caracteres efilter(abs,...)
para números inteiros e flutuantes.Casca , 13 bytes
Bastante ineficiente
Experimente online!
fonte
JavaScript (ES6), 82 bytes
Recebe a entrada como uma sequência.
fonte
1/0
?f=
começo é uma grande pista, já que você não precisa dela para lambdas não-recursivas.Ruby , 70 bytes
Muito devagar, tente todas as combinações possíveis, aumentando o tamanho até chegarmos a uma solução.
Obrigado Dennis pelo Ruby 2.4 no TIO.
Experimente online!
fonte
Gelatina , 23 bytes
Experimente online!
Isso é tão ineficiente que não é executado nos casos de teste após o terceiro no TIO devido a um limite de tempo> _ <
Quaisquer dicas de golfe são bem-vindas!
fonte
Python 2 ,
183176172166 166161 bytesExperimente online!
Mais longo que a outra resposta Python, mas executa todos os casos de teste combinados mais
987654321
em menos de um segundo no TIO.Aproveita o fato de que, se houver
d1<d2
dígitos, é necessário que haja no máximod2-1
d1
na soma (uma vez qued2
instâncias ded1
podem ser substituídas pord1
instâncias ded2
uma soma menor). Assim, classificando os dígitos em ordem crescente, existem "apenas", no máximo,9! = 362880
somas possíveis a serem consideradas; e uma profundidade máxima de recursão de9
(independentemente do valor den
).fonte
Haskell , 91 bytes
Experimente online! Exemplo de uso:
f 58
rendimentos8
. Rápido para números de dois dígitos, terrivelmente lento para entradas maiores.A função
f
converte o número de entradan
em uma lista de dígitos enquanto filtra zeros. Em seguida, essa lista en
ela mesma são entregues à(#)
função, que retorna uma lista única.!!0
retorna o elemento dessa lista de singleton.(#)
usa listas singleton e vazias como tipo de opção. Dada uma entrada den=58
es=[5,8]
, a idéia é subtrair todos os dígitoss
den
, aplicar recursivamente(#)
e verificar qual dígito resultou no número mínimo de etapas e retornar um mais esse mínimo como resultado. A primeira parte é calculada por(s#).(n-)=<<s
, que é igual aconcat(map(s#)(map(n-)s))
. Portanto, em nosso exemplo, primeiro[58-5,58-8]
é calculado, seguido pelo[[5,8]#53,[5,8]#50]
resultado[[7],[7]]
ou[7,7]
depoisconcat
. O resultado é correspondido no padrãox:m
para garantir que a lista tenha pelo menos um elemento (minimum
falhará de outra forma); em seguida, a lista de singleton de 1 mais o mínimo do resultado será reajustada. E sen
era menor que zero ou a chamada recursiva retornou uma lista vazia, estamos em um ramo com falha da pesquisa e uma lista vazia é retornada. Sen==0
a ramificação foi bem-sucedida e[0]
é retornada.Haskell , 101 bytes
Experimente online! Uma abordagem muito mais eficiente, verifica todos os casos de teste em menos de um segundo.
Desta vez, a lista de dígitos da entrada é calculada em ordem decrescente, o que permite
(#)
tentar usar o maior dígito sempre que possível, depois o segundo maior e assim até que uma solução seja encontrada. A primeira solução encontrada dessa maneira também é garantida como a menor.fonte