Conte os divisores de um número


26

Introdução

Este é um desafio muito simples: basta contar os divisores de um número. Tivemos um desafio semelhante, mas mais complicado antes, mas pretendo que este seja de nível básico.

O desafio

Crie um programa ou função que, dado um número inteiro estritamente positivo N, produza ou retorne quantos divisores possui, incluindo 1 e N.

Entrada: Um número inteiro> 0. Você pode assumir que o número pode ser representado no tipo numérico nativo do seu idioma.

Saída: O número de divisores inteiros positivos que possui, incluindo 1 e o próprio número.

As submissões serão pontuadas em bytes . Você pode encontrar este site à mão, embora possa usar qualquer método razoável para gerar sua contagem de bytes.

Isso é , então a pontuação mais baixa ganha!

Edit: Parece que a resposta Pyth de 5 bytes de FryAmTheEggman é a vencedora! Sinta-se livre para enviar novas respostas; se você conseguir algo mais curto, mudarei a resposta aceita.

Casos de teste

ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9

Classificação

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Se você deseja incluir vários números no seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

# Perl, 43 + 2 (-p flag) = 45 bytes

Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Respostas:


19

Pitão, 5

l{yPQ

Usa a operação de subconjuntos nos fatores primos da entrada, mantém apenas as listas exclusivas de fatores e retorna essa contagem.

Suíte de teste

Explicação

Usando 25 como exemplo, para que a lista de subconjuntos não seja muito longa

l{yPQ     ## implicit:  Q = eval(input()) so Q == 25
   PQ     ## Prime factors of Q, giving [5, 5]
  y       ## All subsets, giving [[], [5], [5], [5, 5]]
 {        ## Unique-fiy, giving [[], [5], [5, 5]]
l         ## Length, print implicity

Fascinante. Aproximação agradável
Cyoce 9/04

14

C ++ C, 43 57 56 46 43 bytes

Nas sugestões de Martin Büttner:

i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}

1
Espere, vamos contar os dois para baixo, por 43:i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
Martin Ender

@ MartinBüttner Uau cara uau. A sério! _ / \ _
Sahil Arora

1
Lindo! : ~)!
Sweerpotato

11

LabVIEW, 4938 bytes

Bem, obviamente, não é adequado para o código de golfe, mas tanto faz, então para o meu primeiro post e o lolz aqui vai. insira a descrição da imagem aqui


Bem-vindo à Programação de Puzzles e Code Golf! Como você pontuou isso, se você não se importa que eu pergunte? Não encontrei nenhum precedente no Meta.
bkul

i salvou e levou o tamanho dele
Eumel

E eram 4.938 bytes? Não kilobytes, por exemplo?
bkul

para a exatidão i tomou a contagem de bytes não a contagem kb
Eumel

4
@ Bkul Eu acho que a confusão é devido ao ., que eu tenho certeza que é um separador de milhar, não um ponto decimal (como é comum em alguns idiomas).
Martin Ender

10

Haskell, 28 bytes

f n=sum[0^mod n i|i<-[1..n]]

O truque aqui é testar se um restante está 0usando a função do indicador 0^.

0^0 = 1
0^_ = 0

Isso funciona porque qualquer potência positiva de 0 é 0, enquanto 0 ^ 0 é combinatorialmente o produto vazio de 1.

Compare isso com a filtragem

f n=sum[1|i<-[1..n],mod n i<1]

7

Dyalog APL , 7 6 bytes

≢∘∪⊢∨⍳

É uma função sem nome que pode ser nomeada e reutilizada para cada ¨caso de teste ( ) da seguinte maneira:

      f ← ≢∘∪⊢∨⍳
      f¨ 1 2 12 30 60 97 100
1 2 6 8 12 2 9

Explicação:

 ┌─┴──┐  
 ∪  ┌─┼─┐
 ∘  │ ∨ │
 ̸≡  ⊢   ⍳

Conte o único do GCD de si mesmo e cada um dos números inteiros até .

Obrigado ao ngn por salvar um byte.


Versão antiga: +/0=⍳|⊢

É assim que funciona:

  ┌─┴─┐      
  / ┌─┼───┐  
┌─┘ 0 = ┌─┼─┐
+       ⍳ | ⊢

⍳|⊢1-através do argumento argumento restante da divisão
0=Booleano se 0 for igual à divisão rest
+/Soma do booleano, ou seja, contagem de unidades.


6

Python 2, 37 bytes

f=lambda n,i=1:i/n or(n%i<1)+f(n,i+1)

Uma função recursiva. A entrada opcional ino divisor que está sendo testado. A expressão (n%i<1)testa divisibilidade, com True(que é igual 1) para divisores. O resultado é adicionado à expressão recusativa para i+1. Quando i==né atingido, a divisão de piso inteiro é i/navaliada como 1e esse valor é retornado como o caso base, nsendo considerado um divisor de n.


38:

lambda n:sum(n%-~i<1for i in range(n))

Uma função anônima. Testes de todos os divisores possíveis 1através n. Esta é deslocado para cima de 0meio n-1em range(n)uso -~, o que acrescenta 1. A soma dos bools usa o fato de o Python tratar True/ Falsecomo 1/ 0.


6

Retina , 17 bytes

(?<=(.+))(?=\1*$)

Entrada em unário , saída em decimal.

Experimente online.

Quando invocada com um único regex, o Retina simplesmente conta as correspondências. O próprio regex corresponde a uma posição , onde o número unário à esquerda dele é um divisor de toda a entrada. Também estou fazendo uso do fato de que as lookarounds são atômicas, para que eu não precise usar uma ^âncora.

O primeiro lookbehinds simplesmente captura o prefixo inteiro no grupo 1. Isso nunca pode falhar, então, depois do olhar para trás, sabemos que é o que está no grupo 1 e que não mudará mais.

O lookahead então verifica se podemos chegar ao final da string repetindo a string capturada (nosso divisor em potencial) 0 ou mais vezes.


6

J, 10 bytes

[:*/1+_&q:

Este é um verbo monádico sem nome. Calcula σ 0 (∏p k α k ) como ∏ (α k + 1) .

Experimente online com J.js .

Como funciona

[:*/1+_&q:    Right argument: y

      _&q:    Compute all exponents of the prime factorization of y.
    1+        Add 1 to each exponent.
[:*/          Reduce by mutiplication.

Não acho que q:seja permitido, pois resolve uma parte essencial do desafio. Como apenas cerca de[:+/0=]|~1+i.
FUZxxl

Isso seria uma duplicata desta resposta . Além disso, os embutidos não são proibidos por padrão, e o desafio não parece mencioná-los.
Dennis

Geralmente, as construções que fazem todo / quase todo o trabalho de um desafio, mas eu posso seguir o seu raciocínio q: .
FUZxxl

1
Eles não são. Eu gostaria que eles fossem, mas não são.
Dennis

Hrmpf hrmpf que suga um pouco.
FUZxxl

6

Golfscript, 19 18 17 13 bytes

Com agradecimentos a Martin Büttner .

~.,\{\)%!}+,,

Como funciona

~               Evaluate the input, n
 .,             Duplicate the input, create array [0..n-1]
   \            Swap array and n
    {    }+     Add n to block == {n block}
     \          Swap n with i in array
      )         Increment i
       %        n mod i
        !       Logical not so that 1 if divisible by n else 0
           ,    Filter array using block for all i divisible by n
            ,   Get length of the filtered array, the answer

Além disso

De @Peter Taylor , também em 13 bytes.

~:X,{)X\%!},,

Como funciona

~               Evaluate the input
 :X             Store input in variable X
   ,            Create array [0..X-1]
    {     },    Filter array using the following block
     )          Increment i in array
      X\        Add X to stack, swap with i
        %       X mod i,
         !      Logical not so that 1 if divisible by n else 0
            ,   Get length of the filtered array, the answer

