고유 한 소수는 몇 개입니까?


14

자연수를 나타내는 한 가지 방법은 소수의 지수를 곱하는 것입니다. 예를 들어, 6은 2 ^ 1 * 3 ^ 1로, 50은 2 ^ 1 * 5 ^ 2로 표현 될 수 있습니다 (여기서 ^는 지수를 나타냄). 이 표현의 소수는 다른 방법과 비교하여이 표현 방법을 사용하는 것이 더 짧은지를 결정하는 데 도움이 될 수 있습니다. 그러나 이것을 직접 계산하고 싶지 않기 때문에 나를 위해 프로그램이 필요합니다. 그러나 집에 도착할 때까지 프로그램을 기억해야하므로 가능한 짧아야합니다.

당신의 작업 :

이 숫자 표현에 몇 개의 고유 한 소수가 있는지 판별하는 프로그램 또는 함수를 작성하십시오.

입력:

1 <n <10 ^ 12 인 정수 n으로, 일반적인 방법으로 가져옵니다.

산출:

소개에 설명 된대로 입력을 나타내는 데 필요한 고유 소수의 수입니다.

테스트 사례 :

24      -> 2 (2^3*3^1)
126     -> 3 (2^1*3^2*7^1)
1538493 -> 4 (3^1*11^1*23^1*2027^1)
123456  -> 3 (2^6*3^1*643^1)

이다 OEIS A001221 .

채점 :

이것은 이며 바이트 단위의 최저 점수입니다!


3
최근에 많은 주요 질문이 있습니다! 나는 그것을 좋아한다.
Giuseppe


3
downvote 뒤에 이유는 사소한 것일 수 있습니다. 내가 볼 수있는 한, 골프 언어와 관련하여 3 가지 상황이있다 : 1. 빌트인 2. 2 개의 빌트인 체인 3. 3 빌트인 체인 체인 이것이
다운 보트

1
가능할 수도 있지만, 세 명의 지지자 중 하나가 저에게 그 말을 해주면 감사하겠습니다. 그 동안 입니다 골프의 언어로 사소한, 나는이 문제를 게시 할 때보고 싶었던 사람입니다 비 골프의 언어로 몇 가지 흥미로운 솔루션이있다. 결국이 사이트에는 golflangs에 대한 사소한 문제가 있지만 흥미로운 non-golflang 솔루션을 생성하는 많은 과제가 있습니다.
그리폰

1
테스트 사례에 소수를 포함하는 것이 좋습니다. 또한 일부 언어 / 접근법은 많은 수를 테스트하기가 어렵습니다. 몇 가지 작은 테스트 사례가 좋을 것입니다.
Dennis

답변:




5

Mathematica, 7 바이트

PrimeNu

예, 내장되어 있습니다.

수학, 21 바이트

Length@*FactorInteger

먼 길.


별표의 이유는 무엇입니까? Length@FactorInteger동일 하지 않습니까?
numbermaniac

1
Length@*FactorIntegerLength및 의 구성과 같은 순수한 기능을 생성합니다 FactorInteger. 정의 fun=Length@*FactorInteger하고 호출 할 수 있습니다 fun[1001]. 반면 Length@FactorInteger에을 의미 Length[FactorInteger]하고 평가합니다 0.
Misha Lavrov


4

파이썬 2, 56 바이트

f=lambda n,p=2,k=1:n/p and[f(n,p+1),k+f(n/p,p,0)][n%p<1]

이것은 이곳 의 Dennis 포트의 대답 입니까?
Jonathan Allan

1
@JonathanAllan 예, 고유 한 주요 요소를 계산하도록 수정되었습니다.
orlp

4

망막 , 31 30 바이트

