Salida de primos cercanos

9

Escriba un programa que tome una entrada (que puede ser primo o no), y enumera el primo inmediato que lo sigue y lo precede.

Entrada de ejemplo:

1259

Salida de ejemplo:

1249 1277

El programa más corto gana. Debe ejecutarse en 10 segundos en una PC de escritorio moderna. Las entradas se limitarán a un máximo de 10,000.

Thomas O
fuente
2
Parece algo extraño enumerar un límite de tiempo sin limitar también el rango de posibles entradas. ¿Estamos obligados a encontrar primos de varios miles de dígitos en diez segundos?
Anon
@Luego. Suponga que no daré entradas ridículas, pero el programa debe estar algo optimizado. He aclarado el texto de la pregunta.
Thomas O
mi one-liner es todo menos óptimo, pero se ejecuta en ~ 1s para una entrada de 10000. Tienes que esforzarte mucho para necesitar 10s.
ninjalj
@ninjalj Solo para eliminar algoritmos absolutamente horribles.
Thomas O
3
entonces, ¿no considera probar un número npara primalidad creando una cadena de ncaracteres larga y probando eso contra una expresión regular absolutamente horrible?
ninjalj

Respuestas:

6

Perl 5.10 (perl -E), 65 caracteres

La mitad del crédito (al menos) debe ir a @J B.

$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~/^1$|(^11+)\1+$/;say$n}
ninjalj
fuente
¡bonito! la prueba regular regex!
Ming-Tang
Parece que podría guardar un par de caracteres con una expresión regular citada (+2 para el qr, -4 por no necesitar los delimitadores más adelante).
Anon
En realidad, funciona sin qr. LMGTFY: 81 caracteres$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB
Segunda ronda, factorizando ambos partidos de patrones (66 caracteres):perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB
11

Mathematica , 19

#~NextPrime~{-1,1}&
Señor mago
fuente
muy inteligente: 0)
Dr. belisarius
10

Mathematica: 28 caracteres

