プライムカウント機能


28

前書き

プライムカウント機能もPiの関数としても知られている、、以下の素数の量を返すまたはXに等しいです。πバツ

チャレンジ

あなたのプログラムは、正と仮定できる整数xを取り、x以下の素数に等しい単一の整数を出力します。これはチャレンジなので、勝者はバイト数が最も少ないプログラムになります。

この課題が発生する前に存在する限り、任意の言語を使用できますが、言語に組み込みの素数カウント関数または素数チェック関数(Mathematicaなど)がある場合、その関数はコードで使用できません。

入力例

入力:
1
出力:
0

入力:
2
出力:
1

入力:
5
出力:
3

A000720-OEIS


3
他の素数関連の関数はどうですか?たとえば、「次の素数」関数
ルイスメンドー

6
素因数分解関数はどうですか?
マルティセン

4
プログラミングパズルとコードゴルフへようこそ!
アドナン

6
アドナンが言ったように、PPCGへようこそ!今後の課題については、メインサイトに投稿する前に意味のあるフィードバックと批評を得るために課題を投稿できるSandboxをお勧めします。
AdmBorkBork

これが@TheBikingVikingがリンクすることを意味したものだと思います:関連
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
くそー、私は母国語でrektを2回目に取得してます。+1
アドナン

なぜこれが機能するのですか?
オリバーNi

1
ための階乗@Oliver nは全て整数で割り切れる1、...、N(特に、素数P≤N )、およびno他の素数によってQ> Nより小さな数値の積として表すことができないからです。
デニス

10

Python 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%k素数の場合は1、素数以外の場合は0です。


底から上に階乗を計算することは素晴らしいトリックです。+1
ETHproductions

6

MATL11、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

デニスの天才ソリューションのおかげで3バイト節約


それは、機能「素因数分解の指数」を使用するので、その1つのベクトル化短いです:YF!s1=s
ルイスMendo

@LuisMendoこれはまったく異なるアプローチですので、気軽に投稿して投稿してください。(あなたがしたくない場合が、私は喜んだろう)
DJMcMayhem

先に行く。練習のためにジェリーに移植します:-)
ルイスメンドー

5

ゼリー8 5バイト

@Dennisのおかげで3バイト節約!

RÆESL

オンラインでお試しください!

デニスが改良したDJMcMayhemのMATLアンサー(旧バージョン)ポート。

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
訂正:ルイスメンドーのポート:DJMcMayhemのMATL回答。:P
DJMcMayhem

2
ÆE各指数は異なる素因数に対応するため、の結果の最大長のみが必要です。RÆESLそれを実現します。!ÆELさらに短くなります。
デニス

1
@デニスありがとう!最初の提案を使用しました。2つ目はあまりにも異なっており、あなたのアプローチです
ルイスメンドー

5

ParserFunctionsを使用した MediaWikiテンプレート、220 + 19 = 239バイト

{{#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}}}

Lispスタイルで配置:

{{#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までの基本的な素数テスト。彼らの周りの3つの括弧付き数字は、変数、ある{{{1}}}nは{{{2}}}テストされている番号で、{{{3}}}チェックする要因です。


5

Perl、33バイト

+1を含む -p

STDINに入力番号を指定します

primecount.pl

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

間違った結果を与えますが、それは問題あり0ません、opは正の整数のみのサポートを要求しました。


4

網膜、31バイト

バイトカウントはISO 8859-1エンコードを前提としています。入力を単項に変換1n、それぞれの行にからの範囲を生成します。素数を一致させます。

.*
$*
\B
¶$`
m`^(?!(..+)\1+$)..

オンラインで試す -2800をはるかに超える入力がタイムアウトするか、メモリを使い果たします。

参照:

マーティンのレンジジェネレーター

マーティンのプライムチェッカー



4

ゼリー13 11 10 9 8 7 6 バイト

組み込みのプライム関数を一切使用しない
@milesのおかげで-1バイト(テーブルを使用)
@Dennisのおかげで-1バイト(単項から除数にカウントアップする)

ḍþḅ1ċ2

TryItOnline
またはn=[1,100] TryItOnlineでもシリーズの最初の100項をご覧ください

どうやって?

ḍþḅ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バイトを保存します。
デニス

4

JavaScript(ES6)、45 43バイト

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

私の36 35 33バイトの素数関数の変更(@Neilで1バイト、@ Arnauldで2バイト保存):

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

この番号は素数であるため、どこにも投稿できません完全なプログラムのみを受け付けます...)

テストスニペット


ワウ...理解するのに時間がかかった。良くやった!
todeale

悲しいことに、それはあなたの答えには当てはまりませんが、おそらく&あなたの素数関数の真ん中にあるもので逃げることができます。
ニール

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++カウンターと結合。ループ内でフェンスポストがどのように機能するかにより、エッジケースの入力1とを考慮するための前面の少し追加のロジック。2for


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今はどうなっているのでしょう?
魔法のタコUr


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はい、あなたは正しいですが、私はそれ自身でコンパイルしない関数部分のみを与えました
アリエルベレスラフスキー


かっこいいね!
FantaC


2

Bash + coreutils、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"));
    }
}

100万を超えるとしばらく時間がかかり始めます。


2

Matlab、60バイト

1行のMatlab関数への添付を続けます。組み込みの因数分解を使用しない場合:

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

素数にyは2つの要素しかないことを考えると、2つの要素しかない[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

Jellyには組み込みの素数カウント関数ÆCと素数チェック関数がありÆP、代わりに組み込みの素数生成関数ÆRを使用し、lengthを取りますL

素因数分解ビルトインを使用するのとほぼ同じ境界線だと思います。これには!Æv!階乗、Æv素因数のカウント)で3バイトもかかります


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;

RomanGräfのおかげで4バイト節約

オンラインでテストする

未ゴルフのテストコード:

$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(...)
ローマGräf16年

@RomanGräfありがとう、あなたは正しい。たくさんのコードを単純化した後、私は三位一体を去りました、そしてそれは私がそれを見ることができなかったほど明白だった...-
マリオ


2

Python 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 primaly試験として十分ではない
RosLuP

@RosLuPこれが、n == 0の基本ケースが1を追加する理由です(n = 2のケースを説明するため)。
サンディープシルワル

2 ** n%n == 2は一般に十分ではありません... 素数ではない 2 ^ n%n = 2の多くの(私が覚えている限りでは無限の)数字があります
RosLuP

たとえば、341 = 11 * 31だが(2 ^ 341)mod 341 == 2
RosLuP

@RosLuP:ああ、はい、私は調べました。これらの番号はフェルマープードプライムと呼ばれますが、非常にまれであるように見えます: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

JavaScript(ES6)、50 + 2 46 + 2 43バイト

ニールのおかげで3 5バイトを節約しました:

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

evalnパラメータにアクセスできます。かどうかをチェックするには、素数です。
eval(...)n


以前の解決策:
関数に名前を付けるのを忘れたため、バイトカウントは+2でなければなりませんf=(再帰に必要)

46 + 2バイト(ETHproductionsのおかげで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
少なくとも私のブラウザーでevaln、関数にパラメーターにアクセスできます(名前を忘れて、2バイトのコストがかかります;私がその間違いを犯したのは私だけではないことを知っているのは良いことです)。
ニール

@Neilは知らなかったeval。firefox、chrome、edgeでテストし、うまくいきました。説明は、文contextのeval()解析です。2つの例:a=12;f=b=>eval('a + 5');f(8)ディスプレイ17a=12;f=a=>eval('a + 5');f(8)ディスプレイ13
エディ

1

Java 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,ます。
ケビン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.