Um divisor de um número n é qualquer número que divida uniformemente n , incluindo 1 en . O número de divisores d (n) é quantos divisores um número possui. Aqui está d (n) para o primeiro casal n:
n divisors d(n)
1 1 1
2 1, 2 2
3 1, 3 2
4 1, 2, 4 3
5 1, 5 2
6 1, 2, 3, 6 4
Podemos subtrair repetidamente o número de divisores de um número. Por exemplo:
16 = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
9 - d( 9) = 9 - 3 = 6
6 - d( 6) = 6 - 4 = 2
2 - d( 2) = 2 - 2 = 0
Nesse caso, foram necessárias 5 etapas para chegar a 0.
Escreva um programa ou função que, dado um número não negativo n, retorne o número de etapas necessárias para reduzi-lo a 0 por subtração repetida do número de divisores.
Exemplos:
0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534
Respostas:
Geléia,
109 bytes1 byte graças a Dennis ♦ .
Porto da minha resposta em Pyth .
Experimente online!
Suíte de teste.
Explicação
fonte
Python, 49 bytes
O orlp ajudou a salvar um byte! E o Sp3000 economizou mais dois. Obrigado!
fonte
-~
para dentron%-~k
e removendo o limite inferior do intervalo.C, 52 bytes
fonte
Pitão, 10 bytes
Suíte de teste.
Explicação
fonte
Julia, 31 bytes
Implementação recursiva direta.
fonte
MATL , 14 bytes
Experimente online!
Explicação
fonte
JavaScript (ES6),
6451 bytesNão me pergunte por que eu estava usando desnecessariamente a recursão da cauda.
fonte
Java,
14793fonte
n=new Integer(100000)
invés den=100000
?05AB1E,
1210 bytesCódigo:
Explicação:
Experimente online
Edit: 2 bytes salvos e um erro com a entrada 0 corrigido graças a @Adnan
fonte
[Ð>#Ñg-¼]¾
. Tem que haver uma maneira de obtê-lo mais curto embora ...D0Q#
parte é após o incremento do contador. O[Ð>#Ñg-¼]¾
código deve funcionar0
embora :).R, 50 bytes
Implementação bastante simples. Experimente online
fonte
Mathcad, [tbd] bytes
O esquema de equivalência de bytes do Mathcad ainda está para ser determinado. Usando uma equivalência aproximada de pressionamento de tecla, o programa usa cerca de 39 "bytes". Observe que os operadores while e de programação levam apenas uma operação de teclado cada para inserir (ctl-] e ctl-shft- #, respectivamente) - na verdade, eles só podem ser inseridos dessa maneira a partir do teclado.
O que você vê é exatamente o que é colocado em uma planilha do Mathcad. O Mathcad avalia as equações / programas e coloca a saída na mesma folha (por exemplo, após o operador de avaliação '=' ou no gráfico).
fonte
MATL, 13 bytes
Experimente online
Explicação:
fonte
Mathematica, 35 bytes
Fazendo uso do bom e velho
DivisorSigma
. O @ MartinBüttner observa as seguintes alternativas:fonte
Hoon ,
9376 bytesUngolfed:
Retorna uma função que recebe um átomo
r
,. Crie um valor intermediário que contenha todos os desvisores der
(Make list [1..n], mantenha apenas os elementos em que (mod ri) == 0). Ser
for zero, retorne zero, caso contrário, retorne o valor incrementado de recorrência com r igual a r- (divisores de comprimento).O código como está leva uma quantidade estúpida de tempo para avaliar para n = 100.000, inteiramente porque encontrar os desvisores para grandes números faz uma lista gigante e mapeia sobre ele. Memoizar os divisores obtém a saída correta para n = 10.000, mas não me incomodei em esperar por 100.000
fonte
Haskell,
434039 bytesAbordagem recursiva simples. Exemplo de uso:
g 16
->5
.Edit: @Lynn salvou
34 bytes. Obrigado!fonte
g(sum$signum.mod n<$>[1..n])
?min 1
é realmente um byte menor do quesignum
, mesmoPowerShell v2 +,
7467 bytesParece bastante demorado em comparação com algumas das outras respostas ...
Recebe entrada
$n
, entra em umfor
loop com a condição que$n
é maior que0
. Cada iteração de loop é definida como auxiliar e$a
, em seguida, percorre todos os números de1
até$n
. Cada loop interno é checado em relação a todos os números para ver se é um divisor e, nesse caso, incrementamos nosso auxiliar$a
(usando negação booleana e conversão implícita implícita). Em seguida, subtraímos quantos divisores encontramos$n-=$a
e incrementamos nosso contador$o++
. Finalmente, nós produzimos$o
.Demora muito tempo para executar, pois é uma construção significativa para loop. Por exemplo, rodar
n = 10,000
na minha máquina (Core i5 de 1 ano) leva quase 3 minutos.fonte
Raquete -
126 bytes Até 98 bytes91 bytesUma solução extremamente ingênua - provavelmente poderia ser reduzida com um algoritmo decente e alguns truques de cocô que eu não conheçoEditar: explicação por solicitação. Como eu disse, essa é uma solução recursiva extremamente ingênua e pode ser muito mais curta.
Editar versão 2: 98 bytes com um algoritmo menos burro (ainda bastante burro e pode ser mais curto)Explicação:Editar 3: salvou 7 bytes substituindo
(cdr(build-list x values))
por(build-list x add1)
fonte
> <> , 52 + 2 = 54 bytes
O número de entrada precisa estar presente na pilha no início do programa, portanto, há +2 bytes para o
-v
sinalizador. Experimente online!4 bytes irritantes desperdiçados em questões de alinhamento. Bah.
Este funciona construindo a sequência de
n
para0
na pilha. Quando 0 for atingido, pop-lo e calcular o comprimento da pilha restante.A propósito, ele corre no
O(n^2)
tempo, então eu não tentarian = 100000
...fonte
-v
é um byte, não dois.> <> , 36 + 3 = 39 bytes
A implementação é relativamente direta, com cada iteração
sum(n%k>0 for k in range(1,n-1))
. +3 bytes para o-v
sinalizador, por meta .Experimente online!
fonte
Ruby, 42 bytes
Há um erro de estouro de pilha no maior caso de teste
100000
, então aqui está uma versão iterativa em 49 bytes . Demora um pouco, considerando aO(N^2)
complexidade.fonte
Perl 5, 40 bytes
Entrada e saída são como listas do número necessário de cópias de
1
.fonte
C #, 63 bytes
fonte
Na verdade, 17 bytes
Experimente online! (observação: o último caso de teste atinge o tempo limite no TIO)
Explicação:
fonte