Stampa numeri primi vicini


9

Scrivi un programma che accetta un input (che può essere o meno un numero primo) ed elenca il numero primo che segue immediatamente e che lo precede.

Esempio di input:

1259

Esempio di output:

1249 1277

Vince il programma più breve. Deve essere eseguito entro 10 secondi su un moderno PC desktop. Gli input saranno limitati a un massimo di 10.000.


2
Sembra in qualche modo strano elencare un limite di tempo senza limitare anche la gamma di possibili ingressi. Ci viene richiesto di trovare numeri primi di diverse migliaia di cifre entro dieci secondi?
Anon.

@Anon. Supponiamo che non darò input ridicoli, ma il programma deve essere in qualche modo ottimizzato. Ho chiarito il testo della domanda.
Thomas O

il mio one-liner è tutt'altro che ottimale, ma funziona in ~ 1s per un input di 10000. Devi provare davvero tanto per avere bisogno di 10s.
ninjalj,

@ninjalj Solo per eliminare algoritmi assolutamente terribili.
Thomas O

3
quindi non consideri il test di un numero nper la primalità creando un ncarattere stringa lungo e testandolo contro una regex assolutamente terribile?
ninjalj,

Risposte:


6

Perl 5,10 (perl -E), 65 caratteri

La metà del credito (almeno) dovrebbe andare a @J B.

$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~/^1$|(^11+)\1+$/;say$n}

simpatico! il primo test regex!
Ming-Tang,


Sembra che potresti salvare un paio di personaggi con una regex citata (+2 per il qr-4 per non aver bisogno dei delimitatori in seguito).
Anon.

In realtà, funziona senza qr. LMGTFY: 81 caratteri$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB

Secondo turno, prendendo in considerazione entrambi i pattern match (66 caratteri):perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB


10

Mathematica: 28 caratteri

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

uso

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}

3

Python - 93

Basato sulla risposta di fR0DDY . Fondamentalmente ho unito le linee 4 e 5 e ho abbreviato la linea 2 usando un metodo diverso.

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

2

Python 116 111 109 Personaggi

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

1
usef=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le

@ fR0DDY, anziché utilizzare le prime 3 righe n=input()-1e m=n+2, salva 3 caratteri ... penso.
via

e forse è possibile sostituire not(all(...))da any(...)invertendo i booleani
st0le

Non conti nuove righe. Il conteggio effettivo è 108.
JPvdMerwe,

1
Inoltre, si prega di contare le nuove righe nel conteggio dei personaggi. -1 per ingannare gli altri.
Moinudin,


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

Esempio

Main> p 1259
(1249,1277)

1

Python, 116 139 caratteri (il doppio trattino è tab-char)

Usa un buon setaccio di Eratostene

Modifiche e (grazie a TON @JPvdMerwe). Ora dovrebbe funzionare con numeri primi.

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

Originale

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

-1 Per non contare lo spazio bianco NECESSARIO .
JPvdMerwe,

@JPvdMerwe Colpa mia, sono nuovo qui e mi sono reso conto che avrei potuto usare la metrica sbagliata dal mio editor.
Doug T.

@JPvDMerwe anche grazie per l'aiuto sulle modifiche
Doug T.

@DougT cool tutti commettono un errore :) +1 Per invertire il mio voto negativo, assicurati solo la prossima volta.
JPvdMerwe,

Un trucco che puoi fare è spostare le linee 1-3 sotto la linea 4 e sostituirle a=range(9999)con a=range(n). Anche nella riga 2 non è necessario passare aal lambda, puoi semplicemente usarlo. Questo dovrebbe radersi molto.
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,_))

ungolfed:

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 per eseguire tutti i 9998 ints da 3 a 10.000



1

Swift 190 187 185 110

Swift è pessimo nel code-golf, ma l'ho provato comunque: D
Sta diventando sempre più corto ... (Grazie a @HermanLauenstein per aver rimosso 75 byte)

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

-75 byte con molta ristrutturazione 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)}(non l'ho ancora testato correttamente)
Herman L

Grazie @HermanLauenstein. È il mio primo golf da codice, quindi ho bisogno di ogni aiuto :)
Josef Zoller,

0

Python (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: il Primesmodulo è stato scritto da me ma esisteva prima che questa domanda fosse posta. NON è stato scritto per questo. Tuttavia, questo è stato ritenuto ingiusto, quindi ecco la versione aggiornata.

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

Non so come sei riuscito a sbagliare il conto ma in realtà è:123
JPvdMerwe

Inoltre, @John a meno che il modulo non faccia ora parte del linguaggio, nell'interesse della correttezza dovresti includere il codice. Ma complimenti per l'onestà.
JPvdMerwe,

Penso che sia imbarazzante usare Primes; contro lo spirito del codice golf.
Thomas O

@JPv: Huh. È stato sbagliato Mi chiedo come sia successo.
Giovanni

@Thomas, @JPv: ho pubblicato una versione aggiornata senza importazione.
Giovanni



0

C (gcc) , 98 byte

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

Provalo online!

Versione completa del programma, C (gcc) , 116 byte

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

Provalo online!

Entrambe le versioni presumono che non testiamo mai 1 per primalità, cosa che accade solo se l'input è 2 o inferiore, nel qual caso l'output sarebbe indefinito comunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.