Verilen aralık arasındaki primlerin toplamı


27

aVe b(dahil) arasındaki asalların toplamını bulmak için en kısa kodu yazın .

Giriş

  1. ave bkomut satırından veya stdin'den alınabilir (boşluk ayrılmış)
  2. 1 <= a <= b <=10 8 varsay

Çıktı Sadece toplamı yeni satır karakteriyle yazdırın.

Bonus puanlar

  1. Program birden fazla aralık kabul ederse (her satıra bir toplam yazdır), fazladan puan alırsınız. :)

Üst sınır, birçok ilginç çözüme izin vermek için çok büyük (eğer makul bir sürede tamamlamaları gerekiyorsa).
hallvabo

@hallvabo Verimsiz çözümleri ilginç mi buluyorsunuz?
Matthew

@hallvabo, Sorun değil. Hiç kimsenin etkisiz bir çözüm bulabildiğini sanmıyorum. Başka birinin objesi varsa, limiti düşürmekten çok mutlu olacağım
st0le

Sadece 1 ila 10 ^ 8 kullanarak, C # dilinde programın çok optimize edilmemiş veya özlü olmayan bir sürümünü yaptım ve çalıştırdım. Algoritmamın doğru olduğunu varsayarsak, 1m30s altında çalıştı ve uzun süredir taşmadı. Bana iyi bir üst sınır gibi geliyor!
Nellius

Hızlı ve kolay kontrol: 1 ile 100 =
1060

Yanıtlar:


15

J, 41 32 19 karakter:

Güncelleştirme

(basit elek)

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

Örneğin

100 g 1
1060
250000x g 48
2623030823

Önceki

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

Örneğin:

100 f 1
1060

11

Mathematica 7 (Düz metin halinde 31 karakter)

PARI / GP çözümüne izin verilirse:

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

Ne demek istiyorsun? PARI / GP ve Mathematica iyi programlama dilleridir.
Eelvex

@Eelvex, hayır, golf kurallarından birini çiğniyorlar: yerleşik yüksek seviye fonksiyonlar kullanarak .
Nakilon,

Böyle bir kural olduğunu sanmıyorum . Yüksek seviyeli fonksiyonların ne zaman kullanılacağı hala açık bir konudur. Örneğin bkz. Bu meta soru
Eelvex,

1
28 karakter Range[a,b]~Select~PrimeQ//Tr.
Chyanog

6

C (117 dahil 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 karakter):

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

Sen tüm yapabilirsiniz ints longve birkaç karakter kaydedin: long a=...,b=...,t=0,i=a;for(;i<=b;i++). Bu 288 karakter alır. Ayrıca puzun dönmeye izin verebilir ve sadece ya geri dönebilir ya 0da ndöngüyü kısaltabilirsiniz t+=p(i). O zaman 277 karakter.
Joey

5

PARI / GP (44 karakter)

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

6
Aşağı seçmenlerin -1 için bir sebep vermemesi gerekir mi?
Eelvex

Olumsuz oy muhtemelen yerleşik kullanım içindi.
mbomb007

4

BASH Kabuğu

47 karakter

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

Düzenleme: Sadece toplam taşma fark etti ve bir çift olarak zorlanır.

52 50 Karakterler

İşte size biraz daha uzun bir çözüm, ancak aynı zamanda taşmaları ele alır

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

tr yapıştırma işleminden daha kısadır ve tek tırnak işaretlerini kaldırabilir (çıkıştan $).
Nabb

@Nabb, ellerimi bir * nix kutusuna koyar açmaz düzelteceğim, ya da onuru yapabilirsin.
st0le

@ Nabb, işe alınamıyor, trsonunda bir '+' işareti ekliyor, düzeltilmesi daha fazla karakter alacak.
st0le

Ah, bunu özledim. Yine awk NF==2{print\$2}de daha uzun bir çözümde bir bayttan tasarruf etmek için hala değişiklik yapabileceğinizi düşünüyorum (yanlışlıkla virgül ya da ..s yok çünkü küme ayracı genişletmeyle karşılaşmayacağız ).
Nabb

