Antes que alguém diga alguma coisa, semelhante e semelhante . Mas isso não é uma bobagem.
Alguns números inteiros positivos podem ser escritos como a soma de pelo menos dois números inteiros positivos consecutivos. Por exemplo 9=2+3+4=4+5
,. Escreva uma função que use um número inteiro positivo como entrada e imprima como saída a sequência mais longa de números inteiros positivos consecutivos crescentes que somarem a ela (qualquer formato é aceitável, embora -5 bytes se a saída for a sequência crescente separada por, +
como mostrado acima Se não existir essa sequência, o próprio número deverá ser impresso.
Isso é código de golfe. Aplicam-se regras padrão. O menor código em bytes vence.
Amostras (observe que a formatação varia)
Input: 9
Output: 2,3,4
Input: 8
Output: 8
Input: 25
Output: [3,4,5,6,7]
-n+1
atén
) #Respostas:
Python, 67 bytes
Uma estratégia estranhamente direta: procure o intervalo R com a soma certa.
Como a extremidade inferior do intervalo apenas aumenta, intervalos maiores são encontrados antes dos menores.
fonte
Pitão,
1210 bytesO código tem 15 bytes e se qualifica para o bônus de -5 bytes . Experimente online no Pyth Compiler .
Graças a @Jakube por jogar fora 2 bytes!
Como funciona
fonte
Mathematica,
7368655643 bytesfonte
Tuples
uma expressão infix.Haskell,
4948 bytesfonte
[...]!!0
vez dehead[...]
.MATLAB,
8779 bytesEu sei que já existe uma resposta do MATLAB, mas essa é uma abordagem significativamente diferente.
Isso também funciona no Octave . Você pode tentar online aqui . Eu já adicionei o código
consecutiveSum.m
no espaço de trabalho vinculado; portanto, basta digitarconsecutiveSum
no prompt de comando e inserir o valor (por exemplo, 25).Ainda estou trabalhando para reduzi-lo (talvez ajustando a equação usada um pouco), mas basicamente ele encontra o maior valor
n
para o qualm
é um número inteiro e exibe os primeirosm
números começando comn
.Então, por que isso funciona? Bem, basicamente existe uma equação matemática que governa todos esses números. Se você considera que todos são consecutivos e começa a partir de algum ponto, você pode basicamente dizer:
Agora, a partir disso, torna-se aparente que a sequência é basicamente apenas o primeiro
p
número do triângulo (incluindo o 0'th), adicionado ap+1
muitosn
. Agora, se deixarmosm=p+1
, podemos dizer:Isso é realmente bastante solucionável. Ainda estou procurando a maneira mais curta de fazer isso, tenho algumas idéias para tentar reduzir o código acima.
Para uma entrada de 25, a saída seria:
fonte
1,3,6,10,...
sejam maximizados.Python 2, 94 bytes
A entrada é retirada do stdin. Esta solução é adequada para entradas muito grandes.
Isso itera sobre os possíveis comprimentos da solução, r , com r ≤ √ (2n) , e verifica explicitamente a solução. Para que uma solução exista, se r for ímpar, n mod r deve ser zero e se r for par, n mod r deve ser r / 2 .
Uso da amostra
Escolhi deliberadamente exemplos com resultados relativamente pequenos.
fonte
Oitava, 89 bytes
Este é o melhor que eu poderia fazer na oitava. O algoritmo é o mesmo que o xnor.
No MATLAB, isso seria 95 bytes:
No MATLAB, isso é executado em aproximadamente 0,1 segundos para entrada
2000000
e 1 segundo para entrada1000002
.fonte
awk, 51 bytes
O código é 56 bytes, menos 5 bytes para o formato de saída. Eu tive que usar 4 bytes extras para produzir esse formato, então eu realmente salvei 1 byte. Viva! ;)
Na verdade, está fazendo o trabalho duro de resumir, começando de 1 até que a soma seja maior que a entrada. Em seguida, começa a subtrair números começando de 1 até que o número seja menor que a entrada. Ele continua alterando o número inicial e final dessa maneira até encontrar um resultado, que é impresso.
Exemplo de uso
Saída do exemplo
Eu tentei isso para uma entrada de
1e12
e deu o resultado correto (464562+...+1488562
) quase imediatamente. Embora demorou um pouco para imprimi-lo, é claro ...fonte
{while($0!=s)s+=(s<$0) ? (++j) : -(++i); while(++i<j)r=r i"+"}$0=r j
i é sempre o último número inteiro que foi subtraído do início da cadeia, j é sempre o último número inteiro adicionado no final da cadeiaJaponês , 33 bytes
Isso usa a técnica Pyth de Dennis , embora seja consideravelmente mais longa ...
Experimente online! Atenção: para entradas maiores (<= 20), leva um tempo para terminar e congela o navegador até que isso aconteça.
Ungolfed e explicação
Versão ganha-bônus: (38 bytes - 5 = 33)
fonte
Julia, 92 bytes
Esta é uma função anônima que aceita um número inteiro e retorna uma matriz. Para chamá-lo, dê um nome, por exemplo
f=x->...
.Ungolfed:
fonte
Ruby, 94 bytes
Ungolfed:
Uso:
fonte
Sério, 53 - 5 = 48 bytes
Hex Dump
Experimente Online!
É a abordagem da força bruta, semelhante ao Pyth de Dennis.
Tudo até o
k
momento lê a entradan
no registro 1 e cria a lista[[1],[2,2],[3,3,3],[4,4,4,4],...]
atén
n
's.A próxima parte
╗
é uma função armazenada no registro 0 que leva um par, incrementa os dois elementos, os converte em um intervalo, localiza a soma do intervalo e verifica se essa soma é o valor no registro 1. Se for, retorna o intervalo correspondente e, se não estiver, retorna uma lista vazia.A parte até a última ocorrência de
M
mapeia uma função sobre a sofisticada lista de listas descrita acima, executandoenumerate
em cada lista e, em seguida, mapeando a função armazenada sobre ela. Quando estiver pronto, temos uma lista de listas, cada uma delas vazia ou um intervalo ao qual soman
.;░
remove as listas vazias.p@X
pega a primeira lista que permanece (0@E
também funcionaria).'+j
coloca+
entre cada número à medida que converte a lista em uma sequência de caracteres para o bônus.fonte
ES6, 72 bytes
Porta direta da solução awk do @ Cabbie407, mas sem o bônus de formatação, pois é uma penalidade aqui.
fonte
Python 3,
239236215203 bytesIsso é um pouco complicado. Vou ter que jogar mais tarde.
IssoGraças ak
ocorre porque, se você verificart[0]
um vaziot
, o Python faz barulhos rudes com você. Novamente, isso precisa de golfe.t[:1]
, não há mais rudes rudes! Você só precisa verificar contra outra matriz.fonte
Gelatina , 8 bytes (não concorrente)
Experimente online!
Se eu entendi corretamente, isso pode ser uma versão de (11-5 = 6) bytes:
fonte
05AB1E , 11 - 5 = 6 bytes (não concorrente)
Tomando esse bônus, é claro :)
Experimente online!
fonte
PHP, 70 bytes
Execute como pipe
-nR
ou experimente online .incrementos
p
até encontrar uma solução para o número inteiroargument==(p+q)*(q-p+1)/2
,em seguida, imprime o intervalo entre
p
aq
.fonte
Excel VBA, 119 - 5 = 114 bytes
Sub
rotina que recebe a entradan
do tipo inteiro esperado e gera a sequência mais longa de números consecutivos que somam à célula[A1]
fonte