Introdução
Seu objetivo é encontrar o menor número necessário para adicionar ou multiplicar para obter o valor de entrada, este é A005245 .
Entrada
Um número inteiro positivo N .
Saída
O menor número de aqueles que devem ser adicionados / multiplicados para obter N .
Entrada de amostra
7
Saída de amostra
6
Explicação
(
1
+1
+1
) * (1
+1
) +1
= 7Como isso requer
6
, a saída é6
Casos de teste
1 1
2 2
3 3
5 5
10 7
20 9
50 12
Como este é um desafio de código-golfe , o menor número de bytes vence.
code-golf
sequence
arithmetic
integer
expression-building
Spyrali Chyuu
fonte
fonte
f(x) != x.primeFactorisation().sum()
exceto 1?Respostas:
Python 2 ,
7470 bytesExperimente online!
Versão alternativa, 59 bytes (não verificado)
Isso funciona pelo menos até n = 1.000.000 , mas ainda tenho que provar que funciona para todos os n positivos .
Experimente online!
fonte
n=a*j+b
comb<j
, mas podemos precisarb>=j
?b>=j
eb>=a
. Mas você está certo, não é óbvio que isso não vai acontecer.a*b+c*d
coma,b,c,d
todas as expressões de soma e é muito eficiente.Geléia ,
1614 bytesObrigado Dennis por salvar 2 bytes!
Experimente online!
Explicação lógica
Dado um número n :
1
, a resposta é1
. De outra forma:A representação é
a + b
oua × b
, ondea
eb
são expressões.Considere todos os valores possíveis de
a
eb
:a + b
, entãoa
eb
está dentro do alcance[1 .. n-1]
.a × b
,a
eb
são divisores próprios den
maior do que1
.Nos dois casos, a lista
[[<proper divisors of n larger than 1>], [1, 2, ..., n-1]]
é calculada (ÆḌḊ,Ṗ
), mapeie o link atual sobre cada número߀€
, adicione os pares corretos (+U$
) e obtenha o valor mínimo (FṂo
).Explicação do código
fonte
JavaScript (ES6),
10896 bytesMuito ineficiente;
Array(n>>1)
acelera um pouco a um custo de um byte. Explicação:n%++i
é diferente de zero sei
não for um fator, o quen%++i/0
éInfinity
(e, portanto, verdadeiro e também definitivamente não é mínimo) sei
não é um fator, masNaN
(e, portanto, falso) sei
é um fator. Editar: salvou 12 bytes com inspiração em @ edc65.fonte
f(50)
mas infelizmente o Windows Update reiniciou o meu PC antes que ele pudesse terminar.a
matriz. Você não pode mesclar as avaliações nas 2 lambdas e tirar a min?(i+=2)
por outro,++i
então estou economizando 12 bytes no total, obrigado!Pari / GP , 66 bytes
Uma porta da resposta Python de Dennis :
Experimente online!
Pari / GP , 72 bytes
Mais longo, mas mais eficiente:
Experimente online!
fonte
f(n)=vecmin(concat(n,[f(j)+f(n\j)+f(n%j)|j<-[2..n-1]]))
.Pari / GP , 213 bytes
Edit: Eu fui severamente espancado .
Experimente online!
fonte
Python 2 , 181 bytes
Experimente online!
fonte
f
não deve ser anônima, pois se chama recursivamente.Wolfram Language (Mathematica) , 59 bytes
Economizou 3 bytes graças a Martin Ender. Usando a codificação CP-1252, onde
±
há um byte.Experimente online!
fonte
±
vez def
salva 3 bytes assumindo que a fonte seja codificado em CP 1252: tio.run/##y00syUjNTSzJTE78///QRkNbQ@tDG/PirWx9M/...Perl 5 , -p 78 bytes
79 bytes in old style counting (
+1
for-p
)O fato de o perl precisar usar um extra
$
para todo o acesso escalar realmente prejudica o comprimento dos campos de golfe que fazem muita aritmética ...Esse método é mais parecido com os outros já publicados (tente multiplicação e adição para criar um número de destino, pegue o mais barato). No entanto, ele não recua repetidamente para baixo, para que possa ser usado para entradas relativamente grandes.
Ele também não tenta minimizar o custo de construção de um número por adição ou multiparificação, porque o perl 5 não possui built-in
min
e a classificação numérica é muitooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ---- Em vez disso, assumo que, se um número é um fator do destino, usarei a multiplicação. Isso é seguro, pois, se, por exemplo,3
é um fator de12
(portanto, soma o custo de )3
e12/3
mais tarde, ele considerará o9=12-3
que não será um fator; portanto,9+3
com o mesmo custo que3+9
será tentado de qualquer maneira. No entanto, isso pode falhar para os destinos<= 4
(apenas para1
e2
). Adicionar$_
à lista para minimizar as correções. O que é lamentável, já que eu realmente não preciso disso para os casos base, porque eu já inicializei@;
com os valores iniciais adequados, por isso custa 3 bytes.Experimente online!
fonte