Para o mesmo comprimento que você também poderia ter~:X,{)X\%!},,
Peter Taylor

4

J, 13 12 11 bytes

Meu primeiro golfe em J. Ainda estou aprendendo.

Guardou um byte graças a Dennis.

Economizou mais um byte graças a randomra.

1+/@,0=i.|]

Explicação:

1+/@,0=i.|]
       i.        the array 0 .. n-1
         |]      mod n
     0=          replace 0 by 1, and nonzero entries by 0
1   ,            prepend 1 to the array
 +/@             take the sum

3

Arcyóu , 12 bytes

Vamos começar a festa!

(F(x)(_(d/ x

Isso usa a função interna d/. Aqui está uma versão sem o built-in (27 bytes):

(F(x)(](+(f i(_ 1 x)(‰ x i

Explicação:

(F(x)              ; Anonymous function with one parameter x
  (]               ; Increment
    (+             ; Sum
      (f i(_ 1 x)  ; For i in range from 1 to x-1 inclusive:
        (‰ x i     ; x divisible by i

3

CJam, 11 bytes

ri_,:)f%0e=

Teste aqui.

Explicação

O CJam não tem um built-in para isso, então estamos fazendo a divisão de teste.

ri  e# Read input and convert to integer N.
_,  e# Duplicate and turn into range [0 1 ... N-1]
:)  e# Increment each element in the range to get [1 2 ... N]
f%  e# Take N modulo each of the list elements.
0e= e# Count the zeroes.

Bônus

Aqui está uma solução interessante em 12 bytes (que eu suspeito que possa ser a mais curta em um idioma como J):

ri_)2m*::*e=

O resultado é igual ao número de vezes que naparece em uma n x ntabela de multiplicação:

ri  e# Read input and convert to integer N.
_)  e# Duplicate and increment.
2m* e# Take Cartesian product of [0 1 ... N] with itself.
::* e# Compute the product of each pair.
e=  e# Count the occurrences of N.

3

Matlab, 20 bytes

Execute k mod npara todos k = 1,...,n, depois execute not(que transforma cada nonzer em zero e cada zero em 1) e some todos esses valores.

@(n)sum(~mod(n,1:n))

Esta teria sido a minha abordagem também!
Luis Mendo

Interessante que esse é o mesmo comprimento que length(divisors(n)).
Acumulação 24/04

@Acccumulation você ainda precisa adicionar um @(n)para torná-lo uma submissão válida
flawr 24/04

3

Julia, 20 bytes

n->sum(i->n%i<1,1:n)

Esta é uma função anônima que funciona da seguinte maneira: Para cada número inteiro de 1 à entrada, teste se o módulo de entrada é zero. Nesse caso, o valor será true, caso contrário false. Somamos os booleanos que são implicitamente convertidos em números inteiros, produzindo o número de divisores.


Uma solução muito mais fria (embora também muito mais longa), incluída por uma questão de perfeição, é

n->prod(collect(values(factor(n))).+1)

Isso obtém a fatoração canônica de n, ie \prod_{i=1}^k p_i^e_i, e calcula a função divisora ​​como τ(n) = \prod_{i=1}^k e_i + 1.




2

Ruby, 27 bytes

->n{(1..n).count{|i|n%i<1}}

Exemplo de execução:

2.1.5 :001 > ->n{(1..n).count{|i|n%i<1}}[100]
 => 9 


2

Regex (.NET), 33 bytes

^((?=.*$(?<=^\2*(.+?(?>\2?)))).)+

Supondo que entrada e saída estejam unárias, e a saída é obtida da correspondência principal da regex.

Divisão da regex:

  • .*$ coloca o ponteiro no final da string para que tenhamos toda a entrada x em uma direção.
  • (?<=^\2*(.+?(?>\2?))) corresponde da direita para a esquerda e verifica o divisor fazendo um loop de x a 0.
    • (.+?(?>\2?)) é uma "variável" que começa em 1 na primeira iteração e continua no número na iteração anterior e faz um loop até x.
    • ^\2* verifica se x é um múltiplo de "variável".

Basicamente, tem a mesma idéia que a minha resposta para Calcular Phi (não Pi) . Somente a verificação é diferente.

Teste a regex em RegexStorm .


2

Labirinto , 33 bytes

?:}
  :{:}%{{
@ }   " )
!{("{;"}}

Experimente online.

Isso implementa a divisão de teste. Vou adicionar uma explicação completa mais tarde. Provavelmente não é o ideal, mas estou tendo dificuldades para encontrar algo mais curto.


2

Perl 6 , 17 bytes

{[+] $_ X%%1..$_} # 17

uso:

say {[+] $_ X%%1..$_}(60); # 12␤

my $code = {[+] $_ X%%1..$_};

say $code(97); # 2␤

my &code = $code;
say code 92; # 6

2

Javascript (ES6), 60 57 42 40 39 37 bytes

Provavelmente isso pode ser jogado melhor.

n=>{for(d=i=n;i;n%i--&&d--);return d}

Edit 1: Eu estava certo. Removidos os chavetas após o loop for.

Edit 2: Golfed to 40 bytes with thanks to manatwork and Martin Büttner .

Edit 3: Salvando um byte baseando a função na resposta C acima.

Edit 4: Graças a ן nɟuɐɯɹɐ ן oɯ e Neil , mas não consigo fazer o avaliação funcionar.

Edit 5: Esqueceu de remover o eval.

Teste

n = <input type="number" oninput='result.innerHTML=(

n=>{for(d=i=n;i;n%i--&&d--);return d}

)(+this.value)' /><pre id="result"></pre>


2
Desista dos bons hábitos. Remova varpalavras-chave. Mais dicas em Dicas para jogar golfe em JavaScript e Dicas para jogar golfe no ECMAScript 6 .
manatwork

2
Desista também dos maus hábitos: quando você tiver uma escolha entre ++ie i++, escolha o primeiro (isso não tem nada a ver com golfe). Também n%i<1deve salvar um byte.
Martin Ender

2
Apenas brevemente testado:n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
manatwork 27/11

1
38: n => eval ('for (d = 0, i = n; i; d + = n% i - <1); d')
Mama Fun Roll

1
@manatwork Por que não n%++i||++d?
Neil

2

PowerShell, 34 bytes

param($x)(1..$x|?{!($x%$_)}).Count

e.g. 

PS C:\temp> .\divisors-of-x.ps1 97
2
  • crie uma lista de números de 1 a x, alimente-os no pipeline |
  • filtre o pipeline (x% item == 0), lançando implicitamente o resultado do módulo como um booleano e invertendo-o usando-o !para que os divisores se tornem $ true e permitidos; usando o alias interno ?paraWhere-Object
  • reunir ()e .Countquantos itens passaram pelo filtro

Muito bem hackeado!
bkul

2

Gelatina , 2 bytes (não concorrente (novamente))

Æd

Experimente online!

Eu acho que isso usa recursos implementados após a outra resposta Jelly. Comente se estou errado (não consigo olhar cada commit na linha, você sabe :))


2

Táxi, 2143 bytes

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Cyclone.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Cyclone:n 1 l.Pickup a passenger going to Firemouth Grill.Pickup a passenger going to Joyless Park.Go to Firemouth Grill:s 1 l 2 l 1 r.Go to Joyless Park:e 1 l 3 r.[i][Check next value n-i]Go to Zoom Zoom:w 1 r 2 l 2 r.Go to Sunny Skies Park:w 2 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Sunny Skies Park.Go to Joyless Park:n 2 r 2 r 2 l.Pickup a passenger going to Cyclone.Go to Sunny Skies Park:w 1 r 2 l 2 l 1 l.Go to Cyclone:n 1 l.Pickup a passenger going to Joyless Park.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:n 2 r 2 r 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Trunkers.Pickup a passenger going to Equal's Corner.Go to Trunkers:s 1 l.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:w 1 l.Switch to plan "F" if no one is waiting.Pickup a passenger going to Knots Landing.Go to Firemouth Grill:n 3 r 1 l 1 r.Pickup a passenger going to The Underground.Go to The Underground:e 1 l.Pickup a passenger going to Firemouth Grill.Go to Knots Landing:n 2 r.Go to Firemouth Grill:w 1 l 2 r.Go to Joyless Park:e 1 l 3 r.Switch to plan "N".[F][Value not a divisor]Go to Joyless Park:n 3 r 1 r 2 l 4 r.[N]Pickup a passenger going to The Underground.Go to The Underground:w 1 l.Switch to plan "E" if no one is waiting.Pickup a passenger going to Joyless Park.Go to Joyless Park:n 1 r.Switch to plan "i".[E]Go to Sunny Skies Park:n 3 l 2 l 1 l.Pickup a passenger going to What's The Difference.Go to Firemouth Grill:s 1 l 1 l 1 r.Pickup a passenger going to What's The Difference.Go to What's The Difference:w 1 l 1 r 2 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Experimente online!

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left 2nd right.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st right.
Go to Cyclone: north 1st left.
Pickup a passenger going to Firemouth Grill.
Pickup a passenger going to Joyless Park.
Go to Firemouth Grill: south 1st left 2nd left 1st right.
Go to Joyless Park: east 1st left 3rd right.
[i]
[Check next value n-i]
Go to Zoom Zoom: west 1st right 2nd left 2nd right.
Go to Sunny Skies Park: west 2nd left.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Sunny Skies Park.
Go to Joyless Park: north 2nd right 2nd right 2nd left.
Pickup a passenger going to Cyclone.
Go to Sunny Skies Park: west 1st right 2nd left 2nd left 1st left.
Go to Cyclone: north 1st left.
Pickup a passenger going to Joyless Park.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer: north 2nd right 2nd right 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st left 1st left 2nd left.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Equal's Corner.
Go to Trunkers: south 1st left.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: west 1st left.
Switch to plan "F" if no one is waiting.
Pickup a passenger going to Knots Landing.
Go to Firemouth Grill: north 3rd right 1st left 1st right.
Pickup a passenger going to The Underground.
Go to The Underground: east 1st left.
Pickup a passenger going to Firemouth Grill.
Go to Knots Landing: north 2nd right.
Go to Firemouth Grill: west 1st left 2nd right.
Go to Joyless Park: east 1st left 3rd right.
Switch to plan "N".
[F]
[Value not a divisor]
Go to Joyless Park: north 3rd right 1st right 2nd left 4th right.
[N]
Pickup a passenger going to The Underground.
Go to The Underground: west 1st left.
Switch to plan "E" if no one is waiting.
Pickup a passenger going to Joyless Park.
Go to Joyless Park: north 1st right.
Switch to plan "i".
[E]
Go to Sunny Skies Park: north 3rd left 2nd left 1st left.
Pickup a passenger going to What's The Difference.
Go to Firemouth Grill: south 1st left 1st left 1st right.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: west 1st left 1st right 2nd right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: east 3rd right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Explicação:

Convert stdin to a number and store it in three locations for three purposes:
   Original (Sunny Skies Park)
   Counter for tested values (Joyless Park)
   Counter for divisors found (Firemouth Grill)
Divide the original by each Joyless Park value in turn.
If the division result equals the truncated division result, then it's a divisor.
When a divisor is found, subtract one from Firemouth Grill.
Repeat until Joyless Park hits zero.
Pickup the original from Sunny Skies Park and subtract the value from Firemouth Grill.
Convert the result to a string and print to stdout.


2

Fórmula do Excel, 42 28 bytes

Edit: Acabei de perceber que não preciso usar INDIRECT, economizando 14 bytes!

O seguinte deve ser inserido como uma fórmula de matriz ( Ctrl+ Shift+ Enter):

=SUM(--NOT(MOD(N,ROW(1:N))))

Onde N é o número a ser testado.

Exemplos:

{SUM(--NOT(MOD(32,ROW(1:32))))}
Result: 6
{SUM(--NOT(MOD(144,ROW(1:144))))}
Result: 15

Explicação:

SUM(--NOT(MOD(N,ROW(1:N))))       Full formula

                ROW(1:N)          Generates an array of row numbers e.g {1;2;3;4;...N}
          MOD(N,ROW(1:N))         Does N MOD {1;2;3;4;,...N}
      NOT(MOD(N,ROW(1:N)))        Coerces zeros to ones, so that they may be counted, but actually returns an array of TRUE;FALSE;FALSE;...
    --NOT(MOD(N,ROW(1:N)))        Coerces the TRUEs to 1s and FALSEs to 0s.
SUM(--NOT(MOD(N,ROW(1:N))))       Sum the ones for the result.


1

Mathematica, 16 bytes

Length@*Divisors

Composição simples de funções dos built-ins.


1

Referência 0.13 , 16 bytes

ndd[0ci1+%,-]-N.

Verifique todos os casos aqui.

Explicação

ndd           Takes number from input and duplicates it twice (n)
[             Opens for loop that runs n times
 0c           Copies bottom of stack to top (n)
   i1+        Loop counter + 1 (d)
      %       Modulo - pops d,n, then pushes n%d
       ,      Not - 1 if equal to 0, 0 otherwise
        -     Subtract
         ]    Close for loop
-             Subtract (n - 1 for each non-divisor)
N.            Output as number and stop.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.