Embora tenham sido feitos desafios relacionados , este é diferente para justificar sua própria pergunta.
Desafio
Dado um número inteiro positivo, retorne a sequência mais longa de números inteiros positivos consecutivos cuja soma é o número inteiro fornecido. Se essa sequência não existir, você poderá relatar um erro da maneira que for mais apropriada para o seu idioma, inclusive retornando um valor falso ou lançando uma exceção.
Casos de teste
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (observe que [9] não é uma resposta válida) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (observe que [51, 53] não é uma resposta válida)
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence.
Respostas:
Haskell,
6765636258 bytesGuardado 4 bytes graças a Julian Wolf
Experimente online!
I verificar se o número pode ser expresso como ele diferença de dois quadrados:
m^2-n^2
. Posso, então, construir a lista de números ímpares consecutivos:[2n+1,2n+3...2m-1]
. Observe que, como o mínimon
é escolhido, a lista mais longa será exibidafonte
x
para os doisn
em
Python 2 ,
6662 bytesSai com um RuntimeError (profundidade máxima de recursão excedida) se não houver solução.
Experimente online!
fonte
Geléia ,
1110 bytes-1 byte graças a Dennis (use o intervalo implícito de
Ẇ
- substituaRm2Ẇ
porẆḤ’
)Um link monádico retornando uma lista dos summands, se possível, ou
0
não.Experimente online!
Quão?
fonte
ẆḤ’
salva um byte.JavaScript (ES7),
87868581 bytesRetorna uma lista delimitada por vírgulas de números inteiros ou
0
se não houver solução.Quão?
Primeiro, procuramos o menor quadrado perfeito s de modo que x = n + s seja outro quadrado perfeito.
Se s existir, n é a diferença x - s de 2 quadrados perfeitos, que pode ser escrita como a diferença de 2 seqüências de números ímpares consecutivos. Em seguida, criamos a lista resultante.
Exemplo:
Para n = 104 :
Encontramos s = 11² = 121 que satisfaz x = n + s = 225 = 15²
Então:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29
Mostrar snippet de código
fonte
n^2
sempre é igual à soma dos primeirosn
números ímpares?05AB1E ,
98 bytes-1 byte graças a Emigna
Explicação:
Na entrada inválida, não gera nada.
Experimente online!
fonte
ʒOQ}
em vez deDO¹QÏ
salvar um byte.Haskell ,
6160 bytesGraças a @maple_shaft por cortar 1 byte
Experimente online!
Usa o fato de que a execução mais longa será sempre a que começa com o número mais baixo.
Eu queria fazer algo com aritmética em vez de força bruta
k
, masfromInteger
parece matá-lo.fonte
[1,3..n]
para[1,3..]
r?n=[r,r+2..n]
. Experimente online!Python , 67 bytes
Experimente online!
Copiei minha resposta do desafio de soma consecutivo anterior e mudei
+1
para+2
. Quem sabia que o código do golfe poderia ser tão modular?Uma estratégia estranhamente direta: procure o intervalo
R
com a soma desejada.R
.Como a extremidade inferior do intervalo apenas aumenta, intervalos maiores são encontrados antes dos menores. Se nenhum intervalo possível puder ser encontrado, termina com IndexError.
fonte
JavaScript (ES6),
6564 bytesRetorna uma matriz se houver uma solução ou 0 para nenhuma solução.
Esta é uma solução altamente ineficiente e eficaz para o problema.
Ele procura a primeira solução usando
a-i
ei=1
, mesmo que não funcione na pilha recursiva. Se essa solução não começari+2
, procuraremos recursivamente a primeira solução usandoa
ei+2
.Ungolfed
Casos de teste:
Mostrar snippet de código
Para ter uma idéia de como isso é ineficiente, a solução
f(104)
requer 69.535 chamadas recursivas. A pilha nunca tem mais de 51 níveis de profundidade, portanto não há problema com o estouro da pilha.A solução
f(200)
requer 8,6 milhões de chamadas recursivas, com uma pilha de 99 níveis de profundidade. (Sua solução é[11,13,15,17,19,21,23,25,27,29]
.)Aqui está uma representação visual do programa em execução:
Mostrar snippet de código
fonte
Python 2.7,
10910897 bytes11 bytes abaixo, Graças a Erik, o Outgolfer.
Este é o meu primeiro código de golfe!
Como funciona
Eu usei a identidade bem conhecida que
1 + 3 + 5 + ... + (2n - 1) = n²
Veja o caso de
15
Em geral, se houver x termos a partir de
2n + 1
, comoÉ igual a
2nx + x²
Se
N
for o número inteiro de entrada, o problema reduz para encontrar o máximo, dex
modo queÉ uma equação quadrática com solução
A sequência mais longa é aquela com a maior
x
. O programa iteran
de0
paraN
e, quando descobre quex
é um número inteiro, cria uma lista(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
e a retorna.fonte
Python 3,
19081 bytesObrigado a @ovs e @ musicman523
fonte
print
está faltando parêntesesl.append(i)
usando simplesmentel+[i]
a chamada recursiva. Você pode removerl.pop(0)
usandol[1:]
a chamada recursiva. Você pode remover a chamada parac
a parte inferior usando argumentos de palavra-chave. Você pode remover>0
na linha 2. Finalmente, você pode alterar suas instruçõesif
eelse
em expressões, usando o formato ternário, que reduz a 92 bytes como uma expressão lambda. Experimente online!i
para chegar a um total de 81 bytes .sum(l)>q else
paraq<sum(l)else
salvar 1 byte.QBIC , 47 bytes
Isso tenta contar todos os números ímpares de um até sua soma ser
n
. Se passarn
, redefina o loop, aumente 1 para 3 e tente novamente. Saia, imprima 0, se, no início do loop, nosso número> n
.Explicação
fonte
R , 90 bytes
Experimente online!
Usa uma função recursiva que testa a soma acumulada da sequência de y: x convertida em uma sequência numérica ímpar. y é incrementado em cada recursão até exceder x. A primeira sequência que somar ao destino será retornada.
fonte
Python 2 , 89 bytes
Uma função sem nome que pega um número inteiro positivo
n
, e retorna o resultado, se existir, e gera um valorIndexError
diferente.Experimente online!
Cria uma lista de todos os números ímpares relevantes com os
r(1,n+1,2)
quais érange(start=1, stop=n+1, step=2)
; cria todas as sub-fatias relevantes (mais algumas vazias) cortando que dei
inclusivo aj
exclusivo com[i:j]
entrei
em [0, n) usandor(n)
ej
em [0, n] usandor(n+1)
(os vazios quandoi>=j
oui
estão fora dos limites); filtros para aqueles com a soma correta comif sum(v)==n
; retorna o primeiro (e, portanto, o mais longo) tal fatia usando[0]
.fonte
Python 2 ,
9190 bytes-1 byte graças a @CMcAvoy
Experimente online!
fonte
Pitão, 11 bytes
Experimente aqui.
fonte
PHP , 73 bytes
nenhuma solução é um loop infinito
Experimente online!
PHP , 83 bytes
imprime nada para nenhuma solução
cada entrada mod 4 == 2 não tem solução
Experimente online!
fonte
Python 2 ,
122121119115 bytes-1 byte graças a musicman523. -4 bytes graças ao Step Hen. haha
Experimente online!
fonte
range
, Experimente online!Python 3 , 93 bytes
Experimente online!
A única coisa especial que fiz foi notar que isso
(s+e)*(2+e-s)==4*n
é equivalente esum(range(s,e+1,2))==n
, embora tenham o mesmo tamanho quandor=range
, o primeiro pode ser colocado mais perto daif
afirmação.fonte
Python 3 , 185 bytes
Experimente online!
Quanto a como isso funciona, tentei buscar uma solução um pouco mais elegante do que uma simples pesquisa de força bruta. Reorganizei a fórmula para a soma de uma sequência aritmética e apliquei a fórmula quadrática para obter a expressão
(1-a+((a-1)**2+4*s)**(.5))/2
, que aparece no código. O que a expressão calcula é, dada a soma desejadas
e o primeiro termo da sequência aritméticaa
, o comprimento da sequência. Esses comprimentos são armazenados em um dicionário como valores para os primeiros termos como chaves.Em seguida, todos os valores não inteiros são removidos do dicionário, pois representam sequências inválidas. A partir daí, o maior valor é identificado com
max(d.keys(), key=(lambda k: d[k]))
e a sequência de números ímpares nessa posição e nesse comprimento é feita comlist(range(int(m),int(m+2*d[m]),2))
.Estou procurando ajuda para jogar golfe, se você vir alguma coisa. Eu estava mais interessado em ver o quão bem eu poderia fazer com um algoritmo não trivial; minha resposta é quase o dobro da melhor solução Python.
fonte
Mathematica, 56 bytes
Function
com o primeiro argumento#
.Table[n,{n,1,#,2}]
calcula a lista de números ímpares positivos menores ou iguais a#
.Subsequences
retorna todas as subsequências dessa lista ordenadas pelo aumento do tamanho. Em seguida, tomamos aCases
que correspondênciax_/;Tr@x==#
, isto é, sequências dex
modo que sua somaTr@x
seja igual à entrada#
. Em seguida, tomamosLast
essa sequência.fonte
JavaScript (ES6), 72 bytes
Retorna uma sequência de números ímpares ou lançada em espaço inválido. Versão de 84 bytes que retorna uma matriz (vazia quando apropriada):
Explicação: Basicamente baseada na solução awk do @ Cabbie407 para Soma de números consecutivos consecutivos, exceto que eu consegui salvar alguns bytes usando recursão.
fonte
PHP, 78 bytes
loop infinito se não houver solução. inserir
?$b>$argn+2?$n=[]:1:0
depois$s-$argn
para imprimir a matriz vazia.Corra com
-nR
ou experimente online .fonte
C # (.NET Core) , 129 bytes
Emite números em uma sequência, delimitado por espaço (qualquer outro caractere exigiria apenas a alteração de
" "
). A entrada sem solução retorna uma sequência vazia (embora se a execução sem erros for uma maneira válida de indicar nenhuma solução, 17 bytes podem ser salvos removendo-seif(b==e)return"";
).O algoritmo é:
fonte
(i)=>
comoi=>
C ++, 157 -> 147 bytes
-10 Bytes graças a DJMcMayhem
retornará 0 se não houver resposta, 1 caso contrário
a última linha impressa é a resposta
ungolfed:
este é o meu primeiro código de golfe ^^
fonte
int v=0;
vez deint v;....v=0;
e se você delimitasse a saída Newline, poderia fazerstd::cout<<k<<"\n";
e remover a segunda linha completamenteKotlin, 152 bytes
Experimente online (aguarde 4-5 segundos, o compilador está lento)
Ungolfed
fonte
Excel VBA, 139 bytes
Sub
rotina que recebe a entradan
do tipo inteiro esperado e relata a sequência mais longa de números ímpares consecutivos para a célula[A1]
fonte