주어진 범위 사이의 소수의 합


27

a및 사이에 소수의 합을 찾기위한 가장 짧은 코드를 작성하십시오 b.

입력

  1. ab명령 줄이나 표준 입력에서 취할 수 있습니다 (공간 구분)
  2. 1 <= a <= b <=10 8 가정

출력 개행 문자로 합계를 인쇄하십시오.

보너스 포인트

  1. 프로그램이 여러 범위를 허용하는 경우 (각 줄에 하나의 합계를 인쇄) 추가 점수를 얻습니다. :)

상한값이 너무 커서 많은 흥미로운 솔루션을 만들 수 없습니다 (적어도 적당한 시간 내에 완료해야하는 경우).
hallvabo

@hallvabo 비효율적 인 솔루션이 흥미 롭습니까?
Matthew 읽기

@hallvabo, 괜찮습니다. 나는 아무도 비효율적 인 해결책을 생각하지 않습니다. 다른 사람의 목표라면, 한계를 낮추는 것이 더 행복 할 것입니다
st0le

1 ~ 10 ^ 8을 사용하여 C #에서 매우 최적화되지 않거나 간결한 버전의 프로그램을 만들고 실행했습니다. 내 알고리즘이 올바른 것으로 가정하면 1m30s 미만으로 실행되어 오랫동안 오버플로되지 않았습니다. 나에게 훌륭한 상한 인 것 같습니다!
Nellius

쉬운 점검 : 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

@Eelvex는 아닙니다. 내장 된 특정 고급 기능을 사용 하는 골프 규칙 중 하나를 위반 합니다 .
Nakilon

나는 그런 규칙 이 없다고 생각 합니다. 높은 수준의 기능을 사용할 때 여전히 공개적인 문제입니다. 예를 참조하십시오. 이 메타 질문
Eelvex

1
28 개 문자 Range[a,b]~Select~PrimeQ//Tr.
chyanog

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긴을 반환하고 단지 중 하나를 반환 0또는 n과에 루프를 단축 t+=p(i). 그러면 277 자입니다.
Joey

5

PARI / GP (44 자)

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

6
다운 유권자들이 -1의 이유를 제시해서는 안됩니까?
Eelvex

downvote는 아마도 내장 기능을 사용하기위한 것입니다.
mbomb007

4

배쉬 쉘

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

@Nabb, * nix 상자에 손을 대 자마자 고치거나 명예를 낼 수 있습니다.
st0le

@Nabb, 작동하지 않아 tr끝에 끝에 '+'를 추가하면 더 많은 문자가 필요합니다.
st0le

아, 그것을 놓쳤다. awk NF==2{print\$2}더 긴 솔루션에서 바이트를 절약 하기 위해 여전히 변경할 수 있다고 생각하지만 (쉼표 또는 ..s 가 없기 때문에 실수로 중괄호 확장이 발생하지는 않습니다 ).
Nabb

@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을 계산할 때 얼마나 비효율적 일지 궁금합니다!
Nellius

사실, 효율성은 규칙에 없었습니다!
Nick Larsen

컴파일러의 기본값은 0입니다. 그것은 거기에 몇 문자를 더 저장합니다
jcolebrand

그것없이 컴파일하면 오류가 발생합니다
Nick Larsen

... 사용하기 전에 할당되지 s -= i;않았기 때문에 ( 설정하기 전에 s = s - i;액세스하려는 구문 설탕 때문이므로 s)
Nick Larsen

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

루비 1.9, 63 자

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

이런 식으로 사용

p[1,100] #=> 1060

Prime클래스를 사용하는 것은 속임수처럼 느껴지지만 Mathematica 솔루션은 내장 된 주요 기능을 사용했기 때문에 ...


3

펄, 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

Pari / GP (24 자)

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

다른 솔루션과 마찬가지로,이 엄격과 같이 요구 사항을 충족하지 않는 ab표준 입력 또는 명령 행에서 읽을 수 없습니다. 그러나 다른 Pari / GP 및 Mathematica 솔루션의 훌륭한 대안이라고 생각했습니다.


1
+1 : 이것이 골프 없이도 실제로하는 방식입니다.
Charles

2

일반적인 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>가 필요하다고 가정하는 데 문제가 있습니까?
Gaffi

1
내가 실제로 할 수있는 것은 옳지 않다. 그것은 순수하게 미학적 이유로 (내 코드가 어쨌든 가장 짧지 않다는 것을 알고 있기 때문에 :))
plannapus

글쎄, 나에게서 +1은 가장 길지 않기 때문에 동일합니다.
Gaffi


1

펄, 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

매스 매 티카 , 27

사전 정의 ab:

a~Range~b~Select~PrimeQ//Tr

함수로서 (또한 27) :

Tr[Range@##~Select~PrimeQ]&

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

파이썬 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

파이썬 : 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)))

이것은 포함되지 않습니다.
jamylak

0

파이썬, 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 (Well I don't have enough rep to downvote yet) This is invalid in Python 2 or 3, you can't expect input to conveniently contain quotation marks for you. Change to raw_input or use python 3 plz
jamylak

You can remove y+=1 and instead use range(y+1) and ([0]*-~y)[::i] to save a byte (removing the newline). And using Python 3 will allow you to use input(), as long as you put parentheses after print, therefore removing 4 bytes, but adding 1. Worth it.
mbomb007

0

133 chars, Lua (no is_prime in-built function)

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)

Here's an example where I added the line "print(i)" to display all primes found and the sum at the end of them: http://codepad.org/afUvYHnm.


“a and b can be taken from command line or stdin” In which of those two ways can the numbers be passed to your code?
manatwork

1
According to this 13 (anything over it) is not a prime number.
st0le

@st0le According to the logic 13 is a "prime" (but e.g. 2 is not) - on the other hand 13*13 = 169 is "prime" again...
Howard

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)

One third of the code is for parsing the input.

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.