Conta i divisori di un numero


26

introduzione

Questa è una sfida molto semplice: contare semplicemente i divisori di un numero. Abbiamo già affrontato una sfida simile ma più complicata , ma intendo che questa sia entry-level.

La sfida

Crea un programma o una funzione che, dato un intero strettamente positivo N, emetta o restituisca quanti divisori ha, inclusi 1 e N.

Input: un numero intero> 0. Si può presumere che il numero possa essere rappresentato nel tipo numerico nativo della propria lingua.

Output: il numero di divisori interi positivi che ha, incluso 1 e il numero stesso.

Le iscrizioni verranno classificate in byte . È possibile trovare utile questo sito Web , sebbene sia possibile utilizzare qualsiasi metodo ragionevole per generare il conteggio dei byte.

Questo è , quindi vince il punteggio più basso!

Modifica: Sembra che la risposta Pyth a 5 byte di FryAmTheEggman sia il vincitore! Sentiti libero di inviare nuove risposte, però; se riesci a ottenere qualcosa di più corto, cambierò la risposta accettata.

Casi test

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

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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

Risposte:


19

Pyth, 5

l{yPQ

Utilizza l'operazione dei sottoinsiemi sui fattori primi dell'input, quindi mantiene solo gli elenchi univoci di fattori e restituisce questo conteggio.

Test Suite

Spiegazione

Usando 25 come esempio, in modo che l'elenco dei sottoinsiemi non sia molto lungo

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

Affascinante. Approccio piacevole
Cyoce,

14

C ++ C, 43 57 56 46 43 byte

Sui suggerimenti di Martin Büttner:

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

1
Aspetta, contiamo entrambi, invece, per 43:i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
Martin Ender il

@ MartinBüttner Wow amico wow. Sul serio! _ / \ _
Sahil Arora,

1
Bellissimo! : ~)!
sweerpotato,

11

LabVIEW, 4938 byte

Beh, ovviamente non è adatto per il golf del codice ma qualunque cosa, quindi per il mio primo post e il lolz qui va. inserisci qui la descrizione dell'immagine


Benvenuti in Puzzle di programmazione e Code Golf! Come hai segnato questo, se non ti dispiace che te lo chieda? Non sono riuscito a trovare precedenti su Meta.
bkul,

l'ho salvato e ne ho preso le dimensioni
Eumel,

Ed era 4.938 byte? Non i kilobyte, per esempio?
bkul,

per precisione ho preso il conteggio dei byte non il conteggio dei kb
Eumel,

4
@bkul Penso che la confusione sia dovuta al ., che sono abbastanza sicuro inteso come un separatore di mille, non un punto decimale (come è comune in alcune lingue).
Martin Ender,

10

Haskell, 28 byte

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

Il trucco qui è verificare se un resto sta 0usando la funzione indicatore 0^.

0^0 = 1
0^_ = 0

Questo funziona perché qualsiasi potenza positiva di 0 è 0, mentre 0 ^ 0 è combinatoriamente il prodotto vuoto di 1.

Confronta questo con il filtraggio

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

7

Dyalog APL , 7 6 byte

≢∘∪⊢∨⍳

È una funzione senza nome che può essere denominata e quindi riutilizzata per ogni ( ¨) test case come segue:

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

Spiegazione:

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

Conta l' unicità del GCD di se stessa e ciascuno dei numeri interi-fino .

Grazie a ngn per aver salvato un byte.


Vecchia versione: +/0=⍳|⊢

È così che funziona:

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

⍳|⊢Argomento restante divisione 1-through-argomento
0=booleano se 0 è uguale al resto della divisione
+/Somma del valore booleano, ovvero conteggio di quelli.


6

Python 2, 37 byte

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

Una funzione ricorsiva. L'ingresso opzionale inel divisore in fase di test. L'espressione (n%i<1)verifica la divisibilità, con True(che è uguale 1) per i divisori. Il risultato viene aggiunto all'espressione recusiva per i+1. Quando i==nviene raggiunta, la divisione del pavimento intera viene i/nvalutata 1e quel valore viene restituito come caso base, considerando che nè un divisore di n.


