Tổng các số nguyên tố giữa phạm vi đã cho


27

Viết mã ngắn nhất để tìm tổng các số nguyên tố giữa ab(bao gồm).

Đầu vào

  1. abcó thể được lấy từ dòng lệnh hoặc stdin (ngăn cách không gian)
  2. Giả sử 1 <= a <= b <=10 8

Đầu ra Chỉ cần in tổng với một ký tự dòng mới.

Điểm thưởng

  1. Nếu chương trình chấp nhận nhiều phạm vi (in một tổng trên mỗi dòng), bạn sẽ nhận được thêm điểm. :)

Giới hạn trên là quá lớn để cho phép nhiều giải pháp thú vị (ít nhất là chúng phải hoàn thành trong thời gian hợp lý).
hallvabo

@hallvabo Bạn thấy giải pháp không hiệu quả thú vị?
Matthew đọc

@hallvabo, không sao đâu Tôi không nghĩ bất cứ ai quan tâm đến một giải pháp không hiệu quả. Nếu là đối tượng của người khác, tôi sẽ rất hạnh phúc khi hạ thấp giới hạn
st0le

Chỉ cần thực hiện và chạy một phiên bản không được tối ưu hóa hoặc ngắn gọn của chương trình trong C #, sử dụng 1 đến 10 ^ 8. Giả sử thuật toán của tôi chính xác, nó chạy trong khoảng dưới 1m30 và không bị tràn ra từ lâu. Có vẻ như một giới hạn trên tốt với tôi!
Nellius

Kiểm tra dễ dàng nhanh chóng: tổng các số nguyên tố từ 1 đến 100 = 1060.
Nellius

Câu trả lời:


15

J, 41 32 19 ký tự:

Cập nhật

(rây đơn giản)

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

ví dụ

100 g 1
1060
250000x g 48
2623030823

Trước

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

ví dụ:

100 f 1
1060

11

Mathicala 7 (31 ký tự trong văn bản thuần túy)

Nếu giải pháp PARI / GP cho phép, thì:

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

Ý bạn là sao? PARI / GP và Mathicala là những ngôn ngữ lập trình tốt.
Eelvex

@Eelvex, không, họ phá vỡ một trong các quy tắc golf: sử dụng các chức năng highlevel cụ thể tích hợp .
Nakilon

Tôi không nghĩ có một quy tắc như vậy . Đây vẫn là một vấn đề mở khi sử dụng các hàm highlevel. Xem cho người cũ câu hỏi meta này
Mười hai

1
28 ký tự Range[a,b]~Select~PrimeQ//Tr.
chyanog

6

C (117 bao gồm NL)

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 ký tự):

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;}}

Bạn có thể làm cho tất cả bạn ints longvà lưu một vài ký tự: long a=...,b=...,t=0,i=a;for(;i<=b;i++). Điều này nhận được nó đến 288 ký tự. Bạn cũng có thể để ptrả về một khoảng thời gian dài và chỉ cần trả về 0hoặc nrút ngắn vòng lặp thành t+=p(i). 277 ký tự, sau đó.
Joey

5

PARI / GP (44 ký tự)

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

6
Các cử tri không nên đưa ra lý do cho -1 của họ?
Eelvex

Các downvote có lẽ là để sử dụng tích hợp.
mbomb007

4

Vỏ BASH

47 nhân vật

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

Chỉnh sửa: Chỉ cần nhận ra số tiền tràn ra và bị ép làm đôi.

52 50 ký tự

Đây là giải pháp dài hơn một chút, nhưng xử lý tràn

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

tr ngắn hơn dán và bạn có thể xóa các dấu ngoặc đơn (thoát khỏi $).
Nabb

@Nabb, sẽ sửa nó ngay khi tôi đặt tay vào hộp * nix, hoặc bạn có thể làm vinh dự.
st0le

@Nabb, không thể làm cho nó hoạt động, trthêm dấu '+' ở cuối, việc sửa nó sẽ mất nhiều ký tự hơn.
st0le

À, đã bỏ lỡ điều đó. Mặc dù tôi nghĩ rằng bạn vẫn có thể thay đổi để awk NF==2{print\$2}lưu một byte trên giải pháp dài hơn (chúng tôi sẽ không vô tình chạy vào mở rộng dấu ngoặc vì không có dấu phẩy hoặc ..s).
Nabb

@Nabb, bạn nói đúng. Xong :)
st0le

4

C #, 183 ký tự

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);}}

Thời gian này sẽ ngắn hơn nhiều nếu không phải kiểm tra 1 hoặc nếu có cách tốt hơn để ... Ở định dạng dễ đọc hơn:

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); 
    }
}

Tôi thích cái này ngắn như thế nào, nhưng tôi tự hỏi nó sẽ kém hiệu quả như thế nào khi tính toán tới 10 ^ 8!
Nellius

Đúng, nhưng hiệu quả không nằm trong quy tắc!
Nick Larsen

Bạn biết trình biên dịch mặc định số là 0 phải không? Điều đó giúp bạn tiết kiệm thêm một vài ký tự trong đó
jcolebrand

Đưa ra lỗi khi được biên dịch mà không có nó
Nick Larsen

... bởi vì nó không bao giờ được chỉ định trước khi nó được sử dụng (thông qua s -= i;vì đó chỉ là đường cú pháp s = s - i;cố gắng truy cập strước khi đặt nó)
Nick Larsen

