指定された範囲間の素数の合計


27

aとの間の素数の合計を見つけるための最短コードを記述しますb(包括的)。

入力

  1. aそして、b、コマンドラインまたは標準入力から撮影することができます(スペースは区切り)
  2. 1 <= a <= b <=10 8と仮定する

出力 合計を改行文字で印刷するだけです。

ボーナスポイント

  1. プログラムが複数の範囲を受け入れる場合(各行に合計を1つ印刷する)、余分なポイントを取得します。:)

上限が大きすぎて、多くの興味深い解決策を許可できません(少なくとも妥当な時間内に完了する必要がある場合)。
-hallvabo

@hallvabo非効率的なソリューションがおもしろいと思いますか?
マシュー

@hallvabo、大丈夫です。誰もが非効率的なソリューションを気にかけているとは思わない。他のオブジェクトの場合、制限を下げることができればうれしいです
-st0le

1〜10 ^ 8を使用して、C#でプログラムのあまり最適化されていない、または簡潔なバージョンを作成して実行しました。私のアルゴリズムが正しいと仮定すると、1m30s未満で実行され、長い間オーバーフローしませんでした。私にはすばらしい上限のようです!
ネリアス

簡単な簡単なチェック:1から100までの素数の合計=1060。-
ネリウス

回答:


15

J、41 32 19文字:

更新

(簡単なふるい)

g=:+/@(*1&p:)@-.&i.

例えば

100 g 1
1060
250000x g 48
2623030823

h=:3 :'+/p:i.(_1 p:>:y)'
f=:-&h<:

例えば:

100 f 1
1060

11

Mathematica 7(プレーンテキストで31文字)

PARI / GPソリューションが許可されている場合:

Plus@@Select[Range[a,b],PrimeQ]

あなたのポイントは何ですか?PARI / GPとMathematicaは素晴らしいプログラミング言語です。
エルベックス

@Eelvex、いいえ、彼らはゴルフのルールの1つを破ります:組み込みの特定の高レベル関数を使用します
ナキロン

私はそのような規則があるとは思わない。高レベル関数をいつ使用するかは未解決のままです。exを参照してください。このメタの質問
エルベックス

1
28文字Range[a,b]~Select~PrimeQ//Tr
チャノッグ

6

C(NLを含む117)

main(a,b,s,j){
s=0,scanf("%d%d",&a,&b);
for(a+=a==1;a<=b;a++)
for(s+=a,j=2;j<a;)
s-=a%j++?0:(j=a);
printf("%d",s);
}

5

C#(294文字):

using System;class P{static void Main(){int a=int.Parse(Console.ReadLine()),b=int.Parse(Console.ReadLine());long t=0;for(int i=a;i<=b;i++)if(p(i))t+=i;Console.WriteLine(t);}static bool p(int n){if((n%2<1&&n!=2)||n<2)return 0>1;for(int i=3;i<=Math.Sqrt(n);i+=2)if(n%i==0)return 0>1;return 1>0;}}

あなたはすべてのあなたの作ることができるintのがlong、いくつかの文字を保存しますlong a=...,b=...,t=0,i=a;for(;i<=b;i++)。これにより、288文字になります。またp、longを返して、どちらか0またはnを返して、ループをに短縮することもできますt+=p(i)。277文字です。
ジョーイ

5

PARI / GP(44文字)

sum(x=nextprime(a),precprime(b),x*isprime(x))

6
ダウン有権者は-1の理由を示すべきではありませんか?
エルベックス

ダウン票はおそらくビルトインを使用するためのものでした。
mbomb007

4

BASHシェル

47文字

seq 1 100|factor|awk 'NF==2{s+=$2}END{print s}'

編集:合計がオーバーフローし、ダブルとして強制されていることを認識しました。

52 50文字

これはもう少し長いソリューションですが、オーバーフローも処理します

seq 1 100|factor|awk NF==2{print\$2}|paste -sd+|bc

trはpasteよりも短く、一重引用符を削除できます(エスケープします$)。
ナブ

@Nabbは、* nixボックスを手に入れるとすぐに修正します。
-st0le

@Nabb、それを動作させることができずtr、末尾に「+」を追加し、修正するとより多くの文字が必要になります。
st0le

ああ、それを見逃した。awk NF==2{print\$2}長いソリューションでバイトを節約するためにまだ変更できると思います(コンマや..s がないため、誤ってブレース拡張に遭遇することはありません)。
ナブ

@Nabb、あなたは正しい。完了:)
st0le

4

C#、183文字