38:

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

Una funzione anonima. Verifica tutti i possibili divisori 1attraverso n. Questo è spostato su da 0tramite n-1in range(n)uso -~, che aggiunge 1. Sommando i bool si utilizza il fatto che Python tratta True/ Falseas 1/ 0.


6

Retina , 17 byte

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

Input in unario , output in decimale.

Provalo online.

Quando viene invocato con una sola regex, Retina conta semplicemente le partite. La regex stessa corrisponde a una posizione , in cui il numero unario a sinistra di esso è un divisore dell'intero input. Sto anche sfruttando il fatto che i lookaround sono atomici, quindi non ho bisogno di usare ^un'ancora.

I primi lookbehinds semplicemente catturano l'intero prefisso in gruppo 1. Questo non può mai fallire, quindi dopo lo sguardo sappiamo che è ciò che è nel gruppo 1 e non cambierà più.

Il lookahead quindi controlla se possiamo raggiungere la fine della stringa ripetendo la stringa catturata (il nostro potenziale divisore) 0 o più volte.


6

J, 10 byte

[:*/1+_&q:

Questo è un verbo monadico senza nome. Calcola σ 0 (∏p k α k ) come ∏ (α k + 1) .

Provalo in rete con J.js .

Come funziona

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

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

Non credo q:sia permesso in quanto risolve una parte essenziale della sfida. Che ne dici di[:+/0=]|~1+i.
FUZxxl,

Sarebbe un duplicato di questa risposta . Inoltre, i predefiniti non sono vietati per impostazione predefinita e la sfida non sembra menzionarli.
Dennis,

I builtin che svolgono tutto / quasi tutto il lavoro di una sfida sono generalmente vietati, ma posso seguire il tuo ragionamento q: .
FUZxxl,

1
Non sono. Vorrei che lo fossero, ma non lo sono.
Dennis,

Hrmpf hrmpf che fa schifo un po '.
FUZxxl,

6

Golfscript, 19 18 17 13 byte

Grazie a Martin Büttner .

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

Come funziona

~               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

Anche

Da @Peter Taylor , anche in 13 byte.

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

Come funziona

~               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

Per la stessa durata che potresti avere anche~:X,{)X\%!},,
Peter Taylor,

4

J, 13 12 11 byte

Il mio primo golf a J. Lo sto ancora imparando.

Salvataggio di un byte grazie a Dennis.

Salvato un altro byte grazie a randomra.

1+/@,0=i.|]

Spiegazione:

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 byte

Iniziamo la festa!

