| Bytes | Lang | Time | Link |
|---|---|---|---|
| 001 | Nekomata | 230721T092837Z | alephalp |
| 001 | Thunno 2 L | 230721T061153Z | The Thon |
| 005 | Nibbles | 220105T204439Z | Darren S |
| 003 | Risky | 220105T214120Z | Rydwolf |
| 007 | BQN | 220110T221616Z | ovs |
| 033 | MS Excel | 220110T215341Z | Taylor A |
| 007 | HBL | 220105T213351Z | DLosc |
| 041 | QBasic | 180622T044545Z | DLosc |
| 002 | Husk | 220105T160731Z | Natte |
| 042 | Add++ | 220105T124210Z | lyxal |
| 001 | Vyxal l | 210522T085019Z | Wasif |
| 034 | Excel | 210522T161038Z | Axuary |
| 018 | Factor + math.primes.factors | 210522T120829Z | chunes |
| 030 | Retina 0.8.2 | 210226T010511Z | Neil |
| 019 | Julia | 210224T145140Z | MarcMush |
| 002 | APL Dyalog Extended | 201223T191526Z | user |
| 022 | R | 200903T125611Z | Xi'a |
| 091 | F# | 180624T222937Z | Ciaran_M |
| 029 | JavaScript Node.js | 180622T123325Z | Neil |
| 018 | Perl 6 | 180622T084800Z | Jo King |
| 031 | Racket | 180622T081457Z | potato |
| 002 | Brachylog | 180622T081319Z | Fatalize |
| 008 | Pari/GP | 180622T050503Z | alephalp |
| 005 | Cjam | 180621T073723Z | Chromium |
| 036 | Perl 6 | 180621T215827Z | Phil H |
| 022 | Bash + GNU utilities | 180621T024121Z | Digital |
| 141 | Whitespace | 180621T095729Z | Kevin Cr |
| 002 | Jelly | 180620T235323Z | Erik the |
| 037 | JavaScript ES6 | 180621T074148Z | Arnauld |
| 037 | Python 2 | 180621T065335Z | xnor |
| 018 | Octave | 180621T070717Z | Stewie G |
| 003 | MATL | 180621T070543Z | Stewie G |
| 043 | Stax | 180621T064235Z | wastl |
| 027 | Haskell | 180621T070328Z | xnor |
| 002 | Gaia | 180621T070018Z | Mr. Xcod |
| 010 | Attache and Wolfram Language Mathematica polyglot | 180621T030853Z | Conor O& |
| 086 | face | 180621T024127Z | Doorknob |
| 002 | Pyth | 180621T020215Z | Digital |
| 037 | R | 180621T014822Z | ngm |
| 002 | Actually | 180621T014127Z | Oliver |
| 004 | J | 180621T013204Z | Jonah |
| 041 | dc | 180621T003743Z | Sophia L |
| 003 | Japt | 180621T011440Z | Oliver |
| 059 | Java 8 | 180621T005045Z | Jakob |
| 049 | Python 3 | 180621T003702Z | Jo King |
| 002 | 05AB1E | 180621T003138Z | Cheese |
| 062 | Python 2 | 180621T001524Z | Chas Bro |
Nekomata, 1 byte
ƒ
ƒ factorizes the input number, and returns a list of unique prime factors and a list of exponents.
Only the top of the stack will be printed, which is the list of exponents. Since the input is a prime power, this will be a singleton list.
Nibbles 5 bytes
,|`,$~^%@
This is 9 nibbles each of which is encoded in a half byte in the binary form. I think this is the shortest solution that doesn't use built in factoring.
Translation:
, length
| filter
`,$ 0..input
~ not \x->
^ pow (so that 0 which would have been 0 from the mod isn't)
% mod
@ input
implicit $ (x)
implicit $ (x)
It works by just counting the number of numbers the input divides evenly
You could run it passing in a list of numbers to process in stdin or as a command line arg. Nibbles isn't on TIO.run yet...
Risky, 3 bytes
!\?___
A basically built-in solution for now, working on a non-trivial version (might not be possible given Risky's heavy investment in specific operators, and generally awful control flow).
! Count
\ Prime factors
? Input
___ (Padding)
MS Excel, 33 bytes
An anonymous worksheet function that takes input from cell A1 and outputs to the calling cell
-SUM(-(MOD(A1,SEQUENCE(A1))<1))-1
HBL, 7 bytes
(or possibly 6.5 depending on how this meta question shakes out)
+(*'?(*%.(02.
Explanation
+(*'?(*%.(
(0 Inclusive range
2 from 2
. to the argument
(* Map over each value x in that list:
%. Argument mod x
(* Map over each value in that list:
'? Logical negation
The result is a list containing 1 for each number that divides
the argument, 0 otherwise
+ Take its sum
QBasic, 51 41 bytes
INPUT n
FOR i=2TO n
f=f-(n/i=n\i)
NEXT
?f
-10 bytes by copying the approach from Darren Smith's Nibbles answer: For a prime power input, the desired output equals the number of integers between 1 (exclusive) and the input (inclusive) that evenly divide the input.
INPUT number
FOR testFactor = 2 TO number
' number is divisible by testFactor if their float division equals
' their int division
isDivisible = (number / testFactor = number \ testFactor)
' Truthy is -1 in QBasic, so we subtract rather than add to the tally
numFactors = numFactors - isDivisible
NEXT testFactor
PRINT numFactors
Add++, 42 bytes
D,f,@,bUbU$^=
L,dVfbUG$XGRzGGXzÞ{f}bUbU0$:
I don't even know where to begin explaining this mess.
Explained
D,f,@,bUbU$^=
D,f,@, ; a helper function f that given a list [number, [x, y]]
bUbU$^ ; returns whether x ^ y
= ; equals number
L,dVfbUG$XGRzGGXzÞ{f}bUbU0$:
L, ; a lambda that
dV ; places its input into the register
fbU ; and gets the prime factor of the input. This is guaranteed to be a single item because the input is a prime raised to a power.
G$X ; push a list of input copies of that power
GRz ; and zip that with the range [1...input]
GGX ; also, push input copies of the input
z ; and zip that with our big list. I'm calling it a big list because it is what it is.
Þ{f} ; filter that list based on the results of the helper function f
bUbU0$: ; get the power out of the many nested lists returned.
Excel, 34 bytes
=SUM((MOD(A1,SEQUENCE(A1-1))=0)*1)
Counts the factors. Works up to 2 ^ 20.
Retina 0.8.2, 30 bytes
.+
$*
((?=(1+)(\2+)$)\3)+1
$#1
Try it online! Link includes test cases. Explanation:
.+
$*
Convert the input to unary.
((?=(1+)(\2+)$)\3)+1
Repeatedly find the largest factor of the current value. Eventually this becomes 1, which is then matched at the end outside of the loop.
$#1
Output the resulting number of factors, which for a prime power will be the power.
F#, 91 bytes
let rec d n c v=if v=n then c else d(n/v)(c+1)v
let p n=d n 1(Seq.find(fun x->n%x=0){2..n})
p gets the prime factor. d recursively divides the target value until it's equal to the prime factor and returns the count from that.
JavaScript (Node.js), 29 bytes
f=(n,k=n)=>--k&&!(n%k)+f(n,k)
Try it online! Note: Stack overflows for larger inputs.
Perl 6, 18 bytes
{+grep($_%%*,^$_)}
Anonymous code block that gets a list of factors and coerces it to a number.
Pari/GP, 8 bytes
bigomega
bigomega(x): number of prime divisors of x, counted with multiplicity.
Pari/GP, 14 bytes
n->numdiv(n)-1
Cjam, 5 bytes
rimf,
Explanation:
ri take the input and convert it to an int
mf factors the input
, take the length of the list
Builtins are great!
Perl 6, 36 bytes
{round .log/log (2..*).first: $_%%*}
Looks for the first factor (2..*).first: $_%%*, then from there calculates the approximate value (logs won't get it exact) and rounds it.
Whitespace, 141 bytes
[S S S N
_Push_0][S N
S _Duplicate_0][T N
T T _Read_STDIN_as_number][T T T _Retrieve][S S S T N
_Push_1][N
S S N
_Create_Label_LOOP_1][S S S T N
_Push_1][T S S S _Add][S N
S _Duplicate][S T S S T S N
_Copy_2nd_input][S N
T _Swap_top_two][T S T T _Modulo][N
T S S N
_If_0_Jump_to_Label_BREAK_1][N
S N
N
_Jump_to_Label_LOOP_1][N
S S S N
_Create_Label_BREAK_1][S S S N
_Push_0][S T S S T S N
_Copy_2nd_input][N
S S T N
_Create_Label_LOOP_2][S N
S _Duplicate_input][S S S T N
_Push_1][T S S T _Subtract][N
T S S S N
_If_0_Jump_to_Label_BREAK_2][S N
T _Swap_top_two][S S S T N
_Push_1][T S S S _Add][S N
T _Swap_top_two][S T S S T S N
Copy_2nd_factor][T S T S _Integer_divide][N
S N
T N
_Jump_to_Label_LOOP_2][N
S S S S N
_Create_Label_BREAK_2][S N
N
_Discard_top][T N
S T _Print_as_number]
Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.
Try it online (with raw spaces, tabs and new-lines only).
Explanation in pseudo-code:
Integer n = STDIN as input
Integer f = 1
Start LOOP_1:
f = f + 1
if(n modulo-f == 0)
Call function BREAK_1
Go to next iteration of LOOP_1
function BREAK_1:
Integer r = 0
Start LOOP_2:
if(n == 1)
Call function BREAK_2
r = r + 1
n = n integer-divided by f
Go to next iteration of LOOP_2
function BREAK_2:
Print r as number to STDOUT
Program stops with an error: Exit not defined
Example run: input = 9
Command Explanation Stack Heap STDIN STDOUT STDERR
SSSN Push 0 [0]
SNS Duplicate top (0) [0,0]
TNTT Read STDIN as number [0] {0:9} 9
TTT Retrieve [9] {0:9}
SSSTN Push 1 [9,1] {0:9}
NSSN Create Label_LOOP_1 [9,1] {0:9}
SSSTN Push 1 [9,1,1] {0:9}
TSSS Add top two (1+1) [9,2] {0:9}
SNS Duplicate top (2) [9,2,2] {0:9}
STSSTSN Copy 2nd from top [9,2,2,9] {0:9}
SNT Swap top two [9,2,9,2] {0:9}
TSTT Modulo top two (9%2) [9,2,1] {0:9}
NTSSN If 0: Jump to Label_BREAK_1 [9,2] {0:9}
NSNN Jump to Label_LOOP_1 [9,2] {0:9}
SSSTN Push 1 [9,2,1] {0:9}
TSSS Add top two (2+1) [9,3] {0:9}
SNS Duplicate top (3) [9,3,3] {0:9}
STSSTSN Copy 2nd [9,3,3,9] {0:9}
SNT Swap top two [9,3,9,3] {0:9}
TSTT Modulo top two (9%3) [9,3,0] {0:9}
NTSSN If 0: Jump to Label_BREAK_1 [9,3] {0:9}
NSSSN Create Label_BREAK_1 [9,3] {0:9}
SSSN Push 0 [9,3,0] {0:9}
STSSTSN Copy 2nd from top [9,3,0,9] {0:9}
NSSTN Create Label_LOOP_2 [9,3,0,9] {0:9}
SNS Duplicate top (9) [9,3,0,9,9] {0:9}
SSSTN Push 1 [9,3,0,9,9,1] {0:9}
TSST Subtract top two (9-1) [9,3,0,9,8] {0:9}
NTSSSN If 0: Jump to Label_BREAK_2 [9,3,0,9] {0:9}
SNT Swap top two [9,3,9,0] {0:9}
SSSTN Push 1 [9,3,9,0,1] {0:9}
TSSS Add top two (0+1) [9,3,9,1] {0:9}
SNT Swap top two [9,3,1,9] {0:9}
STSSTSN Copy 2nd from top [9,3,1,9,3] {0:9}
TSTS Integer-divide top two (9/3) [9,3,1,3] {0:9}
NSNTN Jump to Label_LOOP_2 [9,3,1,3] {0:9}
SNS Duplicate top (3) [9,3,1,3,3] {0:9}
SSSTN Push 1 [9,3,1,3,3,1] {0:9}
TSST Subtract top two (3-1) [9,3,1,3,2] {0:9}
NTSSSN If 0: Jump to Label_BREAK_2 [9,3,1,3] {0:9}
SNT Swap top two [9,3,3,1] {0:9}
SSSTN Push 1 [9,3,3,1,1] {0:9}
TSSS Add top two (1+1) [9,3,3,2] {0:9}
SNT Swap top two [9,3,2,3] {0:9}
STSSTSN Copy 2nd from top [9,3,2,3,3] {0:9}
TSTS Integer-divide top two (3/3) [9,3,2,1] {0:9}
NSNTN Jump to Label_LOOP_2 [9,3,2,1] {0:9}
SNS Duplicate top (1) [9,3,2,1,1] {0:9}
SSSTN Push 1 [9,3,2,1,1,1] {0:9}
TSST Subtract top two (1-1) [9,3,2,1,0] {0:9}
NTSSSN If 0: Jump to Label_BREAK_2 [9,3,2,1] {0:9}
NSSSSN Create Label_BREAK_2 [9,3,2,1] {0:9}
SNN Discard top [9,3,2] {0:9}
TNST Print as integer [9,3] {0:9} 2
error
Program stops with an error: No exit found.
Python 2, 37 bytes
f=lambda n,i=2:i/n or(n%i<1)+f(n,i+1)
Counts factors. Apparently I wrote the same golf in 2015.
Narrowly beats out the non-recursive
Python 2, 38 bytes
lambda n:sum(n%i<1for i in range(1,n))
Octave, 18 bytes
@(x)nnz(factor(x))
Does what it says on the tin: Number of non-zero elements in the prime factorization of the input.
MATL, 3 bytes
Yfz
Explanation:
% Implicit input: 59049
Yf % Factorize input [3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
z % Number of non-zero elements: 10
% Implicit output
Haskell, 27 bytes
f n=sum$(0^).mod n<$>[2..n]
Counts factors. Compare:
Haskell, 28 bytes
f n=sum[1|0<-mod n<$>[2..n]]
Haskell, 28 bytes
f n=sum[0^mod n i|i<-[2..n]]
Haskell, 30 bytes
f n=sum[1|i<-[2..n],mod n i<1]
Attache and Wolfram Language (Mathematica) polyglot, 10 bytes
PrimeOmega
Try Attache online! Try Mathematica online!
Simply a builtin for computing the number of prime factors N has.
Explanation
Since N = pk, Ω(N) = Ω(pk) = k, the desired result.
face, 86 bytes
(%d@)\$*,c'$,io>Av"[""mN*c?*m1*mp*m%*s1"$pN1p:~+p1p%%Np?%~:=/NNp+?1?-%N1?%=p%'$i?w1'%>
Hooray, longer than Java!
I am particularly fond of the trick of using the return value of sscanf.
Normally the return value would be discarded,
but here it will always be 1,
because we're always reading a single number as input.
We can take advantage of this
by assigning its return value to the variable 1,
saving the 2 bytes that would otherwise be required
to assign 1 to 1 explicitly.
(%d@)
\$*,c'$,io> ( setup - assign $ to "%d", * to a number, o to stdout )
Av"[""mN* ( set " to input and allocate space for N for int conversion )
c?* ( calloc ?, starting it at zero - this will be the output )
m1* ( allocate variable "1", which gets the value 1 eventually )
mp*m%* ( p is the prime, % will be used to store N mod p )
s1"$pN ( scan " into N with $ as format; also assigns 1 to 1 )
1p:~ ( begin loop, starting p at 1 )
+p1p ( increment p )
%%Np ( set % to N mod p )
?%~ ( repeat if the result is nonzero, so that we reach the factor )
:= ( another loop to repeatedly divide N by p )
/NNp ( divide N by p in-place )
+?1? ( increment the counter )
-%N1 ( reuse % as a temp variable to store N-1 )
?%= ( repeat while N-1 is not 0 -- i.e. break when N = 1 )
p%'$i? ( sprintf ? into ', reusing the input format string )
w1'%> ( write to stdout )
dc, 50 41 bytes
1si[dli1+dsi%0<X]dsXx[dli/dli<Y]sYdli<Yzp
Takes input from the top of the stack (in TIO, put the input in the header to load it onto the stack before execution). Outputs to stdout.
Explanation
Registers used:
i: the current trial divisor, while X is running. Later, the divisor we've found.
X: the macro dli1+dsi%0<X, which has the effect "increment i, then check the modulus with the value on the stack (which will be the original input). If it's not zero, repeat".
Y: the macro dli/dli<Y, which has the effect "Add to the stack a copy of the current top of the stack, divided by i. Repeat until i is reached."
Full program:
1si Initialize i
[dli1+dsi%0<X]dsXx Define and run X
[dli/dli<Y]sY Define Y
dli<Y Run Y, but only if needed (if the input wasn't just i)
z The stack is i^n, i^(n-1), ... ,i, so print the stack depth
Java 8, 59 bytes
A lambda from int to int.
x->{int f=1,c=0;while(x%++f>0);for(;x>1;c++)x/=f;return c;}
Python 3, 49 bytes
f=lambda n,x=2:n%x and f(n,x+1)or n/x<2or-~f(n/x)
Outputs True instead of 1 (as allowed by OP). Recursive function that repeatedly finds the lowest factor and then calls the function again with the next lowest power until it reaches 1. This is an extension of my answer to the previous question.