using System;class P{static void Main(string[] a){long s=0,i=Math.Max(int.Parse(a[0]),2),j;for(;i<=int.Parse(a[1]);s+=i++)for(j=2;j<i;)if(i%j++==0){s-=i;break;}Console.WriteLine(s);}}

これは、1をチェックする必要がない場合、またはより良い方法があった場合、はるかに短くなります...より読みやすい形式で:

using System;
class P 
{ 
    static void Main(string[] a) 
    { 
        long s = 0,
             i = Math.Max(int.Parse(a[0]),2),
             j;

        for (; i <= int.Parse(a[1]);s+=i++)
            for (j = 2; j < i; )
                if (i % j++ == 0)
                {
                    s -= i;
                    break;
                }

        Console.WriteLine(s); 
    }
}

これがどれほど短いかは気に入っていますが、最大10 ^ 8まで計算すると、どれほど効率が悪いのでしょうか。
ネリアス

確かに、効率はルールにはありませんでした!
ニックラーセン

コンパイラはデフォルトで数値を0にデフォルト設定します。そこにいくつかの文字を保存します
-jcolebrand

それなしでコンパイルするとエラーが発生します
ニックラーセン

...使用される前に割り当てられることはないため(それは、設定する前にアクセスしようとするs -= i;単なる構文上の砂糖でs = s - i;あるsため)
ニックラーセン

3

ハスケル(80)

c=u[2..];u(p:xs)=p:u[x|x<-xs,x`mod`p>0];s a b=(sum.filter(>=a).takeWhile(<=b))c

s 1 100 == 1060


これはコードゴルフです!どうしてそんなに長い名前を使うのですか?
FUZxxl

4
c、u、sよりも短い名前を見つけるのは難しい...残りは言語標準ライブラリです。
JB

3

Ruby 1.9、63文字

require'prime';p=->a,b{Prime.each(b).select{|x|x>a}.inject(:+)}

このように使用する

p[1,100] #=> 1060

Primeクラスを使用することは不正行為のように感じますが、Mathematicaソリューションでは組み込みの素数関数を使用しているため...


3

Perl、62文字

<>=~/\d+/;map$s+=$_*(1x$_)!~/^1$|(^11+)\1+$/,$&..$';print$s,$/

これは、素数の正規表現を使用します。


3

通常タスク(Python 3):95文字

a,b=map(int,input().split())
r=range
print(sum(1%i*all(i%j for j in r(2,i))*i for i in r(a,b+1)))

ボーナスタスク(Python 3):119文字

L=iter(map(int,input().split()))
r=range
for a,b in zip(L,L):print(sum(1%i*all(i%j for j in r(2,i))*i for i in r(a,b+1)))

3

パリ/ GP(24文字)

s=0;forprime(i=a,b,s+=i)

いくつかの他のソリューションと同様、これは厳密として、要件を満たしていないaと、b標準入力またはコマンドラインから読み込まれません。しかし、他のPari / GPおよびMathematicaソリューションの優れた代替品だと思いました。


1
+1:これは、ゴルフをしなくても、実際に行う方法です。
チャールズ

2

Common Lisp:(107文字)

(flet((p(i)(loop for j from 2 below i never (= (mod i j) 0))))(loop for x from(read)to(read)when(p x)sum x))

開始点> = 1でのみ機能します


2

APL(25文字)

+/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕

これは、よく知られているイディオムの修正です(このページを参照してください APLで素数のリストを生成するための説明についてを。

例:

      +/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕
⎕:
      100
⎕:
      1
1060

2

係数-> 98

:: s ( a b -- n )
:: i ( n -- ? )
n 1 - 2 [a,b] [ n swap mod 0 > ] all? ;
a b [a,b] [ i ] filter sum ;

出力:

( scratchpad ) 100 1000 s

--- Data stack:
75067

2

R、57文字

a=scan();b=a[1]:a[2];sum(b[rowSums(!outer(b,b,`%%`))==2])

で指定がn=2必要scan()ですか?入力が標準の場合、引数を省略し、追加の<enter>が必要であると仮定することに問題はありますか?
ガフィ

1
いいえ、実際にはそうではありません。それは純粋に審美的な理由のためでした(とにかく私のコードは最短ではないことを知っていたので:))
plannapus

まあ、間違いなく最長ではないので、私からの+1も同じです。
ガフィ

2

Japtへようこそ:)
シャギー

@Shaggy私はもともとJaptに組み込まれた "prime range"を見つけようとしましたが、チャレンジを受け入れることにしました:p
エリックアウトゴルファー

プライムに関連する課題がいくつあるかを考えると、ショートカットfj<space>が便利です。
シャギー

