Виведіть праймери поблизу


9

Напишіть програму, яка приймає вхід (який може бути, а може і не бути основним), і перераховує негайний простий наступний і перед ним.

Приклад введення:

1259

Приклад виводу:

1249 1277

Найкоротша програма виграє. Потрібно виконати протягом 10 секунд на сучасному настільному ПК. Вхід буде обмежений максимум 10000.


2
Перераховувати часовий ліміт здається дещо дивним, не обмежуючи також коло можливих входів. Чи потрібно відшукати декілька тисяч знаків у межах десяти секунд?
Анон.

@Anon. Припустимо, я не буду давати смішні входи, але програма повинна бути дещо оптимізована. Я уточнив текст запитання.
Томас О

мій однолайн - це все, але не оптимально, але він працює за ~ 1s для введення 10000. Ви повинні дуже постаратися, щоб знадобитися 10 секунд.
ніндзя

@ninjalj Просто для вилучення абсолютно жахливих алгоритмів.
Томас О

3
тож ви не вважаєте тестуванням числа nдля первинності, створюючи nдовгі символи рядків і тестуючи це на регулярному вираженні абсолютно жахливо?
ninjalj

Відповіді:


6

Perl 5,10 (perl -E), 65 символів

Половина кредиту (принаймні) повинна надійти на @J B.

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

приємно! основний тестовий геджекс!
Мінг-Тан

Так, я дізнався про це на stackoverflow.com/questions/3543811/code-golf-happy-primes
ninjalj

Здається, ви могли зберегти пару символів з цитованим регулярним виразом (+2 для qr, -4, щоб пізніше не знадобилися роздільники).
Анон.

Власне, це працює і без qr. LMGTFY: 81 годин$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB

Другий раунд, розбиваючи обидва поєдинки (66 символів):perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB



3

Пітон - 93

На основі відповіді від fR0DDY . Я в основному об'єднав лінії 4 і 5 і скоротив рядок 2, використовуючи інший метод.

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

Пітон 116 111 109 Персонажі

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
використанняf=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le

@ fR0DDY, замість перших 3 рядків використовується n=input()-1і m=n+2, зберігається 3 символи ... я думаю.
st0le

і , можливо , ви можете замінити not(all(...))на any(...)реверсування булеві
st0le

Ви не рахуєте нових рядків. Фактична кількість 108.
JPvdMerwe

1
Крім того, будь ласка, порахуйте нові рядки у своєму числі персонажів. -1 за обман інших.
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..]

Приклад

Main> p 1259
(1249,1277)

1

Python, 116 139 символів (подвійний відступ є табличкою)

Використовує гарне оле Сито Ератостена

Редагує та (спасибі TON @JPvdMerwe). Слід працювати з праймерами зараз.

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

Оригінал

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 Не рахуючи НЕОБХІДНОГО пробілу.
JPvdMerwe

@JPvdMerwe Моя провина, я тут новачок, і зрозумів, що, можливо, я скористався невірним показником у моєму редакторі.
Дуг Т.

@JPvDMerwe також дякує за допомогу в редагуванні
Doug T.

@DougT круто всі помиляються :) +1 Щоб змінити моє голосування, просто переконайтесь наступного разу.
JPvdMerwe

Один трюк, який ви можете зробити, - це перемістити лінії 1-3 нижче рядка 4 і замінити a=range(9999)на a=range(n). Також у другому рядку вам не потрібно переходити aдо лямбда, ви можете просто ним скористатися. Це повинно сильно стригти.
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,_))

неозорений:

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 запустити всі 9998 вставки від 3 до 10 000



1

Швидкий 190 187 185 110

Свіфт дуже поганий у коді-гольфі, але я все-таки спробував це: D
Це все коротше і коротше ... (Завдяки @HermanLauenstein, що видалив 75 байт)

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 байт з великою кількістю реструктуризації 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)}(я ще не перевірив її належним чином)
Герман L

Дякую @HermanLauenstein Це мій перший гольф з кодом, тому мені потрібна кожна допомога :)
Йозеф Золлер

0

Пітон (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)

ПРИМІТКА. PrimesМодуль був написаний мною, але він існував до того, як було задано це питання. Для цього НЕ було написано. Тим не менш, це було визнано несправедливим, тому ось оновлена ​​версія.

Пітон (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)

Я не знаю, як вам вдалося помилитися з вашим рахунком, але насправді це:123
JPvdMerwe

Крім того, @John, якщо модуль зараз не є частиною мови, з метою справедливості вам слід включити код. Але Кудо на чесність.
JPvdMerwe

Я думаю, що це обман використовувати Primes; проти духу кодового гольфу.
Томас О

@JPv: Так. Це було неправильно. Цікаво, як це сталося.
Джон

@Thomas, @JPv: Я опублікував оновлену версію без імпорту.
Джон



0

C (gcc) , 98 байт

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

Спробуйте в Інтернеті!

Повна версія програми, C (gcc) , 116 байт

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

Спробуйте в Інтернеті!

Обидві версії припускають, що ми ніколи не перевіряємо 1 на первинність, що відбувається лише в тому випадку, якщо вхід 2 або менший, і в такому випадку вихід не буде визначеним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.