Summe der Primzahlen zwischen den angegebenen Bereichen


27

Schreiben Sie den kürzesten Code, um die Summe der Primzahlen zwischen aund b(einschließlich) zu ermitteln.

Eingang

  1. aund bkann von der Kommandozeile oder stdin genommen werden (Leerzeichen getrennt)
  2. Angenommen, 1 <= a <= b <=10 8

Ausgabe Drucken Sie einfach die Summe mit einem Zeilenumbruch aus.

Bonuspunkte

  1. Wenn das Programm mehrere Bereiche akzeptiert (geben Sie eine Summe in jede Zeile ein), erhalten Sie zusätzliche Punkte. :)

Die Obergrenze ist zu groß, um viele interessante Lösungen zuzulassen (wenn sie zumindest in angemessener Zeit abgeschlossen sein müssen).
Hallvabo

@hallvabo Sie finden ineffiziente Lösungen interessant?
Matthew Read

@hallvabo, das ist ok Ich denke nicht, dass es jemandem etwas ausmacht, eine ineffiziente Lösung zu finden. Wenn
jemand

Ich habe gerade eine nicht sehr optimierte oder prägnante Version des Programms in C # mit 1 bis 10 ^ 8 erstellt und ausgeführt. Unter der Annahme, dass mein Algorithmus korrekt ist, lief er in weniger als 1:30 Minuten und lief nicht lange über. Scheint mir eine feine Obergrenze zu sein!
Nellius

Ein schneller und einfacher Check: Summe der Primzahlen zwischen 1 und 100 = 1060.
Nellius

Antworten:


15

J, 41 32 19 Zeichen:

Aktualisieren

(einfaches Sieb)

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

z.B

100 g 1
1060
250000x g 48
2623030823

Bisherige

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

z.B:

100 f 1
1060

11

Mathematica 7 (31 Zeichen im Klartext)

Wenn eine PARI / GP-Lösung zulässig ist, gilt Folgendes:

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

Worauf willst du hinaus? PARI / GP und Mathematica sind gute Programmiersprachen.
Eelvex,

@Eelvex, nein, sie brechen eine der Golfregeln: Sie verwenden eingebaute spezifische Highlevel-Funktionen .
Nakilon

Ich glaube nicht, dass es eine solche Regel gibt . Es ist immer noch offen, wann High-Level-Funktionen verwendet werden sollen. Siehe zum Beispiel. Diese Meta-Frage
Eelvex

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

6

C (117 einschließlich 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 Zeichen):

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

Sie können alle Ihre machen ints longund ein paar Zeichen sparen: long a=...,b=...,t=0,i=a;for(;i<=b;i++). Das bringt es auf 288 Zeichen. Sie können auch peine lange zurückgeben lassen und einfach entweder 0oder zurückgeben nund die Schleife auf kürzen t+=p(i). Dann also 277 Zeichen.
Joey

5

PARI / GP (44 Zeichen)

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

6
Sollten nicht down-Wähler einen Grund für ihre -1 angeben?
Eelvex,

Die Ablehnung war wahrscheinlich für die Verwendung von Built-Ins.
mbomb007

4

BASH Shell

47 Zeichen

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

Bearbeiten: Gerade wurde erkannt, dass die Summe überläuft und als Double gezwungen wird.

52 50 Zeichen

Hier ist eine etwas längere Lösung, behandelt aber auch Überläufe

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

tr ist kürzer als paste, und Sie können die einzelnen Anführungszeichen entfernen (escape the $).
Nabb

@Nabb, werde das Problem beheben, sobald ich eine * nix-Box in die Hände bekomme, oder du könntest die Ehre erweisen.
st0le

@Nabb, kann es nicht zum Laufen bringen, trfügt am Ende ein abschließendes '+' hinzu, wodurch mehr Zeichen benötigt werden.
st0le

Ah, das habe ich verpasst. Obwohl ich denke, dass Sie immer noch ändern können, awk NF==2{print\$2}um ein Byte für die längere Lösung zu speichern (wir werden nicht versehentlich auf eine Klammererweiterung stoßen, weil es keine Kommas oder ..s gibt).
Nabb

@Nabb, du hast recht. Fertig :)
st0le

4

C #, 183 Zeichen

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

Dies wäre viel kürzer, wenn es nicht nach 1 suchen müsste oder wenn es einen besseren Weg gäbe, ... In einem besser lesbaren Format:

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

Ich mag, wie kurz das ist, aber ich frage mich, wie ineffizient es sein würde, wenn man bis zu 10 ^ 8 rechnet!
Nellius

Stimmt, aber Effizienz war nicht in den Regeln!
Nick Larsen

Sie wissen, dass der Compiler Zahlen standardmäßig auf 0 setzt, oder? Das erspart Ihnen noch ein paar Zeichen
Jcolebrand

Gibt Fehler, wenn ohne es kompiliert
Nick Larsen

