instruções
Escreva um programa que, dado um número inteiro de entrada n ( n >= 0
), produz o menor número inteiro positivo m onde:
n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
a
eb
são seqüências finitas do mesmo comprimento- todos os elementos de
a
são menores quem
- todos os elementos de
b
são menores quem
- todos os elementos de
a
são diferentes e inteirosa[x] >= 0
- todos os elementos de
b
são diferentes e inteirosb[x] >= 0
a[x]
eb[x]
não são ambos 0 (já que 0 ^ 0 é indeterminado)
Isso é código-golfe , e o menor número de bytes vence.
Exemplos
In 0 -> Out 1
Possible Sum:
In 1 -> Out 2
Possible Sum: 1^0
In 2 -> Out 3
Possible Sum: 2^1
In 3 -> Out 3
Possible Sum: 2^1 + 1^0
In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1
In 16 -> Out 5
Possible Sum: 2^4
In 17 -> Out 4
Possible Sum: 3^2 + 2^3
In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3
In 24 -> Out 5
Possible Sum: 4^2 + 2^3
In 27 -> Out 4
Possible Sum: 3^3
In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0
code-golf
number
arithmetic
kukac67
fonte
fonte
m<2
entãom<3
entãom<4
etc. até encontrar uma soma igualn
. Além disso, pensei em ter a soma0
como sem termos, mas qual é o resultado? m>?n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k]
.a
eb
são seqüências finitas de comprimento0
, então não há um número inteirom
que não satisfaça as restrições e, como não há um número inteiro menor, a resposta não é definida. As possíveis correções seriam pedir o menor número naturalm
(nesse caso, você deve alterar a resposta esperada para lá0
) ou o menor número inteiro positivom
.Respostas:
GolfScript (59 caracteres)
Demonstração online
Isso usa recursão para enumerar os valores alcançáveis para um dado
m
e pesquisa o primeirom
que funciona. É levemente inspirado pela resposta do xnor, mas bastante diferente na implementação.Dissecação
fonte
Python, 120
A função
f
é uma função auxiliar que verifica se nãon
pode ser expressa como uma soma de potências com bases distintas e expoentes de . Ele usa uma estratégia recursiva natural: deve ser diferente de zero, e tentamos todas as opções possíveis de base e expoente e todas elas precisam falhar. Nós os removemos das listas permitidas e diminuímos na quantidade correspondente.A
B
n
n
A função
g
é a função principal. Ele procura por umm
que funcione.M
é o conjunto de valores permitidos atém-1
. Removemos0
dos expoentes permitidos para parar0**0
(que o Python avalia como 1) de serem usados. Isso não machuca nada, porque0**x
é inútil0
para todos os outrosx
.fonte
n and all()
paran*all()
.Python 2, 138 bytes
(Obrigado a @Jakube por todas as dicas)
Nunca aprendi tanto sobre o
itertools
módulo quanto aprendi com essa pergunta. O último caso leva cerca de um minuto.Começamos pesquisando
m = 1
e incrementando até obtermos uma solução. Para verificar uma solução, iteramos sobre:k = 0 to m-1
, ondek
é o número de termos na solução[0, 1, ... m-1]
com tamanhok
), somando e verificando se temosn
Observe que iteramos
k
atém-1
- mesmo que osm
termos tecnicamente sejam possíveis no total, sempre há uma solução comm-1
termos que0^0
não são permitidos e0^b
não contribui com nada. Isso é realmente importante porque0^0
é tratado como 1 pelo Python, o que parece ser um problema, mas acaba não importando!Aqui está o porquê.
Suponha que uma solução encontrada erroneamente use
0^0
como 1, por exemplo3^2 + 1^1 + 0^0 = 11
. Como geramos apenasm-1
termos, deve haver algunsj
que não estamos usando como base (aquij = 2
). Podemos trocar a base 0 paraj
obter uma solução válida aqui3^2 + 1^1 + 2^0 = 11
.Se tivéssemos iterado todos os
m
termos, poderíamos ter obtido soluções incorretas comom = 2
paran = 2
, via0^0 + 1^1 = 2
.fonte
imap(pow,C,D) ... for C,D in
itertools
enquanto falamos: PI já tem outra economia -tee
.imap
, quando houvermap
? -1 bytetee
já én=2
. Salva 2 bytes.map
com mais de uma iterável e, de fato, essa pergunta trouxe muitas novidades para mim.GolfScript (
9084 bytes)Demonstração online
Dissecação
O truque mais elegante é o tratamento do caso especial
0
.fonte
Haskell,
143130Exemplo de uso:
p 23
->6
.Esta é uma pesquisa simples de força bruta. Para todas as listas,
[0..0], [0..1], [0..2] ... [0..∞]
pegue todos os segmentos iniciais das permutações (por exemplo, [0..2]: permutações:,[012], [102], [210], [120], [201], [021]
segmentos iniciais da 1ª permutação:[0], [01], [012]
2ª:[1], [10], [102]
etc.). Para cada combinação de 2 dessas listas, calcule a soma dos poderes. Pare quando o primeiro for igual a n.fonte
>>=
vez deconcatMap
. eles são iguais, mas com os argumentos invertidos.Python: 166 caracteres
Explicação
A função
f
cria todos os números possíveis, que podem ser expressos como a soma das potências de números emr
. Se começa comr = [0]
. Se qualquer um desses números inteiros for igual an
, ele retornará o comprimento der
, caso contrário, ele se chamará recursivamente com um estendidor
.O cálculo de todos os números inteiros, que podem ser expressos como soma, é feito com dois loops. O primeiro loop é o
for j in r
, que nos diz o tamanho da expressão (2 ^ 3 + 1 ^ 2 tem comprimento 2). O loop interno itera sobre todas as combinações de permutaçõesr
de comprimentoj
. Para cada eu calculo a soma dos poderes.fonte
JavaScript (ES6) 219
224Função recursiva. Começando com m = 1, tento todas as combinações de número inteiro 1..m para bases e 0..m para expoentes (a base 0 é inútil, dado 0 ^ 0 == indefinido).
Se nenhuma solução for encontrada, aumente me tente novamente.
Caso especial para a entrada 0 (na minha opinião, isso é um erro nas especificações de qualquer maneira)
A função C gera recursivamente todas as combinações de uma matriz de determinado comprimento, para que
O terceiro nível
every
é usado para compactar a matriz a de bases eb de expoentes (não házip
função no JavaScript). Usandoevery
para parar cedo quando houver uma solução que não esteja usando todos os elementos nas duas matrizes.Teste no console do FireFox / FireBug
Resultado
fonte