Suma de números primos entre el rango dado

27

Escriba el código más corto para encontrar la suma de primos entre ay b(inclusive).

Entrada

  1. ay bse puede tomar de la línea de comando o stdin (espacio separado)
  2. Suponga 1 <= a <= b <=10 8

Salida Simplemente imprima la suma con un carácter de nueva línea.

Puntos extra

  1. Si el programa acepta varios rangos (imprima una suma en cada línea), obtendrá puntos extra. :)
st0le
fuente
El límite superior es demasiado grande para permitir muchas soluciones interesantes (si tienen que completarse en un tiempo razonable, al menos).
hallvabo
@hallvabo ¿Le parecen interesantes las soluciones ineficientes?
Matthew leyó el
@hallvabo, está bien. No creo que a nadie le importe una solución ineficiente. Si el objeto de otro es, estaré más que feliz de reducir el límite
Todavía el
Acabo de hacer y ejecutar una versión no muy optimizada o concisa del programa en C #, usando 1 a 10 ^ 8. Suponiendo que mi algoritmo es correcto, se ejecutó en menos de 1m30 y no se desbordó por mucho tiempo. ¡Parece un buen límite superior para mí!
Nellius
Una comprobación rápida y fácil: suma de primos entre 1 y 100 = 1060.
Nellius

Respuestas:

15

J, 41 32 19 caracteres:

Actualizar

(tamiz simple)

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

p.ej

100 g 1
1060
250000x g 48
2623030823

Anterior

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

p.ej:

100 f 1
1060
Eelvex
fuente
11

Mathematica 7 (31 caracteres en texto plano)

Si la solución PARI / GP lo permite, entonces:

Plus@@Select[Range[a,b],PrimeQ]
Nakilon
fuente
¿Cual es tu punto? PARI / GP y Mathematica son buenos lenguajes de programación.
Eelvex
@Eelvex, no, rompen una de las reglas del golf: usar funciones específicas de alto nivel incorporadas .
Nakilon
No creo que haya tal regla . Todavía es una cuestión abierta cuándo utilizar funciones de alto nivel. Ver por ej. esta meta pregunta
Eelvex
1
28 caracteres Range[a,b]~Select~PrimeQ//Tr.
chyanog
6

C (117 incluyendo 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
fuente
5

C # (294 caracteres):

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
fuente
Usted puede hacer todas sus ints longy ahorrar unos cuantos caracteres: long a=...,b=...,t=0,i=a;for(;i<=b;i++). Esto lo lleva a 288 caracteres. También puede dejar que pdevuelva un valor largo y solo devolver uno 0o más ny acortar el ciclo a t+=p(i). 277 caracteres, entonces.
Joey
5

PARI / GP (44 caracteres)

sum(x=nextprime(a),precprime(b),x*isprime(x))
Eelvex
fuente
66
¿No deberían los votantes bajos dar una razón para su -1?
Eelvex
El voto negativo fue probablemente por usar incorporados.
mbomb007
4

BASH Shell

47 personajes

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

Editar: Acabo de darme cuenta de que la suma se desborda y se coacciona como un doble.

52 50 caracteres

Aquí hay una solución un poco más larga, pero también maneja los desbordamientos

seq 1 100|factor|awk NF==2{print\$2}|paste -sd+|bc
st0le
fuente
tr es más corto que pegar, y puede eliminar las comillas simples (escapar de $).
Nabb
@Nabb, lo arreglará tan pronto como tenga en mis manos una caja * nix, o podrías hacer los honores.
st0le
@Nabb, no puede hacer que funcione, tragrega un '+' al final, arreglarlo requerirá más caracteres.
st0le
Ah, lo extrañé. Aunque creo que aún puede cambiar para awk NF==2{print\$2}guardar un byte en la solución más larga (no nos toparemos accidentalmente con la expansión de llaves porque no hay comas ni ..s).
Nabb
@ Nabb, tienes razón. Hecho :)
st0le
4

C #, 183 caracteres

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

Esto sería mucho más corto si no tuviera que verificar 1, o si hubiera una mejor manera de ... En un formato más legible:

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
fuente
¡Me gusta lo breve que es esto, pero me pregunto cuán ineficiente sería al calcular hasta 10 ^ 8!
Nellius
Es cierto, ¡pero la eficiencia no estaba en las reglas!
Nick Larsen
¿Sabes que el compilador predetermina los números a 0, verdad? Eso te ahorrará un par de personajes más allí
jcolebrand
Da error cuando se compila sin él
Nick Larsen
... porque nunca se asigna antes de usarse (a través de s -= i;que es solo azúcar sintáctico al s = s - i;que intenta acceder santes de configurarlo)
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
fuente
Este es el código de golf! ¿Por qué usas nombres tan largos para tus cosas?
FUZxxl
44
Es difícil encontrar nombres más cortos que c, u, s ... El resto es una biblioteca estándar de lenguaje.
JB
3

Ruby 1.9, 63 caracteres

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

