Inspirado por esta pergunta em Matemática .
O problema
Let
n
Ser um número natural≥ 2
. Pegue o maior divisor den
- que é diferente den
si mesmo - e subtraia-o den
. Repita até você chegar1
.
A questão
Quantas etapas são necessárias para alcançar 1
um determinado número n ≥ 2
.
Exemplo Detalhado
Let
n = 30
.
O maior divisor de:
1. 30 is 15 --> 30 - 15 = 15
2. 15 is 5 --> 15 - 5 = 10
3. 10 is 5 --> 10 - 5 = 5
4. 5 is 1 --> 5 - 1 = 4
5. 4 is 2 --> 4 - 2 = 2
6. 2 is 1 --> 2 - 1 = 1
São necessários 6 passos para chegar 1
.
Entrada
- Entrada é um número inteiro
n
, onden ≥ 2
. - Seu programa deve oferecer suporte até o valor inteiro máximo do idioma.
Resultado
- Basta imprimir o número de etapas, como
6
. - Espaços em branco à esquerda / à direita ou novas linhas são bons.
Exemplos
f(5) --> 3
f(30) --> 6
f(31) --> 7
f(32) --> 5
f(100) --> 8
f(200) --> 9
f(2016^155) --> 2015
Exigências
- Você pode obter entrada de
STDIN
argumentos de linha de comando, como parâmetros de função ou do equivalente mais próximo. - Você pode escrever um programa ou uma função. Se for uma função anônima, inclua um exemplo de como invocá-la.
- Este é o código-golfe, pelo que a resposta mais curta em bytes vence.
- As brechas padrão não são permitidas.
Esta série também pode ser encontrada no OEIS: A064097
Um quase-logaritmo definido indutivamente por
a(1) = 0
ea(p) = 1 + a(p-1)
sep
é primo ea(n*m) = a(n) + a(m)
sem,n > 1
.
code-golf
math
arithmetic
insertusernamehere
fonte
fonte
2^32 - 1
. O resto é com você e seu sistema. Espero que seja isso que você quis dizer com sua pergunta.Respostas:
Geléia , 9 bytes
Experimente online! ou verifique todos os casos de teste .
fundo
A definição da sequência A064097 implica que
Pela fórmula do produto de Euler
onde φ denota a função totiente de Euler ep varia apenas sobre os números primos.
Combinando ambos, deduzimos a propriedade
onde ω denota o número de fatores primos distintos de n .
Aplicando o resultante fórmula k + 1 vezes, onde k é grande o suficiente de modo que φ k + 1 (n) = 1 , obtemos
A partir dessa propriedade, obtemos a fórmula
onde a última igualdade é válida porque ω (1) = 0 .
Como funciona
fonte
05AB1E ,
1311 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
[¼Ñü-¤ÄD#]¾
- Eu estava perto de raspar um byte com o par, oh bem ...[Ð#Ò¦P-¼]¾
.Ð
é melhor queDD
.Pitão, 11 bytes
Suíte de teste
Um loop direto de repetição até a verdade.
Explicação:
fonte
f
filtro.f
?f
sem um segundo argumento itera sobre todos os números inteiros positivos a partir de1
e retorna o primeiro valor que é verdadeiro na instrução interna. Esse valor não é usado neste programa, portanto, ele retorna o número de vezes que foi executado. Não documentado, apenas não ortodoxo :) Se ajudar, você pode pensar nisso como umfor
loop como:for(int i=1; some_condition_unrelated_to_i; i++) { change_stuff_that_affects_condition_but_not_i;}
f <l:T> <none>
),f
é a primeira entrada em queA(_)
acabou[1, 2, 3, 4...]
.Python 2,
5049 bytesIsso não vai terminar o último caso de teste tão cedo ...
Como alternativa, aqui está um 48 bytes que retorna em
True
vez de1
paran=2
:fonte
Gelatina , 10 bytes
Experimente online! ou verifique a maioria dos casos de teste . Os últimos casos de teste são concluídos rapidamente localmente.
Como funciona
fonte
Retina , 12
Isso pressupõe a entrada dada em unário e a saída fornecida em decimal. Se isso não for aceitável, podemos fazer isso por mais 6 bytes:
Retina , 18
Experimente online - 1ª linha adicionada para executar todos os casos de teste de uma só vez.
Infelizmente, isso é unário para os cálculos, portanto, a entrada de 2016 155 não é prática.
1
sfonte
\b
.Pitão -
151413 bytesInvólucro especial
1
está realmente me matando.Experimente online aqui .
fonte
1
?1
é[]
, o que causa um erro quando pego o primeiro elemento. Eu tenho um caso especial para fazê-lo retornar1
novamente, para que o.u
ponto fixo termine. Eu encontrei uma maneira melhor do que.x
tentar, exceto que é o que me salvou esses 2 bytes..u
ponto fixo acabará alcançando1
todas as informações, e nesse ponto terá que ser revestido de maneira especial.JavaScript (ES6),
* 4438Editar 6 bytes salvos graças a l4m2
(* 4 marcado ainda é 4)
Função recursiva
Menos golfe
Teste
fonte
f=(n,d=n)=>n>1?n%--d?f(n,d):f(n-d)+1:0
?Mathematica, 36 bytes
Uma função sem nome usa os mesmos bytes:
Essa é uma implementação muito direta da definição como uma função recursiva.
fonte
Oitava,
595855 bytesAmostras de execuções:
fonte
end
necessário na oitava?Haskell, 59 bytes
Uso:
Pode ser um pouco ineficiente para grandes números por causa da geração da lista.
fonte
<1
, em vez de==0
salvar alguns bytes:f 1=0;f n=1+f(n-last[a|a<-[1..n
div2],mod n a<1])
Julia,
56504539 bytesEsta é uma função recursiva que aceita um número inteiro e retorna um número inteiro.
Ungolfed:
Experimente online! (inclui todos os casos de teste)
Economizou 6 bytes graças a Martin Büttner e 11 graças a Dennis!
fonte
PowerShell v2 +, 81 bytes
Mais brutal da força bruta.
Recebe entrada
$a
, entra em umfor
loop até que$a
seja menor ou igual a1
. Cada loop passamos por outrofor
loop que faz a contagem regressiva$a
até encontrarmos um divisor (!($a%$i
). Na pior das hipóteses, vamos encontrar$i=1
como um divisor. Quando o fazemos, incrementa nosso contador$j
, subtrai nosso divisor$a-=$i
e define$i=0
para sair do loop interno. Eventualmente, chegaremos a uma condição em que o loop externo é falso (ou seja,$a
atingiu1
), portanto, produza$j
e sai.Cuidado : Isso levará muito tempo em números maiores, especialmente números primos. A entrada de 100.000.000 leva ~ 35 segundos no meu laptop Core i5. Editar - apenas testei com
[int]::MaxValue
(2 ^ 32-1) e levou ~ 27 minutos. Não é tão ruim, suponho.fonte
Matlab, 58 bytes
fonte
Japt , 12 bytes (não concorrente)
Teste online! Não concorrente porque usa vários recursos que foram adicionados após o lançamento do desafio.
Como funciona
Essa técnica foi inspirada na resposta 05AB1E . Uma versão anterior usada
²¤
(pressione 2, corte os dois primeiros itens) no lugarÅ
porque é um byte mais curto ques1
(observe o espaço à direita); Eu só percebi depois do fato de que, como isso acrescenta um 2 ao final da matriz e fatias desde o início , ele de fato falha em qualquer número composto ímpar, embora funcione em todos os casos de teste.fonte
Python 3,
75, 70, 67 bytes.Esta é uma solução recursiva bastante direta. Demora MUITO tempo para os casos de teste de número elevado.
fonte
> <>, 32 bytes
Espera o número de entrada,,
n
na pilha.Este programa constrói a sequência completa na pilha. Como o único número que pode levar a isso
1
é2
, a construção da sequência pára quando2
é atingido. Isso também faz com que o tamanho da pilha seja igual ao número de etapas, em vez do número de etapas +1.fonte
Ruby, 43 bytes
Encontre o menor número
i
quex
dividex-i
e recorra até chegarmos1
.fonte
Haskell, 67 bytes
Aqui está o código:
E aqui está uma razão pela qual Haskell é incrível:
Sim, no Haskell você pode definir
-->
como equivalente==
.fonte
Matlab, 107 bytes
fonte
MATL,
1716 bytesExperimente Online
Explicação
fonte
C99,
6261 bytes1 byte jogado fora por @Alchymist.
Chame como f (x, & y), onde x é a entrada e y é a saída.
fonte
Julia,
3936 bytesExperimente online!
fonte
Clojure,
116104 bytes-12 bytes, filtrando um intervalo para encontrar múltiplos e usando
last
um para obter o melhorSolução ingênua que basicamente resolve o problema, conforme descrito pelo OP. Infelizmente, encontrar o maior divisor sozinho ocupa metade dos bytes usados. Pelo menos eu deveria ter muito espaço para jogar golfe daqui.
Pré -olfo e teste:
fonte
Perl 6 , 35 bytes
Experimente online!
Como funciona
fonte
Pitão,
1716 bytesExperimente online! (O
y.v
final é para chamada de função)17 bytes originais:
Experimente online! (O
y.v
final é para chamada de função)(Na verdade, eu respondi a essa pergunta com este programa Pyth.)
fonte
u
provavelmente será menor do que a recursão real.Pyke, 11 bytes (não competitivo)
Isso usa um novo comportamento no qual, se houver uma exceção gerada após um goto, ele restaura o estado anterior ao goto (exceto definições de variáveis) e continua. Nesse caso, é equivalente ao seguinte código python:
Tudo isso é possível usando o Pyke sem uma construção de loop while - yay goto!
Experimente aqui!
fonte
JavaScript (ES6),
7054 bytesImplementação da fórmula recursiva fornecida, mas agora atualizada para usar a recursão para encontrar também o divisor.
fonte
Perl, 57 + 1 (
-p
sinalizador) = 58 bytesUso:
Ungolfed:
fonte
Clojure,
9896 bytesusa
for
:when
para encontrar o maior divisor, faz um loop até que nenhum valor maior que um seja encontrado.fonte