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

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

11

Mathematica 7 (31 caracteres en texto plano)

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

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

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

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

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

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

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

¡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


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


3

Perl, 62 caracteres

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

Este usa el número primo regex.


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

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.


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


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

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

2

R, 57 caracteres

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

¿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


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


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

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

Predefinido ay b:

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

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

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

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)

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

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

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

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)

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


"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

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"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.