@ Nabb, haklısın. Yapıldı :)
st0le

4

C #, 183 karakter

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

Bu, 1'i kontrol etmek zorunda kalmazsa veya daha iyi bir yol olsaydı ... daha okunaklı bir biçimde:

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

Bunun ne kadar kısa olduğunu seviyorum, ama 10 ^ 8'e kadar ne kadar verimsiz olacağını merak ediyorum!
Nellius

Doğru, ancak verimlilik kuralda değildi!
Nick Larsen,

Derleyici varsayılanlarını sayısal olarak 0'a doğru biliyor musunuz? Orada bir kaç karakter daha
kazanacağım

Onsuz derlendiğinde hata veriyor
Nick Larsen

... çünkü kullanılmadan önce hiç kullanılmadığı için ( s -= i;çünkü, ayarlamadan önce s = s - i;erişmeye çalıştığı sadece sözdizimsel şeker olduğu için s)
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


Bu kod golf! Eşyaların için neden bu kadar uzun isimler kullanıyorsun?
FUZxxl,

4
C, u, s'den daha kısa isimler bulmak zor ... Gerisi dil standart kütüphanesi.
JB

3

Ruby 1.9, 63 karakter

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

Bu gibi kullanın

p[1,100] #=> 1060

PrimeSınıfı kullanmak hile yapmak gibi geliyor, ancak yerleşik asal işlevleri kullanan Mathematica çözümleri ...


3

Perl, 62 karakter

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

Bu bir asal sayı regex kullanır.


3

Normal Görev (Python 3): 95 karakter

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

Bonus Görev (Python 3): 119 karakter

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

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

Diğer bazı çözümlerin gibi, bu kesinlikle gibi gereksinimlerini karşılamıyor ave bStdin veya komut satırından okunmaz. Ancak diğer Pari / GP ve Mathematica çözümlerine güzel bir alternatif olduğunu düşündüm.


1
+1: Bu, aslında golf olmadan bile, benim yaptığım yol.
Charles,

2

Ortak Lisp: (107 karakter)

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

sadece başlangıç ​​noktaları için çalışır> = 1


2

APL (25 karakter)

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

Bu, APL'de bir primerler listesi oluşturmak için iyi bilinen bir deyimin ( açıklama için bu sayfaya bakınız) bir modifikasyonudur .

Örnek:

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

2

Faktör -> 98

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

Çıktı:

( scratchpad ) 100 1000 s

--- Data stack:
75067

2

R, 57 karakter

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

Belirtmek n=2gerekli scan()midir? Girdi standartsa, argümanı atlamakta ve fazladan bir <enter> gerekli olduğunu varsaymakla ilgili bir sorun mu var?
Gaffi

1
Hayır, aslında haklısın, onsuz yapabilirdim. Tamamen estetik nedenlerden
ibaretti

Benden +1 de aynısı, kesinlikle en uzun sürdüğü gibi.
Gaffi


1

Perl, 103 chars

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

It'll accept multiple space separated lines and give the answer for each :D


1

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

Sample Usage:

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

Mathematica, 27

Predefined a and b:

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

As a function (also 27):

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

1

R (85 characters)

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

Extremely inefficient! I'm pretty sure it takes O(n^2) time. It might give warnings about coercing a double to a logical.

Deobfuscated:

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

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 (and respectively 0 for False) 3. if i%j==0and i!=j:r=0 4. if r:p+=[i] 5. print(sum(p)) (replaces last 4 lines)
seequ

You can use input() to be shorter. Also, can you use if i%j<1and instead?
mbomb007


1

05AB1E, 5 bytes

ŸDp*O

Try it online!

Ÿ      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 chars

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

This is not inclusive.
jamylak

0

Python, 133

A little bit of sorcery:

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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.