Imprimir os números Super Collatz


22

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

6
Além disso, se alguém puder encontrar um número com uma distância infinita infinita (nunca atinge 1), darei a eles a maior recompensa que posso oferecer. = D
DJMcMayhem

1
Muitos matemáticos também ...: P
R


5
Isso é apenas conjectura, mas suspeito que a regra 2 seja um fato matemático, e não apenas uma restrição de desafio.
Trichoplax

1
"Você deve pegar um número n como entrada e produzir todos os números da Super Collatz até n". Então, se eu entendi corretamente, você NÃO solicita a saída do primeiro número da n Super Collatz? Porque é isso que a resposta Pyth faz, por exemplo, então acho que não está claro o suficiente.
Fatalize 4/16/16

Respostas:


1

Pitão, 23 bytes

q#eol.u@,/N2h*N3NN)STSQ

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.


2

Python 2, 104 bytes

c=lambda x:x>1and 1+c([x/2,x*3+1][x%2])
lambda n:[1]+[x for x in range(2,n)if c(x)>max(map(c,range(x)))]

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.


2

Dyalog APL , 41 bytes

(∪⊢⍳⌈\)≢∘{1=⍵:⍬⋄2|⊃⌽⍵:⍵,∇1+3×⍵⋄⍵,∇⍵÷2}¨∘⍳

Uma função sem nome. Nome ou parênteses para aplicar.

Casos de teste:

       ((∪⊢⍳⌈\)≢∘{1=⍵:⍬ ⋄ 2|⊃⌽⍵:⍵,∇ 1+3×⍵ ⋄ ⍵,∇ ⍵÷2}¨∘⍳)¨4 50 10000
┌─────┬────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐
│1 2 3│1 2 3 6 7 9 18 25 27│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│
└─────┴────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘

0 resulta em comportamento indefinido.


1

ES6, 86 83 bytes

n=>(i=m=0,c=n=>n<3?n:c(n&1?n*3+1:n/2)+1,[for(x of Array(n))if(c(++i)>m&&(m=c(i)))i])

Editar: salvou 3 bytes alternando filterpara uma compreensão de matriz.


1

Haskell, 84 bytes

c 1=0;c x|odd x=1+c(3*x+1)|0<1=1+c(div x 2)
f x=[n|n<-[1..x],all(c n>)$c<$>[1..n-1]]

Isso é muito lento, é claro, mas funciona!


1

Oracle SQL 11.2, 329 bytes

WITH q(s,i)AS(SELECT LEVEL s,LEVEL i FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT s,DECODE(MOD(i,2),0,i/2,i*3+1)i FROM q WHERE i<>1),v AS(SELECT s,COUNT(*)-1 d FROM q GROUP BY s),m AS(SELECT s,d,MAX(d)OVER(ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)m FROM v)SELECT s FROM m WHERE(d>m OR s=1)AND:1>0ORDER BY 1;

Versão sem golfe

WITH q(s,i) AS 
  (
    SELECT LEVEL s, LEVEL i 
    FROM DUAL CONNECT BY LEVEL <= :1
    UNION ALL 
    SELECT q.s, DECODE(MOD(i,2),0,i/2,i*3+1)i FROM q WHERE q.i <> 1
  )
, v AS (SELECT s, COUNT(*)-1 d FROM q GROUP BY s)
, m AS (SELECT s, d, MAX(d)OVER(ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) m FROM v)
SELECT * FROM m WHERE (d>m OR s=1) AND :1>0
ORDER BY 1;

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.


0

MATL , 37 bytes

:"@tqX`t0)t2\?3*Q}2/]ht0)q]n]N$htY>=f

Experimente online!

:         % vector [1,2,...N], where N is implicit input
"         % for each number in that range
  @       %   push that number, k
  tq      %   truthy iff k is not 1
  X`      %   while...do loop
    t0)   %     pick first number of array
    t2\   %     is it odd?
    ?     %     if so:
      3*Q %       multiply by 3 and add 1
    }     %     else
      2/  %       divide by 2
    ]     %     end if
    h     %     concatenate into array with previous numbers
    t0)q  %     duplicate, pick last number, is it 1? Leave that as while condition
  ]       %   end while
  n       %   number of elements of array. This is the stopping distance for k
]         % end for
N$h       % concatenate all stopping distances into an array
tY>       % duplicate and compute cumulative maximum
=f        % indices of matching elements. Implicitly display

0

, 30 caracteres / 38 bytes

⩥ïⓜМȬ⧺$,a=[])⋎⟮aꝈ-1⟯>ɐ⅋(ɐ=Ⅰ,ᵖ$

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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.