프라임 카운팅 기능


28

소개

Pi 함수 라고도 하는 Prime Counting Function 은 이하의 소수를 반환합니다.π(x)

도전

프로그램은 양의 것으로 가정 할 수있는 정수 x를 가져 와서 x 이하의 소수와 동일한 단일 정수를 출력합니다. 이것은 도전이므로 승자는 가장 적은 바이트를 가진 프로그램이 될 것입니다.

이 챌린지가 시작되기 전에 존재하는 언어 중 원하는 언어를 사용할 수 있지만 언어에 내장 된 소수 계산 기능 또는 소수 검사 기능 (예 : Mathematica)이있는 경우 해당 함수를 코드에서 사용할 수 없습니다 .

입력 예

입력 :
1
출력 :
0

입력 :
2
출력 :
1

입력 :
5
출력 :
3

A000720-OEIS


3
다른 프라임 관련 기능은 어떻습니까? 예를 들어, "다음 소수"기능
Luis Mendo

6
소인수 분해 함수는 어떻습니까?
Maltysen

4
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다!
Adnan

6
Adnan이 말했듯이 PPCG에 오신 것을 환영합니다! 향후 과제 에 대해서는 주요 사이트에 게시하기 전에 의미있는 피드백과 비평을 받기 위해 도전 과제를 게시 할 수 있는 샌드 박스를 추천하겠습니다 .
AdmBorkBork

나는 이것이 @TheBikingViking이 다음과 같은 링크를 의미한다고 생각합니다 : Related
mbomb007

답변:


36

05AB1E , 3 바이트

!fg

이것은 인수 분해 기본 제공이 허용되는 것으로 가정합니다. 온라인으로 사용해보십시오!

작동 원리

!    Compute the factorial of the input.
 f   Determine its unique prime factors.
  g  Get the length of the resulting list.

5
정말 영리 해요!
mbomb007

5
젠장, 나는 내 언어로 두 번째 로 헥타르를 받고 있습니다 . +1
Adnan

왜 이것이 작동합니까?
Oliver Ni

1
@Oliver n 의 계승은 모든 정수 1, ..., n (특히 소수 p ≤ n ) 으로 나눌 수 있고 더 작은 숫자의 곱으로 표현할 수 없으므로 다른 소수 q> n 으로 나눌 수 없기 때문입니다.
Dennis

10

파이썬 2, 45 바이트

f=lambda n,k=1,p=1:n/k and p%k+f(n,k+1,p*k*k)

윌슨 정리 소수 생성기를 사용합니다 . 이 제품은 p추적 (k-1)!^2p%knonprimes에 대한 소수 1과 0입니다.


상향식에서 계승을 계산하는 것은 큰 트릭입니다. +1
ETHproductions

6

MATL , 11, 10, 8 , 5 바이트

:pYFn

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

MATL의 매트릭스 작동 방식에 대한 멋진 설명이 담긴 버전을 작성했습니다.

:YF!s1=1

그러나 더 이상 관련이 없습니다. 개정 내역을 보려면 확인하십시오.

새로운 설명 :

:p      % Compute factorial(input)
  YF    % Get the exponenents of prime factorization
    n   % Get the length of the array

Dennis의 천재 솔루션 덕분에 3 바이트 절약


그것은 기능 "소인수 분해의 지수"를 사용하기 때문에 하나 벡터화 짧은입니다 :YF!s1=s
루이스 Mendo

@LuisMendo 완전히 다른 접근 방식이므로 자유롭게 게시하십시오. (당신이 원하지 않더라도, 나는 행복하게 할 것입니다)
DJMcMayhem

어서 나는 그것을 연습하기 위해 젤리로 포팅 할 것이다 :-)
Luis Mendo

5

젤리 , 8 5 바이트

@Dennis 덕분에 3 바이트가 절약되었습니다!

RÆESL

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

DJMcMayhem 포트 의 MATL 답변 (이전 버전)은 Dennis가 개선했습니다.

R          Range of input argument
 ÆE        List of lists of exponents of prime-factor decomposition
   S       Vectorized sum. This right-pads inner lists with zeros
    L      Length of result