(F(x)(_(d/ x

Questo utilizza la funzione integrata d/. Ecco una versione senza il built-in (27 byte):

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

Spiegazione:

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

ri_,:)f%0e=

Provalo qui.

Spiegazione

CJam non ha un built-in per questo, quindi stiamo facendo la divisione di prova.

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.

indennità

Ecco una soluzione interessante a 12 byte (che sospetto potrebbe essere la più breve in una lingua come J):

ri_)2m*::*e=

Il risultato è uguale al numero di volte che nappare in una n x ntabella di moltiplicazione:

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 byte

Esegui k mod nper ogni k = 1,...,n, quindi esegui not(che trasforma ogni nonzer in zero e ogni zero in 1) e riassumi tutti quei valori.

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

Anche questo sarebbe stato il mio approccio!
Luis Mendo,

Interessante che questa sia la stessa lunghezza di length(divisors(n)).
Accumulo

@Accumulazione dovresti ancora aggiungere un @(n)per renderlo un invio valido
flawr

3

Julia, 20 byte

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

Questa è una funzione anonima che funziona come segue: Per ogni numero intero compreso tra 1 e l'input, verifica se l'input modulo è intero. In tal caso, il valore sarà true, altrimenti false. Sommiamo i booleani che sono implicitamente espressi in numeri interi, producendo il numero di divisori.


Una soluzione molto più interessante (anche se molto più lunga), inclusa per completezza, è

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

Questo ottiene la fattorizzazione canonica di n, cioè \prod_{i=1}^k p_i^e_i, e calcola la funzione divisore come τ(n) = \prod_{i=1}^k e_i + 1.




2

Rubino, 27 byte

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

Esecuzione di esempio:

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


2

Regex (.NET), 33 byte

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

Supponendo che input e output siano unari e che l'output sia preso dalla corrispondenza principale di regex.

Ripartizione della regex:

  • .*$ imposta il puntatore alla fine della stringa in modo da avere l'intero input x in una direzione.
  • (?<=^\2*(.+?(?>\2?))) corrisponde da destra a sinistra e controlla il divisore eseguendo il ciclo da x a 0.
    • (.+?(?>\2?)) è una "variabile" che inizia da 1 nella prima iterazione e continua dal numero nella precedente iterazione e si sposta fino a x.
    • ^\2* controlla se x è un multiplo di "variabile".

Fondamentalmente ha la stessa idea della mia risposta a Calculate Phi (non Pi) . Solo il controllo è diverso.

Prova il regex su RegexStorm .


2

Labirinto , 33 byte

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

Provalo online.

Questo implementa la divisione di prova. Aggiungerò una spiegazione completa più tardi. Probabilmente non è ottimale, ma faccio fatica a trovare qualcosa di più corto.


2

Perl 6 , 17 byte

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

utilizzo:

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 byte

Questo può probabilmente essere giocato a golf meglio.

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

Modifica 1: avevo ragione. Rimosse le parentesi graffe dopo il ciclo for.

Modifica 2: golfato a 40 byte grazie a manatwork e Martin Büttner .

Modifica 3: Salvataggio di un byte basando la funzione sulla risposta C sopra.

Modifica 4: Grazie a ן nɟuɐɯɹɐ ן oɯ e Neil , ma non riesco a far funzionare l'Eval.

Modifica 5: dimenticato di rimuovere l'Eval.

Test

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
Rinuncia alle buone abitudini. Rimuovi varparole chiave. Altri suggerimenti in Suggerimenti per giocare a golf in JavaScript e Suggerimenti per giocare a golf in ECMAScript 6 .
arte

2
Abbandona anche le cattive abitudini: quando hai una scelta tra ++ie i++, scegli la prima (questo non ha nulla a che fare con il golf). Inoltre n%i<1dovrebbe salvare un byte.
Martin Ender,

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

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

1
@manatwork Perché no n%++i||++d?
Neil,

2

PowerShell, 34 byte

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

e.g. 

PS C:\temp> .\divisors-of-x.ps1 97
2
  • crea un elenco di numeri da 1 a x, inseriscili nella pipeline |
  • filtrare la pipeline su (x% item == 0), implicitamente lanciando il risultato del modulo come un valore booleano e quindi invertendolo usando in !modo che i divisori diventino $ true e siano consentiti; usando l'alias incorporato ?perWhere-Object
  • raccogli ()e .Countquanti oggetti hanno attraversato il filtro

Molto ben hackerato!
bkul

2

Gelatina , 2 byte (non competitiva (di nuovo))

Æd

Provalo online!

Penso che questo usi funzionalità implementate dopo l'altra risposta di Jelly. Commenta se sbaglio (non riesco a guardare ogni commit nella riga, sai :))


2

Taxi, 2143 byte

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.

Provalo 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.

Spiegazione:

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

Formula Excel, 42 28 byte

Modifica: ho appena realizzato che non è necessario utilizzare INDIRECT, risparmiando 14 byte!

È necessario immettere quanto segue come formula di matrice ( Ctrl+ Shift+ Enter):

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

Dove N è il numero da testare.

Esempi:

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

Spiegazione:

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 byte

Length@*Divisors

Semplice composizione funzionale degli incorporati.


1

Minkolang 0,13 , 16 byte

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

Controlla tutti i casi qui.

Spiegazione

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.