Cuenta los divisores de un número


26

Introducción

Este es un desafío muy simple: simplemente cuente los divisores de un número. Hemos tenido un desafío similar pero más complicado antes, pero tengo la intención de que este sea de nivel de entrada.

El reto

Cree un programa o función que, dado un entero estrictamente positivo N, emite o devuelve cuántos divisores tiene, incluidos 1 y N.

Entrada: Un entero> 0. Puede suponer que el número puede representarse en el tipo numérico nativo de su idioma.

Salida: El número de divisores enteros positivos que tiene, incluido 1 y el número mismo.

Las presentaciones se puntuarán en bytes . Puede encontrar este sitio web a mano, aunque puede usar cualquier método razonable para generar su recuento de bytes.

Este es el , por lo que gana el puntaje más bajo.

Editar: ¡Parece que la respuesta Pyth de 5 bytes de FryAmTheEggman es la ganadora! Sin embargo, siéntase libre de enviar nuevas respuestas; Si puede obtener algo más corto, cambiaré la respuesta aceptada.

Casos de prueba

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

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (p. Ej., Porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de los intérpretes por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

Respuestas:


19

Pyth, 5

l{yPQ

Utiliza la operación de subconjuntos en los factores primos de la entrada, luego mantiene solo las listas únicas de factores y devuelve este recuento.

Banco de pruebas

Explicación

Usando 25 como ejemplo, para que la lista de subconjuntos no sea muy larga

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. Buen enfoque
Cyoce

14

C ++ C, 43 57 56 46 43 bytes

Sobre las sugerencias de Martin Büttner:

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

1
Espere, cuentemos ambos en su lugar, para 43:i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
Martin Ender

@ MartinBüttner Wow hombre wow. ¡Seriamente! _ / \ _
Sahil Arora

1
¡Hermosa! : ~)!
sweerpotato

11

LabVIEW, 4938 Bytes

Bueno, obviamente no es adecuado para el golf de código, pero lo que sea, así que para mi primer post y el lolz aquí va. ingrese la descripción de la imagen aquí


¡Bienvenido a Programming Puzzles y Code Golf! ¿Cómo calificaste esto, si no te importa que te pregunte? No pude encontrar ningún precedente en Meta.
bkul

lo
guardé

¿Y fue 4.938 bytes? ¿No kilobytes, por ejemplo?
bkul

para mayor precisión, tomé el recuento de bytes, no el recuento de kb
Eumel

44
@bkul Creo que la confusión se debe a .que, estoy bastante seguro, significa un separador de miles, no un punto decimal (como es común en algunos idiomas).
Martin Ender

10

Haskell, 28 bytes

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

El truco aquí es probar si un resto está 0usando la función de indicador 0^.

0^0 = 1
0^_ = 0

Esto funciona porque cualquier potencia positiva de 0 es 0, mientras que 0 ^ 0 es combinatoriamente el producto vacío de 1.

Compare esto con el filtrado

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

7

Dyalog APL , 7 6 bytes

≢∘∪⊢∨⍳

Es una función sin nombre que puede nombrarse y luego reutilizarse para cada ¨caso de prueba ( ) de la siguiente manera:

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

Explicación:

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

Cuente lo único del GCD de sí mismo y cada uno de los enteros hasta .

Gracias a ngn por guardar un byte.


Versión antigua: +/0=⍳|⊢

Así es como funciona:

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

⍳|⊢Argumento 1-a través del argumento división-resto
0=Booleano si 0 es igual al resto de división
+/Suma del booleano, es decir, recuento de unos.


6

Python 2, 37 bytes

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

Una función recursiva. La entrada opcional ien el divisor que se está probando. La expresión (n%i<1)prueba la divisibilidad, con True(que es igual 1) para divisores. El resultado se agrega a la expresión recusiva para i+1. Cuando i==nse alcanza, la división de piso entera se i/nevalúa como 1, y ese valor se devuelve como el caso base, contando a nsí mismo como un divisor de n.


38:

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

Una función anónima. Prueba todos los divisores posibles a 1través n. Esto se desplaza hacia arriba a partir 0a través n-1de range(n)usar -~, lo que añade 1. Sumando los bools usa el hecho de que Python trata True/ Falsecomo 1/ 0.


6

Retina , 17 bytes

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

Entrada en unario , salida en decimal.

Pruébalo en línea.

Cuando se invoca con una sola expresión regular, Retina simplemente cuenta las coincidencias. La expresión regular en sí coincide con una posición , donde el número unario a la izquierda es un divisor de toda la entrada. También estoy haciendo uso del hecho de que las búsquedas son atómicas, por lo que no necesito usar un ^ancla.

La primera mirada atrás simplemente captura todo el prefijo en grupo 1. Esto nunca puede fallar, así que después de mirar hacia atrás sabemos que eso es lo que hay en el grupo 1 y que ya no cambiará más.

La búsqueda anticipada luego verifica si podemos alcanzar el final de la cadena repitiendo la cadena capturada (nuestro divisor potencial) 0 o más veces.


6

J, 10 bytes

[:*/1+_&q:

Este es un verbo monádico sin nombre. Calcula σ 0 (∏p k α k ) como ∏ (α k + 1) .

Pruébelo en línea con J.js .

Cómo 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.

No creo que q:esté permitido, ya que resuelve una parte esencial del desafío. ¿Qué tal solo[:+/0=]|~1+i.
FUZxxl

Eso sería un duplicado de esta respuesta . Además, las funciones integradas no están prohibidas de forma predeterminada, y el desafío no parece mencionarlas.
Dennis

Las construcciones que hacen todo / casi todo el trabajo de un desafío generalmente están prohibidas, pero puedo seguir tu razonamiento q: .
FUZxxl

1
No son. Desearía que lo fueran, pero no lo son.
Dennis

Hrmpf hrmpf que apesta un poco.
FUZxxl

6

Golfscript, 19 18 17 13 bytes

Con gracias a Martin Büttner .

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

Cómo 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

también

De @Peter Taylor , también en 13 bytes.

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

Cómo 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

Por la misma duración que también podría tener~:X,{)X\%!},,
Peter Taylor

4

J, 13 12 11 bytes

Mi primer golf en J. Todavía lo estoy aprendiendo.

Salvó un byte gracias a Dennis.

Se guardó un byte más gracias a randomra.

1+/@,0=i.|]

