Hoje veremos uma sequência a , relacionada à função Collatz f :
Chamamos uma sequência da forma z, f (z), f (f (z)),… uma sequência Collatz .
O primeiro número da nossa sequência, a (1) , é 0 . Sob aplicação repetida de f , ele entra em um ciclo 0 → 0 →…
O menor número que ainda não vimos é 1, produzindo um (2) = 1 . Sob aplicação repetida de f , ele entra em um ciclo 1 → 4 → 2 → 1 →…
Agora vimos o número 2 no ciclo acima, então o próximo número menor é um (3) = 3 , caindo no ciclo 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…
Em todos os ciclos acima, vimos 4 e 5 , então o próximo número é (4) = 6 .
Até agora você deve ter uma ideia. a (n) é o menor número que não fazia parte de nenhuma sequência de Collatz para todos os a (1),…, a (n - 1) .
Escreva um programa ou função que, dado um número inteiro positivo n , retorne a (n) . O menor código em bytes vence.
Casos de teste:
1 -> 0
2 -> 1
3 -> 3
4 -> 6
5 -> 7
6 -> 9
7 -> 12
8 -> 15
9 -> 18
10 -> 19
50 -> 114
(Essa é a sequência OEIS A061641 .)
fonte
n
ser baseada em 0?a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
a
não é baseado em 0 Eu não entendo por que você parece estar "falando 0 com base em" aqui:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
Respostas:
Geléia ,
2019 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
Após n iterações, o valor de a (n + 1) estará no início da matriz. Como concatenamos a nova matriz com uma cópia invertida da antiga, isso significa que a (n) estará no final.
fonte
Haskell,
9392 bytesExemplo de uso:
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10
->19
.c x
é o ciclo de Collatzx
com um pouco de trapaçax == 1
. As principais funções percorre todos os inteiros e mantém aqueles que não estão emc x
parax
em[0..y-1]
. Praticamente uma implementação direta da definição. Como o operador de índice Haskell!!
é baseado em 0, começo por-1
um número (de outra forma inútil) para obter o índice fixo.fonte
MATL ,
4640 bytesExperimente online!
Explicação
O código possui um
for
loop externo que geran
sequências Collatz, uma em cada iteração. Cada sequência é gerada por umdo...while
loop interno que calcula novos valores e os armazena em um vetor de sequência até que a1
ou0
seja obtido. Quando terminamos a sequência, o vetor é revertido e concatenado para um vetor global que contém os valores de todas as seqüências anteriores. Esse vetor pode conter valores repetidos. A reversão do vetor de sequência garante que, no final do loop externo, o resultado desejado (o valor inicial da última sequência) esteja no final do vetor global.Pseudo-código :
Código comentado :
fonte
Brachylog ,
7067656362 bytesExperimente online!
fonte
Python 2,
9796 bytesAproveita o fato de que todos os múltiplos de 3 são puros. Teste em Ideone .
Como funciona
Na primeira linha,
r,=s={-1}
define s = {-1} (conjunto) er = -1 .Em seguida, lemos um número inteiro de STDIN, repetimos uma certa string várias vezes e depois executamos. Isso é equivalente ao seguinte código Python.
Em cada iteração, começamos encontrando o menor membro de {r + 1, r + 2, r + 3} que não pertence a s . Na primeira iteração, isso inicializa r como 0 .
Em todas as execuções subsequentes, s pode (e irá) conter parte de r + 1 , r + 2 e r + 3 , mas nunca todas, uma vez que todos os múltiplos de 3 são puros. Para verificar esta afirmação, observe que nenhum m múltiplo de 3 tem a forma 3k + 1 . Isso deixa 2m como a única pré-imagem possível, que também é um múltiplo de 3 . Assim, m não pode aparecer na sequência Collatz de qualquer número que seja menor que m e, portanto, é puro.
Após identificar r e inicializar n , aplicamos a função Collatz com
n=(n/2,3*n+1)[n%2]
, adicionando cada valor intermediário de n ao conjunto s coms|={n}
. Quando encontrarmos um número n que já está em s ,{n}-s
produzirá um conjunto vazio e a iteração será interrompida.O último valor de r é o elemento desejado da sequência.
fonte
Pitão , 32 bytes
Suíte de teste.
fonte
Java, 148 bytes
Ideone it! (Aviso: complexidade exponencial devido à otimização zero.)
Convertê-lo de um
do...while
loop para umfor
loop seria mais golfista, mas estou tendo problemas para fazê-lo.Conselhos sobre golfe são bem-vindos, como de costume.
fonte
for(b=1,i=1;i<n;i++)
parafor(b=1,i=0;++i<n;)
. Btw, eu entendo por que seu ideone está perdendo o caso de teste para 50, mas por que também falta o 10? Ele pode lidar com isso sem problemas.int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
Perl6, 96
Baseado na resposta do Perl 5 . Um pouco mais, já que a sintaxe do Perl6 é menos tolerante que a sintaxe do Perl5, mas vou resolver isso por enquanto.
fonte
PHP,
233124 bytes+4 para função:
fonte
Perl 5 - 74 bytes
Esta é uma solução bastante direta. Aplica repetidamente a função Collatz à variável
$a
e armazena na matriz@c
que o valor foi visto; depois de atingir 0 ou 1, aumenta$a
até que seja um número que ainda não foi visto. Isso é repetido um número de vezes igual à entrada menos 2 e, finalmente, o valor de$a
é emitido.fonte
Mathematica, 134 bytes
Formato mais fácil de ler:
fonte