(k=NextPrime;{k[#,-1],k@#})&  

Uso

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}
Dr. belisario
fuente
3

Python - 93

Basado en la respuesta de fR0DDY . Básicamente fusioné las líneas 4 y 5, y acorté la línea 2 usando un método diferente.

n=input()-1
m=n+2
f=lambda n:any(n%x<1for x in range(2,n))
exec"n-=f(n);m+=f(m);"*m
print n,m
JPvdMerwe
fuente
2

Python 116 111 109 Personajes

n=input()-1
m=n+2
f=lambda n:any(pow(b,n-1,n)>1for b in(3,5,7,13))
while f(n):n-=1
while f(m):m+=1
print n,m
fR0DDY
fuente
1
usof=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le
@ fR0DDY, en lugar de usar las primeras 3 líneas n=input()-1y m=n+2guarda 3 caracteres ... creo.
st0le
y tal vez se puede sustituir not(all(...))por any(...)la inversión de los booleanos
st0le
No cuentas nuevas líneas. El recuento real es 108.
JPvdMerwe
1
Además, cuente nuevas líneas en su cuenta de caracteres. -1 por engañar a otros.
Moinudin
2

J, 22 caracteres

(_4&p:,4&p:)(".stdin)_
Gareth
fuente
1

Haskell: 99

s(z:y)=z:s[x|x<-y,mod x z>0];f(x:y:z:w)=(x,z):f(y:z:w);p x=(head.filter(\(c,v)->c<x&&v>x).f.s)[2..]

Ejemplo

Main> p 1259
(1249,1277)
Ming-Tang
fuente
1

Python, 116 139 caracteres (la doble sangría es tab-char)

Utiliza buen tamiz ole de Eratóstenes

Ediciones y (gracias a TON @JPvdMerwe). Debería trabajar con primos ahora.

l=n=input();a=range(n*2)
for i in a[2:]:a=[k for k in a if k==i or k%i]
for g in a:
 if g>n:print l,g;break
 if i!=n:l=g

Original

a=range(9999)
j=lambda a,n:[i for i in a if i==n or i%n]
for i in a[2:]:a=j(a,i)
o=n=input();
for i in a:
 if o<n and i>n: 
  print o,i
 o=i
Doug T.
fuente
-1 Para no contar NECESARIO espacio en blanco.
JPvdMerwe
@JPvdMerwe Mi culpa, soy nuevo aquí, y me di cuenta de que podría haber usado la métrica incorrecta de mi editor.
Doug T.
@JPvDMerwe también agradece la ayuda en las ediciones
Doug T.
@DougT cool todos cometen un error :) +1 Para revertir mi voto negativo, solo asegúrese de la próxima vez.
JPvdMerwe
Un truco que puede hacer es mover las líneas 1-3 debajo de la línea 4 y reemplazar a=range(9999)con a=range(n). También en la línea 2 no necesita pasar aa la lambda, solo puede usarla. Esto debería afeitarse mucho.
JPvdMerwe
1

Scala 119:

def p(n:Int)=(2 to n-1).exists(n%_==0)
def i(n:Int,v:Int):Int=if(!p(n+v))n+v else i(n+v,v)
Seq(-1,1).map(i(readInt,_))

sin golf:

def notPrime (n:Int) = 
    (2 to n-1).exists (n % _ == 0)

def itPrime (n: Int, vector:Int) : Int =
    if (! notPrime (n+vector)) n+vector
    else itPrime (n+vector, vector)

def nearbyPrime (value: Int) =
    Seq (-1, 1).map (sign => itPrime (value, sign))

21.2s para ejecutar todos los 9998 ints de 3 a 10,000

usuario desconocido
fuente
1

Swift 190 187 185 110

Swift es muy malo en code-golf, pero lo intenté de todos modos: D
Se está volviendo cada vez más corto ... (Gracias a @HermanLauenstein por eliminar 75 bytes)

var a=Int(readLine()!)!;for b in[-1,1]{var n=a,c=0;while c<1{n+=b;c=1;for i in 2..<n{if n%i<1{c=0}}};print(n)}
Josef Zoller
fuente
-75 bytes con mucha reestructuración var a=Int(readLine()!)!;for b in[-1,1]{var n=a,c=0;while c<1{n+=b;c=1;for i in 2..<n{if n%i<1{c=0}}};print(n)}(aún no lo he probado correctamente)
Herman L
Gracias @HermanLauenstein. Es mi primer código de golf, así que puedo necesitar toda ayuda :)
Josef Zoller
0

Pitón (123)

import Primes as p
j=i=int(input())
n=p.primes(i*2)
while not i in n[:]:
 i+=1
print(i)
while not j in n[:]:
 j-=1
print(j)

NOTA: El Primesmódulo fue escrito por mí pero existía antes de que se hiciera esta pregunta. NO fue escrito para esto. Sin embargo, esto se consideró injusto, así que aquí está la versión actualizada.

Pitón (215)

j=i=int(input())
import math as m
s=list(range(i*2))
for n in s[:]:
 for l in range(1,int(m.ceil(m.sqrt(n)))):
  if(n%l)==0and l!=1and n in s:s.remove(n)
while not i in s:i+=1
print(i)
while not j in s:j-=1
print(j)
Juan
fuente
No sé cómo se las arregló para contar mal, pero en realidad es:123
JPvdMerwe
Además, @John a menos que el módulo ahora sea parte del lenguaje, en aras de la equidad, debe incluir el código. Pero felicitaciones por la honestidad.
JPvdMerwe
Creo que es engañoso usar Primes; contra el espíritu del código golf.
Thomas O
@JPv: Eh. Se había equivocado. Me pregunto como sucedió.
John
@Thomas, @JPv: publiqué una versión actualizada sin importar.
John
0

C (gcc) , 98 bytes

p(n,i){for(i=2;i<n;)n=n%i++?n:0;i=n;}g(n,d){for(;!p(n+=d););printf("%d ",n);}f(n){g(n,-1);g(n,1);}

Pruébalo en línea!

Versión completa del programa, C (gcc) , 116 bytes

p(n,i){for(i=2;i<n;)n=n%i++?n:0;i=n;}g(n,d){for(;!p(n+=d););printf("%d ",n);}main(n){scanf("%d",&n);g(n,-1);g(n,1);}

Pruébalo en línea!

Ambas versiones suponen que nunca probamos 1 para primalidad, lo que solo sucede si la entrada es 2 o inferior, en cuyo caso la salida no estaría definida de todos modos.

gastropner
fuente