A conjectura de Collatz é uma conjectura muito conhecida. Pegue um número inteiro positivo; se for par, divida por 2; caso contrário, multiplique por 3 e adicione 1. Repita até chegar 1
ou algo acontecer. A conjectura é que esse processo sempre alcança 1
.
Você também pode reverter o processo. Comece em 1
, multiplique por 2 e ramifique para multiply by 3 and add 1
números, quando atingir um número par 1 (mod 3)
, subtraia 1 e divida por 3.
Um caminho Collatz combina os dois, tentando passar de um número para outro com essas quatro operações.
Por exemplo, para ir 20
de 1
:
1 *2
2 *2
4 *2
8 *2
16 *2
5 (-1)/3
10 *2
20 *2
Você também pode obter a 3
partir 10
subtraindo 1 e dividindo por 3.
Com essas ferramentas, você pode percorrer um caminho Collatz de um número para outro. Por exemplo, o caminho de 20
para 3
é (dividir por 2), (subtrair 1, dividir por 3).
Em resumo, as operações disponíveis são:
n * 2 always
n // 2 if n % 2 == 0
n * 3 + 1 if n % 2 == 1
(n-1) // 3 if n % 6 == 4
Nota: nem todos os caminhos da Collatz são curtos. a(7,3)
poderia correr
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 2, 4, 8, 16, 5, 10, 3
mas um caminho mais curto é
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 3
O desafio
Encontre o comprimento do caminho Collatz mais curto entre dois inteiros positivos p
e q
.
- Entrada é dois inteiros positivos menores que
2^20
para evitar o excesso de números inteiros. O método de entrada é deixado a critério do jogador de golfe. Os números inteiros podem ser os mesmos; nesse caso, o comprimento do caminho da Collatz é0
. - A saída deve ser um número inteiro, indicando o comprimento do caminho Collatz mais curto entre
p
eq
.
Casos de teste
a(2,1)
1
a(4,1)
1 # 4 -> 1
a(3,1)
6 # 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
a(11,12)
11 # 11 -> 34 -> 17 -> 52 -> 26 -> 13
# -> 40 -> 20 -> 10 -> 3 -> 6 -> 12
a(15,9)
20 # 46 -> 23 -> 70 -> 35 -> 106 -> 53 -> 160 -> 80 -> 40 -> 13
# -> 26 -> 52 -> 17 -> 34 -> 11 -> 22 -> 7 -> 14 -> 28 -> 9
Muito obrigado ao orlp por sua ajuda no esclarecimento deste desafio.
Como sempre, se o problema não estiver claro, entre em contato. Boa sorte e bom golfe!
Respostas:
Haskell,
170 158 157 146 143 137 135 112 109 108 106 10099 bytesEu não esperava que minha versão original fosse muito mais jogável, esse também é o trabalho de @nimi @Lynn e @Laikoni!
Obrigado @Laikoni por um byte, @Lynn por
11 14 2021 bytes, @nimi por 8 bytes!Isso expande a árvore dos números visitados (começando por
a
) passo a passo e verifica em cada passo se chegamos ao número especificadob
.fonte
iterate s [a] -> iterate s[a]
s
economiza mais três bytes!iterate(nub.concat.map f)[a]
Além disso, você realmente precisa donub
?break
espan
, realmente útil![div n 2,n*3+1]!!mod n 2
comcycle[div n 2,n*3+1]!!n
economiza mais um byte :)Python 2, 110 bytes
fonte
Pitão, 30 bytes
Experimente online
Como funciona
Tome o comprimento da diferença simétrica das duas sequências Collatz para frente, começando nos dois números de entrada e terminando em 2. A única exceção é se a entrada for
[1, 2]
or[2, 1]
, ou qual caso especial.fonte
Python 2,
156179191209181172177171 bytesComo um caminho Collatz pode ser imaginado como
a(1,p)
ea(1,q)
conjugado no primeiro número comum a ambas as seqüências ea(1,n)
é a conjectura original de Collatz, essa função calcula a sequência Collatz dep
eq
e calcula o comprimento a partir daí. Como o golfe não é bonito, sugestões de golfe são muito bem-vindas. A única exceção é quandop or q == 1
. Então, como podemos pular diretamente de4
para1
, ao contrário de uma sequência Collatz regular, precisamos subtrair um passo do resultado.Edit: Muita correção de bugs.
Editar: Muitas e muitas correções de bugs
Experimente online!
fonte
a(3,1)
retorna 7, enquanto ele deve retornar 6, como o caminho mais curto é3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
f
denotar um passo à frente,b
um passo para trás na sequência das collatz. O padrãob->f
não pode estar em um caminho mais curto, como é a identidade (f
se desfazendob
em qualquer caso.) Então, o caminho mais curto só pode consistir de padrõesf->f
,f->b
eb->b
. Isso significa que mais uma vez que o caminho mais curto é sempre da formaf->f->...->f
oub->b->...->b
ouf->...->f->b->...->b
JavaScript (ES6), 135 bytes
Executa uma pesquisa pela primeira vez.
x
é o número inicial,y
o destino,a
uma matriz de valores de teste,s
uma matriz do número de passos incluído na cadeia dex
,z
o valor actual. Sez
ey
não são iguais, computaçãoz*2
,z/2
e querz*3+1
ou(z-1)/3
, dependendo sez
é par ou ímpar, então filtrar frações e valores vistos anteriormente e adicioná-los à lista de pesquisa.fonte
Python 2, 80 bytes
Tome o comprimento da diferença simétrica das duas seqüências Collatz para frente, começando nos dois números de entrada e terminando em 2. A única exceção é se a entrada for 1, 2 ou 2, 1, o que nós especializamos.
fonte