Explicación:

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

¡Que empiece la fiesta!

(F(x)(_(d/ x

Esto usa la función incorporada d/. Aquí hay una versión sin el incorporado (27 bytes):

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

Explicación:

(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=

Pruébalo aquí.

Explicación

CJam no tiene una función integrada para esto, por lo que estamos haciendo una división de prueba.

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.

Prima

Aquí hay una solución interesante en 12 bytes (que sospecho que podría ser más corta en un lenguaje como J):

ri_)2m*::*e=

El resultado es igual al número de veces que naparece en una n x ntabla de multiplicar:

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

Realice k mod npara cada k = 1,...,n, luego realice not(que convierte cada nonzer en cero y cada cero en 1) y sume todos esos valores.

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

¡Este también habría sido mi enfoque!
Luis Mendo

Es interesante que tenga la misma longitud que length(divisors(n)).
Acumulación

@Acumulación aún necesitaría agregar un @(n)para que sea una sumisión válida
error

3

Julia, 20 bytes

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

Esta es una función anónima que funciona de la siguiente manera: para cada entero desde 1 hasta la entrada, pruebe si el módulo de entrada del entero es cero. Si es así, el valor será true, de lo contrario false. Sumamos los booleanos que se convierten implícitamente en enteros, produciendo el número de divisores.


Una solución mucho más fresca (aunque también mucho más larga), incluida en aras de la integridad, es

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

Esto obtiene la factorización canónica de n, es decir \prod_{i=1}^k p_i^e_i, y calcula la función del divisor como τ(n) = \prod_{i=1}^k e_i + 1.




2

Rubí, 27 bytes

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

Ejecución de muestra:

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


2

Regex (.NET), 33 bytes

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

Suponiendo que la entrada y la salida están en unario, y la salida se toma de la coincidencia principal de la expresión regular.

Desglose de la expresión regular:

  • .*$ Ajusta el puntero al final de la cadena para que tengamos toda la entrada x en una dirección.
  • (?<=^\2*(.+?(?>\2?))) coincide de derecha a izquierda y comprueba el divisor haciendo un ciclo de x a 0.
    • (.+?(?>\2?)) es una "variable" que comienza desde 1 en la primera iteración y continúa desde el número en la iteración anterior y recorre hasta x.
    • ^\2* comprueba si x es un múltiplo de "variable".

Básicamente tiene la misma idea que mi respuesta para Calcular Phi (no Pi) . Solo el cheque es diferente.

Prueba la expresión regular en RegexStorm .


2

Laberinto , 33 bytes

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

Pruébalo en línea.

Esto implementa la división de prueba. Agregaré una explicación completa más tarde. Probablemente no sea óptimo, pero estoy teniendo dificultades para encontrar algo más corto.


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

Esto probablemente se pueda jugar mejor al golf.

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

Edición 1: estaba en lo cierto. Se eliminaron las llaves después del bucle for.

Edición 2: Golfed a 40 bytes con gracias a manatwork y Martin Büttner .

Edición 3: guardar un byte basando la función en la respuesta C anterior.

Edición 4: Gracias a ן nɟuɐɯɹɐ ן oɯ y Neil , pero no puedo hacer que la evaluación funcione.

Editar 5: Olvidé eliminar la evaluación.

Prueba

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
Renunciar a los buenos hábitos. Eliminar varpalabras clave Más consejos en Consejos para jugar golf en JavaScript y Consejos para jugar golf en ECMAScript 6 .
trabajo de

2
También abandone los malos hábitos: cuando tenga que elegir entre ++iy i++, elija el primero (esto no tiene nada que ver con el golf). También n%i<1debería guardar un byte.
Martin Ender

2
Solo brevemente probado:n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
manatwork

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

1
@manatwork ¿Por qué no 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
  • crear una lista de números del 1 al x, alimentarlos a la tubería |
  • filtre la tubería en (x% item == 0), !convirtiendo implícitamente el resultado del módulo como un booleano y luego invirtiéndolo usando los divisores para que se conviertan en $ true y se les permita pasar; usando el alias incorporado ?paraWhere-Object
  • reunir ()y .Countcuántos elementos pasaron por el filtro

Muy bien pirateado!
bkul

2

Jalea , 2 bytes (no competitiva (de nuevo))

Æd

Pruébalo en línea!

Creo que esto usa características implementadas después de la otra respuesta de Jelly. Sin embargo, comente si estoy equivocado (no puedo ver cada confirmación en la fila, ya sabes :))


2

Taxi, 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.

Pruébalo en línea!

Sin golf:

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.

Explicación:

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 Excel, 42 28 bytes

Editar: me acabo de dar cuenta de que no necesito usar INDIRECT , ahorrando 14 bytes!

Lo siguiente debe ingresarse como una fórmula de matriz ( Ctrl+ Shift+ Enter):

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

Donde N es el número a probar.

Ejemplos:

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

Explicación:

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

Composición de funciones simples de empotrados.


1

Minkolang 0.13 , 16 bytes

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

Verifique todos los casos aquí.

Explicación

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.