1
수정 : Luis Mendo의 포트 : DJMcMayhem의 MATL 답변. : P
DJMcMayhem

2
ÆE각 지수는 서로 다른 주요 요소에 해당하므로 의 결과의 최대 길이 만 필요합니다 . RÆESL그냥 달성합니다. !ÆEL더 짧을 것입니다.
Dennis

1
@Dennis 감사합니다! 첫 번째 제안을 사용했습니다. 두 번째는 너무 다르며 당신의 접근 방식입니다
Luis Mendo

5

ParserFunctions , 220 + 19 = 239 바이트의 MediaWiki 템플릿

{{#ifexpr:{{{2}}}+1={{{1}}}|0|{{#ifexpr:{{{3}}}={{{2}}}|{{P|{{{1}}}|{{#expr:{{{2}}}+1}}|2}}|{{#ifexpr:{{{2}}} mod {{{3}}}=0|{{#expr:1+{{P|{{{1}}}|{{#expr:{{{2}}}+1}}|2}}|{{P|{{{1}}}|{{{2}}}|{{#expr:{{{2}}}+1}}}}}}}}}}}}

템플릿을 호출하려면

{{{P|{{{n}}}|2|2}}}

리스프 스타일로 정렬 :

{{#ifexpr:{{{2}}} + 1 = {{{1}}}|0|
    {{#ifexpr:{{{3}}} = {{{2}}} |
        {{P|{{{1}}}|{{#expr:{{{2}}} + 1}}|2}} |
            {{#ifexpr:{{{2}}} mod {{{3}}} = 0 |
                {{#expr:1 + {{P|{{{1}}}|{{#expr:{{{2}}} + 1}}|2}} |
                {{P|{{{1}}}|{{{2}}}|{{#expr:{{{2}}} + 1}}}}}}}}}}}}

2에서 n 까지의 기본 우선 순위 테스트입니다 . 주변 세 중괄호와 숫자는 변수, 어디에 {{{1}}}이다 N , {{{2}}}숫자가 테스트되고 {{{3}}}확인하는 요인이다.


5

펄, 33 바이트

에 +1 포함 -p

STDIN에 입력 번호를 줘

primecount.pl

#!/usr/bin/perl -p
$_=1x$_;$_=s%(?!(11+)\1+$)%%eg-2

잘못된 결과를 제공 0하지만 괜찮습니다. op는 양의 정수만 지원하도록 요청했습니다.




4

젤리 , 13 11 10 9 8 7 6 바이트

더 내장 된 사용하여 주요 어떠한 기능
-1 바이트 감사 @miles하려면 (테이블을 사용하지)
-1 바이트 감사 @Dennis에 (단항 변환 약수를 계산)

ḍþḅ1ċ2

TryItOnline
또는이 시리즈의 첫 번째 100 개 용어를 참조n=[1,100]에서도, TryItOnline

방법?

ḍþḅ1ċ2 - Main link: n
 þ     - table or outer product, n implicitly becomes [1,2,3,...n]
ḍ      - divides
  ḅ1   - Convert from unary: number of numbers in [1,2,3,...,n] that divide x
                             (numbers greater than x do not divide x)
    ċ2 - count 2s: count the numbers in [1,2,3,...,n] with exactly 2 divisors
                   (only primes have 2 divisors: 1 and themselves)

1
%þ`¬Sċ2나머지 테이블을 사용하여 7 바이트 를 얻을 수 있습니다 .
마일

1
ḍþḅ1ċ2바이트를 저장합니다.
Dennis

4

자바 스크립트 (ES6), 45 43 바이트

f=(n,x=n)=>n>1&&(--x<2)+(n%x?f(n,x):f(n-1))

36 35 33 바이트 원시 기능 의 수정 (1 바이트는 @Neil, 2는 @Arnauld) :

f=(n,x=n)=>n>1&--x<2||n%x&&f(n,x)

( 이 숫자는 소수입니까? 전체 프로그램 만 허용 하므로 여기에 아무 것도 게시 할 수 없습니다 ...)

테스트 스 니펫


와우 .. 이해하는데 시간이 좀 걸렸습니다. 좋은 작업!
todeale

슬프게도 그것은 당신의 대답에 적용되지 않지만 아마도 당신의 &우선 기능의 중간에 하나 를 벗어날 수 있습니다 .
Neil

3

PowerShell v2 +, 98 바이트

param($n)if($j='001'[$n]){}else{for($i=1;$i-lt$n){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$j++}}}$j

주의 : 큰 입력의 경우 속도느립니다 .

기본적으로 단항 기반 조회 는이 숫자가 소수입니까? for루프 및 $j++카운터 와 결합됩니다 . 약간의 추가 가장자리의 경우 입력에 대한 계정에 전면에 논리 12인해 fenceposting가 어떻게 작동하는지에, for루프.


3

05AB1E , 5 바이트

소인수 분해 기본 제공이 허용된다고 가정합니다.

암호:

LÒ1ùg

설명:

L      # Get the range [1, ..., input]
 Ò     # Prime factorize each with duplicates
  1ù   # Keep the elements with length 1
    g  # Get the length of the resulting array

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


ÅPg지금이 그렇습니까?
Magic Octopus Urn


3

젤리 , 6 바이트

Ḷ!²%RS

이것은 기본 산술과 윌슨 정리 만 사용합니다. 온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

Ḷ!²%RS  Main link. Argument: n

Ḷ       Unlength; yield [0, ..., n - 1].
 !      Factorial; yield [0!, ..., (n - 1)!].
  ²     Square; yield [0!², ..., (n - 1)!²].
    R   Range; yield [1, ..., n].
   %    Modulus; yield [0!² % 1, ..., (n - 1)!² % n].
        By a corollary to Wilson's theorem, (k - 1)!² % k yields 1 if k is prime
        and 0 if k is 1 or composite.
     S  Sum; add the resulting Booleans.

3

C # 5.0 78 77

int F(int n){int z=n;if(n<2)return 0;for(;n%--z!=0;);return(2>z?1:0)+F(n-1);}

언 골프

int F(int n)
{
    var z = n;
    if (n < 2) return 0;
    for (; n % --z != 0;) ;
    return F(n - 1) + (2 > z ? 1 : 0);
}

@tfbninja 네, 맞습니다. 그러나 함수 부분 만주었습니다. 그것은 자체적으로 컴파일하지 않습니다
Ariel Bereslavsky


멋진 소리가 좋아!
FantaC


2

배쉬 + 코어 유틸리티, 30

seq $1|factor|egrep -c :.\\S+$

이데온


Bash + coreutils + BSD-games 패키지, 22

primes 1 $[$1+1]|wc -l

이 짧은 대답은 bsdgames 패키지가 설치되어 있어야 sudo apt install bsdgames합니다.



2

C #, 157 바이트

n=>{int c=0,i=1,j;bool f;for(;i<=n;i++){if(i==1);else if(i<=3)c++;else if(i%2==0|i%3==0);else{j=5;f=1>0;while(j*j<=i)if(i%j++==0)f=1<0;c+=f?1:0;}}return c;};

테스트 케이스가 포함 된 전체 프로그램 :

using System;

class a
{
    static void Main()
    {
        Func<int, int> s = n =>
            {
                int c = 0, i = 1, j;
                bool f;
                for (; i <= n; i++)
                {
                    if (i == 1) ;
                    else if (i <= 3) c++;
                    else if (i % 2 == 0 | i % 3 == 0) ;
                    else
                    {
                        j = 5;
                        f = 1 > 0;
                        while (j * j <= i)
                            if (i % j++ == 0)
                                f = 1 < 0;
                        c += f ? 1 : 0;
                    }
                }
                return c;
            };

        Console.WriteLine("1 -> 0 : " + (s(1) == 0 ? "OK" : "FAIL"));
        Console.WriteLine("2 -> 1 : " + (s(2) == 1 ? "OK" : "FAIL"));
        Console.WriteLine("5 -> 3 : " + (s(5) == 3 ? "OK" : "FAIL"));
        Console.WriteLine("10 -> 4 : " + (s(10) == 4 ? "OK" : "FAIL"));
        Console.WriteLine("100 -> 25 : " + (s(100) == 25 ? "OK" : "FAIL"));
        Console.WriteLine("1,000 -> 168 : " + (s(1000) == 168 ? "OK" : "FAIL"));
        Console.WriteLine("10,000 -> 1,229 : " + (s(10000) == 1229 ? "OK" : "FAIL"));
        Console.WriteLine("100,000 -> 9,592 : " + (s(100000) == 9592 ? "OK" : "FAIL"));
        Console.WriteLine("1,000,000 -> 78,498 : " + (s(1000000) == 78498 ? "OK" : "FAIL"));
    }
}

백만 이상이되면 시간이 조금 걸립니다.


2

Matlab, 60 바이트

한 줄 Matlab 함수에 대한 첨부 파일을 계속합니다. 인수 분해 내장 기능을 사용하지 않는 경우 :

f=@(x) nnz(arrayfun(@(x) x-2==nnz(mod(x,[1:1:x])),[1:1:x]));

소수 y에는 두 가지 요소 만 있다고 가정하면 두 가지 요소 만 [1,y]있는 범위의 숫자를 계산합니다 [1,x].

인수 분해를 사용하면 크게 단축 될 수 있습니다 (46 바이트까지).

g=@(x) size(unique(factor(factorial(x))),2);

결론 : 골프 언어를 조사 할 필요가있다. : D


2

실제로 10 바이트

이것은 TIO에서 인터프리터 버그가 발생하지 않는 가장 짧은 솔루션이었습니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

;╗r`P╜>`░l

언 골핑

         Implicit input n.
;╗       Duplicate n and save a copy of n to register 0.
r        Push range [0..(n-1)].
`...`░   Push values of the range where the following function returns a truthy value.
  P        Push the a-th prime
  ╜        Push n from register 0.
  >        Check if n > the a-th prime.
l        Push len(the_resulting_list).
         Implicit return.

2

젤리 , 3 바이트

ÆRL

젤리는 빌트인 프라임 카운팅 기능 ÆC과 프라임 검사 기능을 가지고 있으며 ÆP, 대신 빌트인 프라임 생성 기능을 사용 ÆR하고 길이를 취합니다 L.

나는이도로 3 바이트를 취할 것입니다 주요 인수 분해 내장 기능을 사용하는 등 경계 등에 대해 추측 !Æv( !계승, Æv소인수를 계산)


2

PHP, 96 92 바이트

for($j=$argv[1]-1;$j>0;$j--){$p=1;for($i=2;$i<$j;$i++)if(is_int($j/$i))$p=0;$t+=$p;}echo $t;

Roman Gräf 덕분에 4 바이트 절약

온라인 테스트

Ungolfed 테스트 코드 :

$argv[1] = 5;

for($j=$argv[1]-1;$j>0;$j--) {
    $p=1;
    for($i=2;$i<$j;$i++) {
        if(is_int($j/$i)) {
            $p=0;
        }
    }
    $t+=$p;
}
echo $t;

온라인 테스트


왜 사용합니까 isInt(...)?1:0단지와isInt(...)
로마 그라프

@ RomanGräf 감사합니다. 맞습니다. 나는 많은 코드 단순화 후에 삼항을 떠 났는데, 그것을 볼 수 없을 정도로 분명했습니다.
Mario


2

파이썬 3, 40 바이트

f=lambda n:1if n<1else(2**n%n==2)+f(n-1)

2 ** (k-1)이 1 mod k와 일치하는 경우에만 홀수 정수 k가 소수입니다. 따라서이 조건을 확인하고 k = 2 인 경우 1을 더합니다.


2 ** n % n == 2는 원시 테스트만큼 충분하지 않습니다
RosLuP

@RosLuP 그렇기 때문에 n == 0의 기본 사례는 1을 더해야합니다 (n = 2 사례를 설명하기 위해).
Sandeep Silwal

2 ** n % n == 2는 일반적으로 충분하지 않습니다 ... 2 ^ n % n = 2가 소수 가 아닌 많은 숫자 (내가 기억하는 것에는 무한함)가 있습니다
RosLuP

예를 들어 341 = 11 * 31이지만 (2 ^ 341) mod 341 == 2
RosLuP

@RosLuP : 아 알았어, 찾았 어. 이 숫자를 Fermat Psuedoprimes라고하지만 아주 드문 것 같습니다 : P
Sandeep Silwal

2

MATL , 9 바이트

이는 소수 분해를 방지합니다. 복잡도는 O ( n ²)입니다.

:t!\~s2=s

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

:     % Range [1 2 ... n] (row vector)
t!    % Duplicate and transpose into a column vector
\     % Modulo with broadcast. Gives matrix in which entry (i,j) is i modulo j, with
      % i, j in [1 2 ... n]. A value 0 in entry (i,j) means i is divisible by j
~     % Negate. Now 1 means i is divisible by j
s     % Sum of each column. Gives row vector with the number of divisors of each j
2=    % Compare each entry with 2. A true result corresponds to a prime
s     % Sum

1

자바 스크립트 (ES6), 50 + 2 46 + 2 43 바이트

Neil 덕분에 3 5 바이트를 절약했습니다 .

f=n=>n&&eval(`for(z=n;n%--z;);1==z`)+f(n-1)

evaln매개 변수에 액세스 할 수 있습니다 . 확인하는 경우는 소수이다.
eval(...)n


이전 솔루션 :
함수 이름을 잊어 버렸기 때문에 바이트 수는 +2 여야합니다 f=(재귀 필요)

46 + 2 바이트 (ETH 프로덕션 덕분에 3 바이트 절약) :

n=>n&&eval(`for(z=n=${n};n%--z;);1==z`)+f(n-1)

50 + 2 바이트 :

n=>n&&eval(`for(z=${n};${n}%--z&&z;);1==z`)+f(n-1)

1
적어도 내 브라우저에서 5 바이트를 절약하는 함수에 매개 변수에 eval액세스 할 수 있습니다 n(이름을 잊어 버렸고 2 바이트 비용이 들었습니다. 실수 한 사람이 아니라는 것을 아는 것이 좋습니다).
Neil

@Neil 몰랐습니다 eval. 파이어 폭스, 크롬 및 엣지 테스트를 거쳤습니다. 설명은 statement context의 eval () 구문 분석입니다 . 두 가지 예 : a=12;f=b=>eval('a + 5');f(8)displays 17and a=12;f=a=>eval('a + 5');f(8)displays 13.
Hedi

1

자바 7,102 바이트

무차별 대입

int f(int n){int i=2,j=2,c=1,t=0;for(;i<=n;j=2,c+=t==1?1:0,i++)for(;j<i;t=i%j++==0?j=i+1:1);return c;}

언 골프

int f(int n){
int i=2,j=2,c=1,t=0;
for(;i<=n;j=2,c+=t==1?1:0,i++)
    for(;j<i;)
        t=i%j++==0?j=i+1:1;
    return c;
 }

이것은 현재 입력 결과가 잘못되었습니다 1. 현재 1대신에를 반환 합니다 0. 당신도 변경하여이 문제를 해결할 수 return c;return n<2?0:c;또는 변경 ,c=1,,c=n<2?0:1,.
Kevin Cruijssen


1

실제로 10 바이트

프라임 생성 함수를 사용한 첫 번째 실제 답변이 허용되지 않는 경우 다음은 윌슨 정리를 사용한 백업 답변입니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

R`;D!²%`MΣ

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

         Implicit input n.
R        Push range [1..n]
`...`M   Map the following function over the range. Variable k.
  ;        Duplicate k.
  D        Decrement one of the copies of k.
  !²       Push ((k-1)!)².
  %        Push ((k-1)!)² % k. This returns 1 if k is prime, else 0.
Σ        Sums the result of the map, adding all the 1s that represent primes, 
          giving the total number of primes less than n.
         Implicit return.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.