A conjectura de Collatz postula que, se você pegar um número inteiro positivo, repita o seguinte algoritmo várias vezes:
if number is odd, then multiply by three and add one
if number is even, then divide by two
você acabará em 1. Parece sempre funcionar, mas nunca foi provado que sempre funciona.
Você já jogou golfe calculando quanto tempo leva para chegar a 1 , então pensei em mudar um pouco as coisas.
Começando com um número inteiro positivo, calcule quanto tempo leva para chegar a 1 (seu "tempo de parada"). Em seguida, encontre o tempo de parada desse número.
Repita até chegar a 1 ou até chegar ao limite totalmente arbitrário de 100 iterações. No primeiro caso, imprima quantas iterações foram necessárias. No último caso, imprima "Fail" ou outra saída consistente de sua escolha, desde que não seja um número inteiro 1≤n≤100
. Você não pode emitir uma sequência vazia para esta opção. A saída de um número inteiro fora do intervalo [1, 100], no entanto, é permitida.
Exemplos:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Conforme calculei 10^100
e 12345678901234567890
usando um idioma que suporta apenas reais para esse tamanho, se o seu idioma for mais preciso, você poderá obter resultados diferentes para eles.
Pontuação
Como esse é o código-golfe , a resposta com a menor quantidade de bytes vence.
fonte
Respostas:
Gelatina , 24 bytes
Experimente online!
fonte
³
vez deȷ2
é permitido ).Python 2 , 70 bytes
Retorna 199 para cem ou mais iterações.
Experimente online!
fonte
Anexo , 40 bytes
Experimente online!
Esta é uma nova linguagem que eu criei. Eu queria dar um jeito de criar uma linguagem de infix adequada, e este é o resultado: uma imitação do mathematica. Hooray?
Explicação
Esta é uma composição de algumas funções. Essas funções são:
PeriodicSteps[CollatzSize@Max&1]
Isso gera uma função que aplica seu argumento até que os resultados contenham um elemento duplicado. Esta função,CollatzSize@Max&1
está sendo aplicadaCollatzSize
à maior entrada e1
, para evitar a entrada inválida0
no CollatSize.`#
é um operador citado; quando aplicado monadicamente nesse sentido, obtém o tamanho de seu argumento`-&3
é uma função ligada, que vincula o argumento3
à função`-
, que é lida como "menos 3". Isso ocorre porque o aplicativo PeriodicSteps gera0
s, que precisam ser contabilizados. (Ele também lida perfeitamente com números fora dos limites, como os5
quais são mapeados-1
.)fonte
J ,
4945 bytes-4 bytes graças ao código Collatz Sequence mais curto, retirado do comentário de @ randomra aqui .
Saídas
101
para resultados inválidos.Experimente online!
Explicação
Sem surpresa, essa explicação ficou rapidamente desatualizada. Vou deixá-lo em termos da antiga resposta de 49 bytes que tive, incluindo abaixo. Se você quiser uma atualização, me avise. A maneira como ele encontra o comprimento da sequência recursiva permanece a mesma, eu acabei de usar um método Collatz Sequence mais curto.
Encontrando o comprimento da sequência Collatz
Esta seção do código é a seguinte
Aqui está a explicação:
Infelizmente, o verbo apply (
^:
) quando solicitado a armazenar resultados também armazena o valor inicial, então isso significa que estamos (como sempre) afastados por um. Por isso, subtraímos 1.Encontrando o comprimento da sequência recursiva
fonte
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
devem ser equivalentesC (gcc) , 75 bytes
Retorna
-1
paran>=100
iterações.Experimente online!
C (gcc) , 73 bytes
Retorna
0
paran>=100
iterações.Experimente online!
fonte
JavaScript (ES6), 57 bytes
Retorna
true
quando falha. Retorna0
para1
.Casos de teste
Mostrar snippet de código
fonte
APL (Dyalog Unicode) ,
3960535249 bytes-3 bytes graças a @ngn
Experimente online!
Usa o código @ngn para Collatz, mas usava anteriormente o código de @ Uriel.
Aqui está a versão antiga que não atendeu às especificações:
fonte
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 bytes
Experimente online!
Retorna
101
para uma sequência sem finalização.fonte
Casca , 21 bytes
Experimente online! Retorna
-1
na falha,0
na entrada1
.Explicação
fonte
C (gcc) ,
7073 bytesExperimente online!
Retorna
101
quando o número de iterações excede 100.fonte
m=0
no seuf
(provavelmente até fazendo uso dofor
intiailizador atualmente vazio para salvar um a;
).Limpo ,
146... 86 bytes-11 bytes graças a Ørjan Johansen
Como uma função parcial literal.
Experimente online!
Interrompe
hd of []
se o número de iterações exceder 100.Sai com
Heap Full
entradas acima de ~, a2^23
menos que você especifique um tamanho de heap maior.fonte
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
peça, é caril. (Ou eta reduz.)Python 2 ,
999897 bytesc and t or f
vez det if c else f
.-1
vez def
ou'f'
para entradas sem interrupção.Experimente online!
fonte
BiwaScheme , 151 caracteres
Você pode tentar aqui .
fonte
R ,
119107 bytesParcialmente usa o código collatz de Jarko Dubbeldam a partir daqui . Retorna
0
para> 100 iterações (falha).Experimente online!
fonte
NARS APL, 115 bytes, 63 caracteres
Provavelmente, usando loops, seria mais claro ... Existem 4 funções, 2 aninhadas e ricorsivas, e a primeira apenas para definir e inicializar como = 0, a variável d, vista na 2ª função como um contador de variáveis globais.
Esta 3ª função seria a função que retorna quantas chamadas existem para resolver a conjectura de Collatz por seu argumento
Esta é a 2ª função, se tiver seu arg = 1, interrompa sua recursão e retorne d o número de vezes que é chamado de si-1; caso contrário, se ele for chamado mais de 99 vezes, interrompa sua recursão e retornará -1 (falha); caso contrário, calcule a conjectura de Collatz para seu argumento e chama-se pelo valor do comprimento da sequência de Collatz. Para mim, mesmo que tudo isso pareça funcionar, pode ser um grande problema se for definida uma variável global e uma variável em uma função com o mesmo nome, quando o programador a vê como apenas uma variável local.
fonte
(Emacs, Common, ...) Lisp, 105 bytes
Retorna t para iterações> 100
Expandido:
fonte