&`(?!(11+)\1+$)(11+)$(?<=^\2+)

입력이 단항입니다.

1 바이트의 골프를위한 @MartinEnder에게 감사합니다!

온라인으로 사용해보십시오! (10 진수를 1로 변환하는 변환기 포함)

작동 원리

이 프로그램은 &수정자가 포함 된 단일 정규식으로 구성되므로 Retina는 겹치는 일치 량을 계산합니다 . 입력은 1n 반복으로 구성되는 것으로 가정 지고 다른 것은 없다고 가정합니다.

부정적인 전망

(?!(11+)\1+$)

사이의 위치에 일치하는 1 '되어 S 하지 둘 이상의 다음 1 의 ( 11+) 동일한 양의 하나 이상의 다음 반복 1 의 ( \1+) 입력의 종료 하였다 ( $).

상관 합성 수 ABA, B는> 1 로 기록 될 수있는 B 형 의 반복 의 반복 룩어는 다음 단 위치와 일치하도록, P는 반복함으로써 1 , p = 1 또는 소수이다.

정규식

(11+)$

확인합니다 P> 1 개 이상의 요구에 의해 1 의 ( 11+)과의 꼬리를 저장 한이 두 번째 캡처 그룹이야 '(\2 ).

마지막으로 긍정적 인 견해

(?<=^\2+)

전체 입력이 구성되어 있는지 확인 KP의 발생 ( K ≥ 1 의) 것을 검증 분할 입력한다.

따라서 각 일치는 고유 한 소수 제수 p에 해당합니다 .


4

배쉬 + GNU 유틸리티, 33

  • @Dennis 덕분에 1 바이트 절약
factor|grep -Po ' \d+'|uniq|wc -l

온라인으로 사용해보십시오 .

설명

factor|                            # Split input into prime factors
       grep -Po ' \d+'|            # group factors onto lines
                       uniq|       # remove duplicates
                            wc -l  # count the lines

1
grep -Po ' \d+'바이트를 저장합니다 tr \ \\n|sed 1d.
Dennis

불행히도 grep -Po '( \d+)\1*'입력 46에 실패합니다 .
Dennis

@Dennis 감사-원래 제안을 사용하여 문제를 해결했습니다
Digital Trauma

3

젤리 , 3 바이트

지루한 대답 ...

ÆFL

숫자를 받아서 숫자를 반환하는 모나드 링크

온라인으로 사용해보십시오!

어떻게?

ÆFL - Link: number, n
ÆF  - prime factorisation as a list of prime, exponent pairs
  L - length

1
어떻게 그리웠 어 Æv?
내 대명사는 monicareinstate

쉬웠다-나는 그것을 사용해 본 적이 없으며 위키에서 목록을 검색하지 않았다.
Jonathan Allan

원자 목록과 빠른 목록없이 젤리 문자를 어떻게 입력합니까?
내 대명사는 monicareinstate

1. Æalt 코드 0198입니다. 2. 키보드를 설정할 수 있습니다 (필자는 없습니다). 3. 코드 페이지.
Jonathan Allan



3

Alice , 10 바이트

/o
\i@/Dcd

온라인으로 사용해보십시오!

설명

/o
\i@/...

이것은 십진 I / O가 필요한 선형 산술이 많은 프로그램을위한 표준 프레임 워크 일뿐입니다. 실제 프로그램 자체는 다음과 같습니다.

Dcd

어느 것이 :

D    Deduplicate prime factors. Does what it sounds like: for every p^k which
     is a divisor n, this divides n by p^(k-1).
c    Push the individual prime factors of n. Since we've deduplicated them
     first, the number of factors is equal to the value we're looking for.
d    Push the stack depth, i.e. the number of unique prime factors.

3

자바 스크립트 45 바이트

* @SEJPM의 경우 설명을 요청하십시오. 여기에서 내가하고있는 것은 2-n에서 시작합니다 (변경되고 결국 가장 큰 주요 요소가됩니다)-현재 숫자를 나누면 ni는 한 번만 계산하려고합니다 (짝수 2 * 2 * 2 * 3-2의 계수가 될 수 있지만 2는 한 번 계산됩니다.)- "j"가 그림에옵니다. j가 함수 호출에 지정되지 않은 경우-j는 " undefined "이고 n % i == 0 일 때 다음 호출에서 j = 1 인 함수를 호출합니다)-j가 undefined 인! j + Function (n / i, i, ( j = 1 또는 1)). 이 문제에서 i를 변경하지 마십시오. 여전히 다시 i (2 * 2 * 3)로 나눌 수 있지만 j는 1과 같고 인수로 계산되지 않습니다. 내가 충분히 잘 설명했으면 좋겠다.

P=(n,i=2,j)=>i>n?0:n%i?P(n,i+1):!j+P(n/i,i,1)

console.log(P(1538493)==4);
console.log(P(24)==2);
console.log(P(126)==3);
console.log(P(123456)==3);

마지막 소수가 최대 호출 스택을 갖는 것보다 매우 큰 경우-문제가있는 경우 반복적 인 것을 만들 수 있습니다


이 답변에 대한 설명을 작성해 주시겠습니까? 나머지 답변에서 일반적인 접근 방식을 사용하는 것 같습니다.
SEJPM

@SEJPM 나는 거기에 약간의 설명을 추가
DanielIndie

1
FYI we may assume infinite call stacks / infinite resources for the majority of code-golf challenges (basically unless the question states otherwise).
Jonathan Allan

3

CJam, 7 5 bytes

Thanks to Martin Ender for 2 bytes off!

{mF,}

Anonymous block (function) that expects the input number on the stack and replaces it by the output number.

Try it online! Or verify all test cases.

Explanation

{   }   e# Define block
 mF     e# List of (prime, exponent) pairs
   ,    e# Length







2

R + numbers, 30 14 bytes

16 bytes removed thanks to @Giuseppe

numbers::omega

Also, here is the Try it online!! link per @Giuseppe.


You may omit the f=function(x) and the (x) as numbers::omega is a function already. However, as numbers is not standard for R, you should make your answer "R + numbers". Also, you should include a TIO link. Still, +1, very nice.
Giuseppe

@Giuseppe, you are too nice. Thanks for your help. BTW, in addition to some of your insightful answers, I checked out Tips for golfing in R, as you suggested. There are some real gems there. Anywho, I will update my answer with your recommendations. Also, your MATL solution is very nice (+1 yesterday).
Joseph Wood

NP, feel free to ping me in chat or comment on an answer of mine if you have questions.
Giuseppe

@Giuseppe is there a meta consensus on needing to explicitly state "R + numbers"? It seems like if we state the additional package then we should be able to save the bytes of explicitly calling it with numbers::. Otherwise, to me it's the same as using an import in any other language.
BLT

(scrolls down and sees a python example of this...) I guess I'm wondering about a broader meta consensus, then. It just sort of seems silly to me.
BLT



1

Haskell, 58 bytes

-4 bytes thanks to @Laikoni

f n=sum[1|x<-[2..n],gcd x n>1,all((>)2.gcd x)[2..x-1]]

Try it online!

Explanation

Essentially generates all primes at most as large as n and filters them for being a factor of n and then takes the length of the result.

f n=                                                   -- main function
    sum[                                             ] -- output the length of the list
        1|x<-[2..n],                                   -- consider all potential primes <=n
                                                       -- and insert 1 into the list if predicates are satisfied
                    gcd x n>1,                         -- which are a factor of n
                              all(          )[2..x-1]  -- and for which all smaller numbers satisfy
                                  (>)2.                -- 2 being larger than
                                       gcd x           -- the gcd of x with the current smaller number

You can use sum[1|x<- ... ] instead of length.
Laikoni

1

Japt, 5 4 bytes

â èj

Try it

Get the divisors (â) and count (è) the primes (j).


1

ARBLE, 28 bytes

len(unique(primefactors(n)))

Try it online!

This is a very literal solution


I was looking at this and going "Hey, wait a minute, this is a snippet!" And then I see... is this supposed to be a non-esoteric language with implicit IO?!
totallyhuman

@icrieverytim Congratulations, you have discovered one of the main reasons this language exists.
ATaco


0

Python 2,  63  55 bytes

A much more interesting answer...

-8 bytes thanks to Jonathan Frech (use an argument with a default for the post-adjustment of the result of primes from 0 to 1 -- much better than a wrapping lambda!!)

f=lambda n,o=1:sum(n%i+f(i,0)<1for i in range(2,n))or o

A recursive function taking a positive integer, n, and returning a positive integer, the count.

Try it online! Really inefficient, don't even bother with the other test cases.



@JonathanFrech Thanks, that is much cleaner.
Jonathan Allan

0

J, 12 bytes

{:@$@(__&q:)

q: is J's prime exponents function, giving it the argument __ produces a matrix whose first row is all nonzero prime factors and whose 2nd row is their exponents.

We take the shape $ of that matrix -- rows by columns -- the number of columns is the answer we seek.

{: gives us the last item of this two items (num rows, num columns) list, and hence the answer.

Try it online!



0

Javascript ES6, 56 chars

n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)

Test:

f=n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)
console.log([24,126,1538493,123456].map(f)=="2,3,4,3")

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.