1

Perl、103文字

while(<>){($a,$b)=split/ /;for($a..$b){next if$_==1;for$n(2..$_-1){$_=0if$_%$n==0}$t+=$_;}print"$t\n";}

複数のスペースで区切られた行を受け入れ、それぞれに答えを与えます:D


1

Q(95)の場合:

d:{sum s:{if[2=x;:x];if[1=x;:0];$[0=x mod 2;0;0=min x mod 2+til floor sqrt x;0;x]}each x+til y}

サンプル使用法:

q)d[1;100]
1060

1

C#302

using System;namespace X{class B{static void Main(){long x=long.Parse(Console.ReadLine()),y=long.Parse(Console.ReadLine()),r=0;for(long i=x;i<=y;i++){if(I(i)){r+=i;}}Console.WriteLine(r);}static bool I(long n){bool b=true;if(n==1){b=false;}for(long i=2;i<n;++i){if(n%i==0){b=false;break;}}return b;}}}


1

R(85文字)

x=scan(nmax=2);sum(sapply(x[1]:x[2],function(n)if(n==2||all(n %% 2:(n-1)))n else 0))

非常に非効率的です!O(n ^ 2)時間がかかると確信しています。ダブルを論理型に強制することについて警告を与える場合があります。

難読化解除:

x <- scan(nmax=2)
start <- x[1]
end <- x[2]

#this function returns n if n is prime, otherwise it returns 0.
return.prime <- function(n) {
  # if n is 2, n is prime. Otherwise, if, for each number y between 2 and n, n mod y is 0, then n must be prime
  is.prime <- n==2 || all(n%% 2:(n-1))
  if (is.prime)
    n
  else
    0
} 
primes <- sapply(start:end, return.prime)
sum(primes)

1

Python 3.1(153文字):

from sys import*
p=[]
for i in range(int(argv[1]),int(argv[2])):
 r=1
 for j in range(2,int(argv[2])):
  if i%j==0and i!=j:r=0
 if r:p+=[i]
print(sum(p))

1. from sys import*2. r=True- > r=1(それぞれ0のためのFalse3)if i%j==0and i!=j:r=04. if r:p+=[i]5 print(sum(p))(置き換え最後の4行)
seequ

input()短くするために使用できます。また、if i%j<1and代わりに使用できますか?
mbomb007



0

Python:110文字

l,h=map(int,raw_input().split())
print sum(filter(lambda p:p!=1 and all(p%i for i in range(2,p)),range(l,h)))

これは包括的ではありません。
ジャミラック

0

Python、133

少しの魔術:

x,y=map(int,raw_input().split())
y+=1
a=range(y)
print sum(i for i in[[i for a[::i]in[([0]*y)[::i]]][0]for i in a[2:]if a[i]]if i>=x)

-1(まあ、まだ投票するのに十分な担当者がいません)これはPython 2または3では無効です。入力に便利な引用符が含まれることは期待できません。raw_inputに変更するか、Python 3 plzを使用してください
jamylak

削除しy+=1、代わりにandを使用range(y+1)([0]*-~y)[::i]てバイトを保存できます(改行を削除します)。また、Python 3を使用するとinput()、の後に括弧を付ける限りを使用できるため、print4バイトを削除しますが、1を追加します。
mbomb007

0

133文字、Lua(is_prime組み込み関数なし)

for i=m,n,1 do
if i%2~=0 and i%3~=0 and i%5~=0 and i%7~=0 and i%11~=0 then
s=s+1
end
end
print(s)

ここに、「print(i)」という行を追加して、見つかったすべての素数とそれらの最後の合計を表示する例を示します:http : //codepad.org/afUvYHnm


「aとbはコマンドラインまたはstdinから取得できます」これらの2つの方法のどちらで、数値をコードに渡すことができますか?
マナトワーク

1
この13(それ以上のもの)によると、素数ではありません。
st0le

@ st0le論理によると、13は「素数」ですが(たとえば2はそうではありません)-一方、13 * 13 = 169は再び「素数」です
ハワード

0

PowerShell-94

$a,$b=$args[0,1]
(.{$p=2..$b
while($p){$p[0];$p=@($p|?{$_%$p[0]})}}|
?{$_-gt$a}|
measure -s).sum

0

F#(141)

コードの3分の1は入力を解析するためのものです。

let[|a;b|]=System.Console.ReadLine().Split(' ')
{int a..int b}|>Seq.filter(fun n->n>1&&Seq.forall((%)n>>(<>)0){2..n-1})|>Seq.sum|>printfn"%A"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.