... weil es nie zugewiesen wird, bevor es verwendet wird (via s -= i;weil das nur syntaktischer Zucker ist, auf s = s - i;den versucht wird, svor dem Festlegen zuzugreifen )
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


Das ist Code-Golf! Warum benutzt du so lange Namen für deine Sachen?
FUZxxl

4
Es ist schwer, kürzere Namen als c, u, s zu finden ... Der Rest ist eine Sprachstandardbibliothek.
JB

3

Ruby 1,9, 63 Zeichen

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

Verwenden Sie wie folgt

p[1,100] #=> 1060

Das Verwenden der PrimeKlasse fühlt sich wie Schummeln an, aber da die Mathematica-Lösungen integrierte Hauptfunktionen verwendeten ...


3

Perl, 62 Zeichen

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

Dieser verwendet die Primzahl Regex.


3

Normale Aufgabe (Python 3): 95 Zeichen

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

Bonusaufgabe (Python 3): 119 Zeichen

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

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

Wie einige andere Lösungen, dies entspricht nicht unbedingt den Anforderungen, wie aund bnicht von stdin oder die Befehlszeile zu lesen. Ich fand es jedoch eine gute Alternative zu den anderen Pari / GP- und Mathematica-Lösungen.


1
+1: So würde ich es auch ohne Golf machen.
Charles

2

Common Lisp: (107 Zeichen)

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

funktioniert nur für Startpunkte> = 1


2

APL (25 Zeichen)

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

Dies ist eine Modifikation einer bekannten Redewendung ( eine Erklärung finden Sie auf dieser Seite ) zum Generieren einer Liste von Primzahlen in APL.

Beispiel:

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

2

Faktor -> 98

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

Ausgabe:

( scratchpad ) 100 1000 s

--- Data stack:
75067

2

R, 57 Zeichen

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

Ist die Angabe in n=2erforderlich scan()? Wenn es sich bei der Eingabe um eine Standardeingabe handelt, gibt es ein Problem beim Auslassen des Arguments und der Annahme, dass ein zusätzliches <Eingabetaste> erforderlich ist?
Gaffi

1
Nein, eigentlich hast du recht, ohne das ich hätte auskommen können. Es war rein aus ästhetischen Gründen (da ich wusste, dass mein Code sowieso nicht der kürzeste war :))
Plannapus

Naja, +1 von mir trotzdem, da es definitiv nicht die längste ist.
Gaffi


1

Perl, 103 Zeichen

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

Es akzeptiert mehrere durch Leerzeichen getrennte Zeilen und gibt die Antwort für jede: 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}

Beispielnutzung:

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

Vordefiniert aund b:

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

Als eine Funktion (auch 27):

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

1

R (85 Zeichen)

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

Extrem ineffizient! Ich bin mir ziemlich sicher, dass es O (n ^ 2) Zeit braucht. Es kann Warnungen geben, dass ein Double zu einem Logical gezwungen werden soll.

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

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(bzw. 0für False) 3. if i%j==0and i!=j:r=04. if r:p+=[i]5. print(sum(p))(ersetzt die letzten 4 Zeilen)
siehe auch

Sie können verwenden input(), um kürzer zu sein. Können Sie if i%j<1andstattdessen auch verwenden?
mbomb007


1

05AB1E , 5 Bytes

ŸDp*O

Probieren Sie es 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 Zeichen

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

Dies ist nicht inklusive.
Jamylak

0

Python, 133

Ein bisschen Zauberei:

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 (Nun, ich habe noch nicht genug Repräsentanten, um sie abzustimmen) Dies ist in Python 2 oder 3 ungültig. Sie können nicht erwarten, dass Eingaben für Sie bequem Anführungszeichen enthalten. Wechseln Sie zu raw_input oder verwenden Sie python 3 plz
jamylak

Sie können entfernen y+=1und stattdessen range(y+1)und verwenden ([0]*-~y)[::i], um ein Byte zu speichern (Entfernen der Zeilenumbrüche). Und mit Python 3 können Sie verwenden input(), solange Sie nachher Klammern setzen print, also 4 Bytes entfernen, aber 1 hinzufügen. Es lohnt sich.
mbomb007

0

133 Zeichen, Lua (keine eingebaute Funktion von 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)

Hier ist ein Beispiel, in dem ich die Zeile "print (i)" hinzugefügt habe, um alle gefundenen Primzahlen und die Summe am Ende derselben anzuzeigen: http://codepad.org/afUvYHnm .


"A und b können von der Kommandozeile oder von stdin übernommen werden" Auf welche dieser beiden Arten können die Zahlen an Ihren Code übergeben werden?
Manatwork

1
Demnach ist 13 (irgendetwas darüber) keine Primzahl.
st0le

@ st0le Nach der Logik ist 13 eine "Primzahl" (aber zB ist 2 keine) - andererseits ist 13 * 13 = 169 wieder "Primzahl" ...
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)

Ein Drittel des Codes dient zum Parsen der Eingabe.

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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.