Usar así

p[1,100] #=> 1060

Usar la Primeclase se siente como hacer trampa, pero dado que las soluciones de Mathematica utilizan funciones principales integradas ...

Michael Kohl
fuente
3

Perl, 62 caracteres

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

Este usa el número primo regex.

ninjalj
fuente
3

Tarea normal (Python 3): 95 caracteres

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

Tarea de bonificación (Python 3): 119 caracteres

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
fuente
3

Pari / GP (24 caracteres)

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

Al igual que otras soluciones, esta no cumple estrictamente con los requisitos, como ay bno se leen de la entrada estándar o la línea de comandos. Sin embargo, pensé que era una buena alternativa a las otras soluciones de Pari / GP y Mathematica.

DanaJ
fuente
1
+1: Esta es la forma en que lo haría, incluso sin jugar al golf.
Charles
2

Lisp común: (107 caracteres)

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

solo funciona para puntos de partida> = 1

tobyodavies
fuente
2

APL (25 caracteres)

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

Esta es una modificación de un idioma conocido (vea esta página para obtener una explicación) para generar una lista de primos en APL.

Ejemplo:

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

Factor -> 98

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

Salida:

( scratchpad ) 100 1000 s

--- Data stack:
75067
defhlt
fuente
2

R, 57 caracteres

a=scan();b=a[1]:a[2];sum(b[rowSums(!outer(b,b,`%%`))==2])
plannapus
fuente
¿Es n=2necesario especificar en scan()? Si la entrada es estándar, ¿hay algún problema al omitir el argumento y asumir que se requiere un <enter> adicional?
Gaffi
1
No, en realidad tienes razón, podría haber prescindido. Fue puramente por razones estéticas (ya que sabía que mi código no era el más corto de todos modos :))
plannapus
Bueno, +1 de mi parte, ya que definitivamente no es el más largo.
Gaffi
2

Japt , 7 bytes

òV fj x

Pruébalo aquí

Erik el Outgolfer
fuente
Bienvenido a Japt :)
Shaggy
@Shaggy Originalmente intenté encontrar un "rango primario" integrado en Japt, pero luego decidí aceptar el desafío: p
Erik the Outgolfer
Dado la cantidad de desafíos relacionados con los números primos, un atajo fj<space>podría ser útil.
Shaggy
1

Perl, 103 caracteres

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

Aceptará múltiples líneas separadas por espacios y dará la respuesta para cada una: D

cobarde anónimo
fuente
1

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

Uso de muestra:

q)d[1;100]
1060
sinedcm
fuente
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
fuente
1

Mathematica , 27

Predefinido ay b:

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

Como una función (también 27):

Tr[Range@##~Select~PrimeQ]&
Señor mago
fuente
1

R (85 caracteres)

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

¡Extremadamente ineficiente! Estoy bastante seguro de que toma O (n ^ 2) tiempo. Puede dar advertencias sobre la coerción de un doble a un lógico.

Desobuscado:

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
fuente
1

Python 3.1 (153 caracteres):

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
fuente
1. from sys import*2. r=True-> r=1(y respectivamente 0para False) 3. if i%j==0and i!=j:r=04. if r:p+=[i]5. print(sum(p))(reemplaza las últimas 4 líneas)
ver
Puedes usar input()para ser más corto. Además, ¿puedes usar if i%j<1anden su lugar?
mbomb007
1

05AB1E , 5 bytes

ŸDp*O

Pruébalo en línea!

Ÿ      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
fuente
0

Python: 110 caracteres

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
fuente
Esto no es inclusivo.
jamylak
0

Python, 133

Un poco de brujería:

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
fuente
-1 (Bueno, todavía no tengo suficiente representante para votar a favor) Esto no es válido en Python 2 o 3, no puede esperar que la entrada contenga convenientemente comillas para usted. Cambie a raw_input o use python 3 plz
jamylak
Puede eliminar y+=1y en su lugar usar range(y+1)y ([0]*-~y)[::i]para guardar un byte (eliminar la nueva línea). Y usar Python 3 le permitirá usar input(), siempre y cuando ponga paréntesis después print, por lo tanto, elimine 4 bytes, pero agregue 1. Vale la pena.
mbomb007
0

133 caracteres, Lua (sin función integrada 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)

Aquí hay un ejemplo donde agregué la línea "print (i)" para mostrar todos los números primos encontrados y la suma al final de ellos: http://codepad.org/afUvYHnm .

usuario8524
fuente
"A y b se pueden tomar de la línea de comando o stdin" ¿En cuál de esas dos formas se pueden pasar los números a su código?
manatwork
1
De acuerdo con este 13 (cualquier cosa sobre él) no es un número primo.
st0le
@ st0le Según la lógica 13 es un "primo" (pero por ejemplo 2 no lo es) - por otro lado 13 * 13 = 169 es "primo" nuevamente ...
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
fuente
0

F # (141)

Un tercio del código es para analizar la entrada.

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
fuente