3

Haskell (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


Đây là môn đánh gôn! Tại sao bạn sử dụng tên dài như vậy cho công cụ của bạn?
FUZxxl

4
Thật khó để tìm thấy tên ngắn hơn c, u, s ... Phần còn lại là thư viện chuẩn ngôn ngữ.
JB

3

Ruby 1.9, 63 ký tự

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

Sử dụng như thế này

p[1,100] #=> 1060

Sử dụng Primelớp cảm giác như gian lận, nhưng vì các giải pháp Mathicala đã sử dụng các hàm nguyên tố tích hợp ...


3

Perl, 62 ký tự

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

Cái này sử dụng regex số nguyên tố.


3

Nhiệm vụ bình thường (Python 3): 95 ký tự

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)))

Nhiệm vụ tiền thưởng (Python 3): 119 ký tự

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 ký tự)

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

Giống như một số giải pháp khác, điều này không đáp ứng đúng các yêu cầu, abkhông được đọc từ stdin hoặc dòng lệnh. Tuy nhiên, tôi nghĩ rằng nó là một giải pháp thay thế tốt cho các giải pháp Pari / GP và Mathicala khác.


1
+1: Đây là cách tôi thực sự làm, ngay cả khi không chơi gôn.
Charles

2

Lisp thường gặp: (107 ký tự)

(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))

chỉ hoạt động cho điểm bắt đầu> = 1


2

APL (25 ký tự)

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

Đây là một sửa đổi của một thành ngữ nổi tiếng (xem trang này để được giải thích) để tạo danh sách các số nguyên tố trong APL.

Thí dụ:

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

2

Yếu tố -> 98

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

Đầu ra:

( scratchpad ) 100 1000 s

--- Data stack:
75067

2

R, 57 ký tự

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

Là chỉ định n=2cần thiết trong scan()? Nếu đầu vào là tiêu chuẩn, có vấn đề gì với việc bỏ qua đối số và giả sử cần thêm <enter> không?
Gaffi

1
Không thực sự bạn đúng tôi có thể làm mà không có. Nó hoàn toàn là vì lý do thẩm mỹ (vì tôi biết mã của mình dù sao cũng không phải là ngắn nhất :))
plannapus

Chà, +1 từ tôi cũng vậy, vì nó chắc chắn không phải là dài nhất.
Gaffi


1

Perl, 103 ký tự

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

Nó sẽ chấp nhận nhiều dòng phân tách không gian và đưa ra câu trả lời cho mỗi dòng: D


1

Trong 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}

Sử dụng mẫu:

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

Toán học , 27

Được xác định trước ab:

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

Là một hàm (cũng 27):

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

1

R (85 ký tự)

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

Vô cùng kém hiệu quả! Tôi khá chắc chắn rằng nó mất thời gian O (n ^ 2). Nó có thể đưa ra cảnh báo về việc ép một cú đúp thành logic.

Khử nhiễu:

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 ký tự):

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(và tương ứng 0cho False) 3. if i%j==0and i!=j:r=04. if r:p+=[i]5. print(sum(p))(thay thế 4 dòng cuối cùng)
seequ

Bạn có thể sử dụng input()để được ngắn hơn. Ngoài ra, bạn có thể sử dụng if i%j<1andthay thế?
mbomb007


1

05AB1E , 5 byte

ŸDp*O

Hãy thử trực tuyến!

Ÿ      Push the list [a, ..., b]
 D     Push a duplicate of that list
  p    Replace primes with 1 and everything else with 0
   *   Element-wise multiply the two lists [1*0, 2*1, 3*1, 4*0, ...]
    O  Sum of the final list of primes

0

Python: 110 ký tự

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)))

Điều này không bao gồm.
jamylak

0

Con trăn, 133

Một chút phép thuật:

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 (Chà tôi chưa có đủ đại diện để tải xuống) Điều này không hợp lệ trong Python 2 hoặc 3, bạn không thể mong đợi đầu vào có thể tiện lợi chứa dấu ngoặc kép cho bạn. Thay đổi thành raw_input hoặc sử dụng python 3 plz
jamylak

Bạn có thể loại bỏ y+=1và thay vào đó sử dụng range(y+1)([0]*-~y)[::i]để lưu một byte (loại bỏ dòng mới). Và sử dụng Python 3 sẽ cho phép bạn sử dụng input(), miễn là bạn đặt dấu ngoặc đơn sau printđó, do đó loại bỏ 4 byte, nhưng thêm 1. Đáng giá.
mbomb007

0

133 ký tự, Lua (không có hàm is_prime trong chế tạo)

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)

Đây là một ví dụ trong đó tôi đã thêm dòng "print (i)" để hiển thị tất cả các số nguyên tố được tìm thấy và tổng ở cuối chúng: http://codepad.org/afUvYHnm .


Có thể lấy một số a và b từ dòng lệnh hoặc stdin. Trong hai cách đó, các số đó có thể được chuyển vào mã của bạn không?
manatwork

1
Theo điều này 13 (bất cứ điều gì trên nó) không phải là một số nguyên tố.
st0le

@ st0le Theo logic 13 là "số nguyên tố" (nhưng ví dụ 2 không phải) - mặt khác 13 * 13 = 169 lại là "số nguyên tố" ...
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)

Một phần ba mã là để phân tích cú pháp đầu vào.

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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.