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. :)
st0le
quelle
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
Eelvex
quelle
11

Mathematica 7 (31 Zeichen im Klartext)

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

Plus@@Select[Range[a,b],PrimeQ]
Nakilon
quelle
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);
}
Alexandru
quelle
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;}}
Nellius
quelle
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))
Eelvex
quelle
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
st0le
quelle
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); 
    }
}
Nick Larsen
quelle
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

Ming-Tang
quelle
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 ...

Michael Kohl
quelle
3

Perl, 62 Zeichen

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

Dieser verwendet die Primzahl Regex.

Ninjalj
quelle
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)))
jamylak
quelle
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.

DanaJ
quelle
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

tobyodavies
quelle
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
Dillon Cower
quelle
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
defhlt
quelle
2

R, 57 Zeichen

a=scan();b=a[1]:a[2];sum(b[rowSums(!outer(b,b,`%%`))==2])
Plannapus
quelle
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
2

Japt , 7 Bytes

òV fj x

Probieren Sie es hier aus.

Erik der Outgolfer
quelle
Willkommen bei Japt :)
Shaggy
@ Shaggy Ich habe ursprünglich versucht, eine in Japt integrierte "Prime Range" zu finden, habe mich dann aber entschlossen, die Herausforderung anzunehmen: p
Erik the Outgolfer
In Anbetracht der Anzahl der mit Primzahlen verbundenen Herausforderungen kann eine Abkürzung für fj<space>nützlich sein.
Shaggy
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

anonymer Feigling
quelle
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
sinedcm
quelle
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;}}}
Saumil
quelle
1

Mathematica , 27

Vordefiniert aund b:

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

Als eine Funktion (auch 27):

Tr[Range@##~Select~PrimeQ]&
Mr.Wizard
quelle
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)
raptortech97
quelle
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))
John
quelle
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
Galoubet
quelle
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)))
zxul767
quelle
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)
JBernardo
quelle
-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 .

user8524
quelle
"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
Rynant
quelle
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"
Ming-Tang
quelle