A sequência SUDSI ( su m, d ifference, s WAP, i ncrement) é uma sequência de número inteiro curioso que parece exibir comportamento caótico. Pode ser gerado da seguinte maneira:
Deixe- S ser uma lista infinita dos números naturais: 1 2 3 4 5 6 ...
. Deixe S i denotar a uma indexados i -ésimo elemento de S . Então, inicialmente, S 1 é 1, S 2 é 2, etc. (não há S 0 ).
Começando com S 1 e S 2 ...
- Calcule a soma deles:
sum = S1 + S2
- Calcule a diferença absoluta (quanto maior menos o menor):
diff = |S1 - S2|
Troque os dois valores em S nos índices da soma e da diferença:
swap(Ssum, Sdiff)
Incremente os índices de S com os quais você está trabalhando. Então, da próxima vez, você calculará a soma e a diferença de S 2 e S 3 , e o tempo depois disso será S 3 e S 4 , etc.
- Repita esse processo indefinidamente.
Aqui estão os primeiros estágios de S à medida que esse processo é aplicado. Os colchetes []
envolvem os dois valores que estão prestes a ser somados e diferenciados.
S original :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
Depois que S 3 ( 3 = 1 + 2
) e S 1 ( 1 = |1 - 2|
) são trocados:
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
Depois que S 3 e S 1 são trocados:
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
Depois que S 7 e S 1 são trocados:
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
Depois que S 9 e S 1 são trocados:
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
Depois que S 11 e S 1 são trocados:
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
Depois que S 7 e S 5 são trocados:
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
etc.
A sequência SUDSI é definida como a sequência dos primeiros elementos em cada uma dessas listas. Portanto, os primeiros termos da sequência SUDSI são 1 3 1 7 9 11 11
.
Aqui estão os primeiros 200 termos da sequência SUDSI (20 por linha):
1 3 1 7 9 11 11 11 15 15 19 19 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 19 57 59 59 59 59 59 59 59 59 59 77 79
81 83 85 87 89 91 91 91 91 91 91 91 91 91 91 91 91 91 115 115
121 123 125 127 127 127 127 127 137 139 141 143 145 147 147 147 147 147 147 147
147 147 147 147 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167
167 167 167 167 209 211 211 211 211 211 221 223 223 223 223 223 223 223 223 223
223 223 243 243 243 243 243 243 257 259 261 263 263 263 263 263 263 263 263 263
263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263
263 263 325 327 329 331 331 331 331 331 331 331 331 331 349 351 351 351 351 351
361 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363
Não está claro (pelo menos para mim) como se pode prever termos futuros. Parece seguro dizer que os termos são sempre ímpares, não diminuem (após o segundo mandato) e que alguns números são repetidos várias vezes.
Desafio
Escrever um programa ou função que leva em um número inteiro positivo n e gravuras ou retorna o n ésimo termo da sequência SUDSI. Por exemplo, se n for 1, a saída será 1
, se n for 2, a saída será 3
, se n for 200, a saída será 363
.
Tome entrada da maneira usual (stdin / linha de comando / função arg).
A resposta mais curta em bytes vence.
(Esse site codifica as coisas em UTF-8, mas você pode usar qualquer codificação existente que desejar.)
Bônus de Mathy: (potencialmente elegível para recompensa)
- Conte-me mais sobre a sequência SUDSI. Qual é o padrão subjacente a quais números fazem parte dele e quantos deles existem (e coisas assim)? (A propósito, não consegui encontrar o SUDSI no OEIS .)
fonte
Respostas:
Pitão,
45414038 bytesNotei (como Martin Büttner), que o número máximo afetado de uma etapa de permutação em
k
é2k + 1
. Mas como temos apenasn - 1
etapas, precisamos apenas de uma lista dos números até2n - 1
.Experimente online: Demonstração
fonte
Mathematica, 88 bytes
Este é um programa completo, lendo a entrada de um prompt. É uma implementação muito direta da definição, onde eu acompanho a sequência atual em
f
(cujos valoresf[n]
padrão sãon
).Aqui está uma versão um pouco mais legível:
Alguma análise
Plotamos os primeiros 2000 elementos da sequência (na verdade não fica mais interessante depois):
Portanto, a sequência é essencialmente linear com a inclinação 2 e sempre possui algumas dessas etapas. Parece que os passos crescem de forma sublinear (se eles nem são limitados), pois se tornam quase imperceptíveis à medida que você aumenta o número de pontos traçados.
Podemos justificar o crescimento linear com bastante facilidade (isso é um pouco handwavy, mas eu acho que iria realizar-se a uma prova rigorosa por indução): inicialmente, o número máximo afetada de uma etapa de permutação em
n
én + (n+1) = 2n + 1
. Observe também que esses números sempre serão movidos para1
, desde|n - (n+1)| = 1
. Portanto, não surpreende que tenhamos números aproximadamente2n
na sequência. No entanto, também podemos observar que para as etapas até n , S n + 1 é sempre limitado por n + 1 , o que significa que nenhuma etapa de troca pode trocar dois números que são maiores que n . Portanto, os números que ainda precisam ser processados serão menores ou iguais ao seu valor inicial. Conseqüentemente,2n + 1
também é o limite para a própria sequência.Acho que encontrar um argumento para a extensão das etapas será mais complicado.
fonte
CJam,
45 4039 bytesApenas uma abordagem ingênua.
Pode ser jogado ainda mais.Falta muito na função de troca de matriz.Como funciona:
Experimente online aqui
fonte
Haskell, 95 bytes
Exemplo de uso:
p 70
->139
Não guardo a sequência em uma lista ou matriz. Atualizo repetidamente a função de identidade para uma função com os dois elementos da etapa atual trocados. Depois de
n
passos que eu chamar a função resultante com parâmetro1
.fonte
J, 63 bytes
Uso e testes:
Experimente online aqui.
fonte
Pyth,
555351Provavelmente pode ser jogado ainda mais.
Pode ficar muito lento,n
pois eu estava com preguiça de descobrir quanto tempo precisava de uma matriz e apenas a usein^n
.Agradeço a Volatility e Martin Büttner por apontar que posso usar no máximo
3n
.Explicação
fonte
2*n
para granden
, com um máximo de3*n
paran=1
.2n+1
que, como você diz, é o máximo em3
paran=1
e (de certa forma) converge para2n
. Isso não é muito surpreendente, já que é o máximo para a sequência não-permutada e nenhuma etapa do processo pode aumentar um número que ainda está à frente. Eu posso adicionar isso à minha resposta..a
extensão em um bom trabalho! Há muito mais guloseimas a caminho, mas isaac está dormindo no momento: github.com/isaacg1/pyth/pull/32doc.txt
GitHub no manual) e vi a atualização. Felizmente, como eu poderia simplesmente ignorá-lo e escrever uma implementação personalizada ...Python 2,
117106101Usa umdict
(mapa) para salvar os valores para usar índices arbitrários.g(n)
é uma função retornando on
item th. Em seguida, apenas itera osinput-1
tempos e gera o primeiro item.Acontece que é mais curto usando os métodos da minha resposta Pyth.
Obrigado ao xnor por salvar 5 bytes.
fonte
b,c=a[i:i+2]
. Além disso,b+c
é curto o suficiente para salvá-lo em uma variável es
perde caracteres ao escrever apenas duas vezes.Go 150
Ungolfed, nada complicado, principalmente roubado de @ Pietu1998
http://play.golang.org/p/IWkT0c4Ev5
fonte
Java, 162
Explicação
fonte
dc,
134132131 bytesUse
echo $n $code | dc
, onde$n
está n e$code
é ... o código ( suspiro ). Cite a gosto.Edit: A menos que você me incomode por uma explicação, eu nunca vou dar a volta a isso.
fonte
Perl 5, 131
Uma solução ingênua (isto é, uma implementação direta da definição). Uma sub-rotina, recebe a entrada como uma lista de
1
s do comprimento desejado.Visualize sua saída por exemplo
print sub...->(1,1,1,1,1)
.Explicação:
map$a[$_]=$_,1..3*@_
constrói a matriz@a
, indexando cada número inteiro de 1 a 3 vezes o tamanho de@_
(a entrada).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
repete o switcheroo repetidamente (um menor número de vezes do que o tamanho de@_
), alternando$a[$a[$_-1]+$a[$_]]
com$a[abs($a[$_-1]-$a[$_])]
a$_
intervalos de 2 ao tamanho de@_
.E então a sub-rotina retorna
$a[1]
.fonte
Perl 5 , 90 + 1 (-p) = 91 bytes
Experimente online!
fonte