Wyprowadzaj pobliskie liczby pierwsze

9

Napisz program, który pobiera dane wejściowe (które mogą, ale nie muszą być liczbami pierwszymi), i podaje listę liczb pierwszych następujących po niej i poprzedzających ją.

Przykładowe dane wejściowe:

1259

Przykładowe dane wyjściowe:

1249 1277

Najkrótszy program wygrywa. Musi zostać wykonany w ciągu 10 sekund na nowoczesnym komputerze stacjonarnym. Wejścia będą ograniczone do maksymalnie 10 000.

Thomas O
źródło
2
Wydaje się nieco dziwne wyliczenie limitu czasowego bez ograniczania zakresu możliwych danych wejściowych. Czy musimy znaleźć kilka tysięcy cyfr liczb pierwszych w ciągu dziesięciu sekund?
Anon.
@Zaraz. Załóżmy, że nie dam niedorzecznych danych wejściowych, ale program musi być nieco zoptymalizowany. Wyjaśniłem tekst pytania.
Thomas O
mój jednowierszowy nie jest optymalny, ale działa w ciągu ~ 1s przy wejściu 10000. Musisz naprawdę bardzo się starać, aby potrzebować 10s.
ninjalj
@ninjalj Po prostu wyeliminować absolutnie okropne algorytmy.
Thomas O
3
więc nie rozważasz przetestowania liczby pod kątem pierwszeństwa n, tworząc ndługie ciągi znaków i testując je pod względem wyrażenia regularnego absolutnie okropne?
ninjalj

Odpowiedzi:

6

Perl 5.10 (perl-E), 65 znaków

Połowa kredytu (przynajmniej) powinna trafić do @J B.

$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~/^1$|(^11+)\1+$/;say$n}
ninjalj
źródło
miły! regex pierwszego testu!
Ming-Tang,
tak, dowiedziałem się o tym na stackoverflow.com/questions/3543811/code-golf-happy-primes
ninjalj
Wygląda na to, że można zapisać kilka znaków z cytowanym wyrażeniem regularnym (+2 za qr, -4 za niepotrzebne ograniczników później).
Anon.
W rzeczywistości działa bez qr. LMGTFY: 81 znaków$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB
Druga runda, z uwzględnieniem obu dopasowań wzorów (66 znaków):perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB
12

Mathematica , 19

#~NextPrime~{-1,1}&
Mr.Wizard
źródło
bardzo sprytny: 0)
Dr Belisarius
10

Mathematica: 28 znaków

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

Stosowanie

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}
Dr Belizariusz
źródło
3

Python - 93

Na podstawie odpowiedzi fR0DDY . Zasadniczo połączyłem linie 4 i 5 i skróciłem linię 2, stosując inną metodę.

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
źródło
2

Python 116 111 109 Znaków

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
źródło
1
usef=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le,
@ fR0DDY, zamiast użycia pierwszych 3 linii n=input()-1i m=n+2zapisuje 3 znaki ... myślę.
st0le
a może not(all(...))any(...)
zastąpisz to
Nie liczysz nowych linii. Rzeczywista liczba to 108.
JPvdMerwe,
1
Ponadto policz nowe znaki w swojej liczbie znaków. -1 za oszukiwanie innych.
moinudin
2

J, 22 znaki

(_4&p:,4&p:)(".stdin)_
Gareth
źródło
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..]

Przykład

Main> p 1259
(1249,1277)
Ming-Tang
źródło
1

Python, 116 139 znaków (podwójne wcięcie to tab-char)

Wykorzystuje dobre sito z Eratostenesa

Edycja i (dzięki TON @JPvdMerwe). Powinien działać teraz z liczbami pierwszymi.

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

Oryginalny

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.
źródło
-1 Za nie liczenie KONIECZNE białych znaków .
JPvdMerwe,
@JPvdMerwe Moja wina, jestem tu nowy i zdałem sobie sprawę, że mogłem użyć niewłaściwych danych z mojego edytora.
Doug T.,
@JPvDMerwe również dziękuje za pomoc w edycji
Doug T.
@DougT cool wszyscy popełniają błąd :) +1 Aby cofnąć mój głos, upewnij się, że następnym razem.
JPvdMerwe,
Jeden trick można zrobić, to przenieść linie 1-3 poniżej linii 4 i wymienić a=range(9999)z a=range(n). Również w linii 2 nie musisz przechodzić ado lambda, możesz po prostu z niej skorzystać. To powinno się dużo golić.
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,_))

bez golfa:

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,2 s, aby uruchomić wszystkie 9998 ints od 3 do 10.000

nieznany użytkownik
źródło
1

Swift 190 187 185 110

Swift jest bardzo zły w golfowym kodzie, ale i tak spróbowałem: D
Robi się coraz krótszy ... (Dzięki @HermanLauenstein za usunięcie 75 bajtów)

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
źródło
-75 bajtów z dużą restrukturyzacją 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)}(jeszcze nie przetestowałem tego poprawnie)
Herman L
Dzięki @HermanLauenstein. To moja pierwsza gra w golfa, więc potrzebuję każdej pomocy :)
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)

UWAGA: PrimesModuł został napisany przeze mnie, ale istniał przed zadaniem tego pytania. NIE zostało napisane do tego. Niemniej jednak uznano to za niesprawiedliwe, więc tutaj jest zaktualizowana wersja.

Python (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)
Jan
źródło
Nie wiem, jak udało ci się pomylić liczbę 123
rachunków,
Ponadto @John, chyba że moduł jest teraz częścią języka, w trosce o sprawiedliwość należy dołączyć kod. Ale Kudos na szczerości.
JPvdMerwe
Myślę, że to oszustwo w użyciu Primes; wbrew duchowi golfa kodowego.
Thomas O
@JPv: Huh. To było złe Zastanawiam się, jak to się stało.
Jan
@Thomas, @JPv: Opublikowałem zaktualizowaną wersję bez importu.
Jan
0

C (gcc) , 98 bajtów

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

Wypróbuj online!

Pełna wersja programu, C (gcc) , 116 bajtów

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

Wypróbuj online!

Obie wersje zakładają, że nigdy nie testujemy 1 pod kątem pierwotności, co dzieje się tylko wtedy, gdy dane wejściowe wynoszą 2 lub mniej, w takim przypadku dane wyjściowe i tak byłyby niezdefiniowane.

gastropner
źródło