A sequência Collatz (também chamada de problema 3x + 1) é onde você começa com um número inteiro positivo; neste exemplo, usaremos 10 e aplicaremos este conjunto de etapas:
if n is even:
Divide it by 2
if n is odd:
Multiply it by 3 and add 1
repeat until n = 1
10 é par, então dividimos por 2 para obter 5. 5 é ímpar, então multiplicamos por 3 e adicionamos 1 para obter 16. 16 é par, então corte-o ao meio para obter 8. Metade de 8 é 4, metade de 4 é 2 e metade de 2 é 1. Como isso levou seis etapas, dizemos que 10 tem uma distância de parada de 6.
Um número Super Collatz é um número cuja distância de parada é maior que a distância de cada número menor que ele. Por exemplo, 6 é um número da Super Collatz, já que 6 tem uma distância de parada de 8, 5 tem uma distância de parada de 5, 4 tem 2, 3 tem 7, 2 tem 1, 1 tem 1 e 1 tem 0. ( A006877 no OEIS) Você deve pegue um número n como entrada e produza todos os números do Super Collatz até n .
Regras
Programa ou função completa é aceitável.
Você não pode pré-calcular ou codificar permanentemente a sequência Super Collatz.
Você pode receber informações em qualquer formato razoável.
A saída pode ser retornada como uma lista da função ou impressa em STDOUT ou em um arquivo. O que for mais conveniente.
Entradas inválidas (não números, decimais, números negativos, etc.) resultam em comportamento indefinido.
Exemplo de python não destruído
def collatzDist(n):
if n == 1:
return 0
if n % 2 == 0:
return 1 + collatzDist(n / 2)
return 1 + collatzDist((n * 3) + 1)
n = input()
max = -1
superCollatz = []
for i in range(1, n + 1):
dist = collatzDist(i)
if dist > max:
superCollatz.append(i)
max = dist
print superCollatz
IO de amostra:
#in #out
4 --> 1, 2, 3
50 --> 1, 2, 3, 6, 7, 9, 18, 25, 27
0 --> invalid
10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171
Aqui também estão os 44 primeiros números da Super Collatz:
1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799
Respostas:
Pitão, 23 bytes
Demonstração
Isso funciona elevando o máximo do intervalo até cada número pela distância de parada da Collatz e verificando se esse máximo é o número em questão.
fonte
Python 2, 104 bytes
c
é uma função auxiliar que calcula a distância de Collatz para um determinado número inteiro. O lambda sem nome é a função principal, que calcula os números dos super Collatz até (mas não incluindo) a entrada.fonte
Dyalog APL , 41 bytes
Uma função sem nome. Nome ou parênteses para aplicar.
Casos de teste:
0 resulta em comportamento indefinido.
fonte
ES6,
8683 bytesEditar: salvou 3 bytes alternando
filter
para uma compreensão de matriz.fonte
Haskell, 84 bytes
Isso é muito lento, é claro, mas funciona!
fonte
Oracle SQL 11.2, 329 bytes
Versão sem golfe
A visualização q é uma visualização recursiva verdadeira (não uma consulta hierárquica com CONNECT BY) que calcula todas as etapas em direção a 1 para cada número inteiro entre 1 e: 1.
A visualização v calcula as distâncias de parada.
A visualização m usa a versão analítica do MAX para aplicá-la a todas as linhas anteriores, excluindo a linha atual. Dessa forma, para cada número inteiro, sabemos que é a distância de parada e a maior distância de parada atual.
A consulta final verifica se a distância de parada é maior que a maior distância de parada. E adiciona alguns truques para lidar com 1 e o caso especial de: 1 com o valor 0.
fonte
MATL , 37 bytes
Experimente online!
fonte
, 30 caracteres / 38 bytes
Try it here (Firefox only).
A única razão pela qual não postei isso antes foi porque não estava claro as especificações. Usa uma codificação personalizada que codifica caracteres de 10 bits.
Explicação
⩥ïⓜ
cria um intervalo[0,input)
para mapear.МȬ⧺$,a=[])
gera números Collatz em uma matriz vazia e⋎⟮aꝈ-1⟯>ɐ
usa a matriz de números Collatz para obter a distância de parada e verificar se é maior que a distância máxima de parada anterior. Nesse caso,⅋(ɐ=Ⅰ,ᵖ$
torna a distância de parada atual a distância máxima de parada e empurra o item atual no intervalo para a pilha. Depois, os itens da pilha são impressos implicitamente.fonte
Geléia , 17 bytes
Experimente online!
Talvez surpreendentemente, este são apenas 3 links! Eles são
×3‘µHḂ?µÐĿL$€
,<Ṫ$
eẠ
.fonte