Eu acho que a Conjectura Collatz já é bem conhecida. Mas e se invertermos as regras?
Comece com um número inteiro n> = 1.
Repita as seguintes etapas:
Se n for par , multiplique por 3 e adicione 1.
Se n for ímpar , subtraia 1 e divida por 2.
Pare quando atingir 0
Imprima os números iterados.
Casos de teste:
1 => 1, 0
2 => 2, 7, 3, 1, 0
3 => 3, 1, 0
10 => 10, 31, 15, 7, 3...
14 => 14, 43, 21, 10, ...
Regras:
Essa sequência não funciona para muitos números porque entra em um loop infinito. Você não precisa lidar com esses casos. Apenas imprimir os casos de teste acima é suficiente.
Sugeri subtrair 1 e dividir por dois para fornecer um número inteiro válido para continuar, mas não é necessário que seja calculado dessa maneira. Você pode dividir por 2 e converter para número inteiro ou quaisquer outros métodos que fornecerão a saída esperada.
Você também precisa imprimir a entrada inicial.
A saída não precisa ser formatada como os casos de teste. foi só uma sugestão. No entanto, a ordem iterada deve ser respeitada.
O menor código vence.
0
no final?Respostas:
Perl 6 , 30 bytes
Experimente online!
Bloco de código anônimo que retorna uma sequência.
Explicação:
fonte
Haskell ,
4039 bytesExperimente online!
Agora sem o 0 final.
fonte
Limpo , 53 bytes
Experimente online!
fonte
Geléia , 9 bytes
Experimente online!
fonte
Python 2,
545244 bytes-2 bytes graças ao Sr. Xcoder
Certamente deve haver uma maneira mais rápida. Estranhamente, quando experimentei um lambda, era o mesmo número anterior. Provavelmente estou tendo alucinações.
Experimente online!
fonte
0
agora seja opcional, é mais curto se livrar do segundoprint
Haskell ,
76 69 6156 bytesEu sinto que isso é muito longo. Aqui
l
produz uma lista infinita da sequência inversa-colatz, e a função anônima na primeira linha apenas a corta no lugar certo.Obrigado por -5 bytes @ ØrjanJohansen!
Experimente online!
fonte
(>0)
deve ser suficiente. Também há umaodd
função.Ferrugem ,
6564 bytesExperimente online!
fonte
05AB1E ,
1514 bytes-1 byte graças a @MagicOctopusUrn .
Experimente online.
Explicação:
fonte
[Ð=_#Èi3*>ë<2÷
com em=
vez deD,
.JAEL , 18 bytes
Experimente online!
fonte
JavaScript (ES6), 31 bytes
Experimente online!
Ou 30 bytes na ordem inversa.
fonte
Pyth , 12 bytes
Experimente aqui como uma suíte de testes!
fonte
Wolfram Language (Mathematica) , 35 bytes
Experimente online!
0<Echo@# && ...&
é uma avaliação de curto-circuito: imprime a entrada#
, verifica se é positiva e, em caso afirmativo, avalia...
. Nesse caso,...
é#0[3#+1-(5#+3)/2#~Mod~2]
; como#0
(o slot zeroth) é a própria função, é uma chamada recursiva3#+1-(5#+3)/2#~Mod~2
, que simplifica3#+1
quando#
é par e(#-1)/2
quando#
é ímpar.fonte
Lisp comum , 79 bytes
Experimente online!
fonte
PowerShell,
5352 bytesExperimente Online!
Edit:
-1 byte graças a @mazzy
fonte
for(;$i)
vez dissowhile($i)
Emojicode 0.5 , 141 bytes
Experimente online!
fonte
Stax , 11 bytes
Execute e depure
fonte
MathGolf , 12 bytes
Experimente online!
Explicação
fonte
código de máquina x86, 39 bytes
Assembly (sintaxe NASM):
Experimente online!
fonte
R ,
66bytes 61-5 bytes graças a Robert S. na consolidação de ifelse
if
e na remoção de colchetes, e x! = 0 a x> 0ao invés de
Experimente online!
fonte
perl -Minteger -nlE, 39 bytes
fonte
Adicionar ++ ,
383533 bytesExperimente online!
Como funciona
Primeiro, começamos definindo uma funçãof( X ) , que usa um único argumento, executa a operação Collatz invertida em x então gera o resultado. Isso é,
Quando no modo de função, o Add ++ usa um modelo de memória de pilha, caso contrário, as variáveis são usadas. Ao calcularf( X ) , a pilha parece inicialmente S= [ x ] .
Duplicamos esse valor (S= [ x , x ] . Em seguida, produzimos a primeira opção possível,3 x + 1 ( ⌊ x2⌋ , deixando S= [ 3 x + 1 , ⌊ x2⌋ ] .
d
) para gerar3*1+
), troque os dois principais valores e calculeEm seguida, empurramosx para S e calcule o bit de x ie x%2 , Onde uma%b denota o restante ao dividiruma por b . Isso nos deixa comS= [ 3 x + 1 , ⌊ x2⌋ , ( x%2 ) ] . Por fim, usamos ( x%2 ) . Se isso é0 0 , retornamos o primeiro elemento, ou seja, 3 x + 1 , caso contrário, retornamos o segundo elemento, ⌊ x2⌋ .
D
para selecionar o elemento no índice especificado porIsso completa a definição def( X ) no entanto, ainda não o colocamos em prática. As próximas três linhas mudaram do modo de função para o modo baunilha, onde operamos em variáveis. Para ser mais preciso, neste programa, operamos apenas uma variável, a variável ativa , representada pela letra
x
. No entanto,x
pode ser omitido dos comandos em que obviamente é o outro argumento.Por exemplo,x ≠ 0 . O circuito é muito simples, consistindo em uma única instrução: f( X ) , em seguida, atribua isso a
+?
é idênticox+?
ae atribui a entrada ax
, mas comox
é a variável ativa , ela pode ser omitida. Em seguida, produzimosx
, em seguida, inteiro o loop while, que faz um loop pelo tempo que$f>x
. Tudo isso faz é executadox
, atualizandox
a cada iteração do loop.fonte
Retina 0.8.2 , 46 bytes
Experimente online! Explicação:
Converta para unário.
Repita até que o valor pare de mudar.
Imprima o valor em decimal.
Se for par, multiplique por 6 e adicione 3.
Subtraia 1 e divida por 2.
A nova linha à direita pode ser suprimida adicionando um
;
antes de{
.fonte
Vermelho , 70 bytes
Experimente online!
fonte
Raquete , 75 bytes
Experimente online!
Equivalente à solução Common Lisp da JRowan.
fonte
C # (.NET Core) , 62 bytes
Experimente online!
Ungolfed:
fonte
Dardo , 49 bytes
Experimente online!
fonte
Esquema de jogo (gsi) , 74 bytes
Experimente online!
fonte