Знайдіть прайми в Пі


30

Прайми є скрізь ...

вони ховаються всередині Пі

3,141592653 58979 3238 462643 3832 795 028 841 971 693 993 751

Давайте дістаньмося цих праймерів!

Змагання

Подавши введення цілого числа n>0, з’ясуйте, скільки простих nліній приховано всередині перших цифрPi

Приклади

Бо n=3нам слід шукати праймери в [3,1,4]. Існує 2 Primes (3,31), тому ваш код повинен виводити 2
For n=10, перші 10 цифр є, [3,1,4,1,5,9,2,6,5,3]а ваш код повинен виводитися, 12тому що вони [2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]були приховані (і знайдені!)

Випробування

вхід -> вихід

1->1  
3->2  
13->14  
22->28  
42->60  
50->93

150->197  
250->363  
500->895

Правила

Ваш код повинен бути в змозі знайти всі прості числа , по крайней мере , наn=50
Так, ви можете жорстко перші 50 цифр від Piякщо ви любите
записи жорсткого кодування відповідей невірні

Це Найкоротша відповідь у байтах виграє!


6
"ви можете жорстко кодувати перші 50 цифр Pi, якщо вам подобається" . Перша проблема вирішена! Тепер для тесту первинності для гольфу на до 50-значних цілих чисел ... O_o (Це приємний виклик, але, мабуть, потрібні міцні вбудовані математики або бібліотеки.)
Арнольд,

3
@totallyhuman Ця послідовність ще не існує в ОЕІС! Час вашої претензії на славу?
Санчіз

3
ІМО, що дозволяє жорстке кодування перших 50 значень, шкодить цій проблемі. Ця проблема в основному складається з двох частин: 1) спробувати стиснути перші 50 значень, або 2) реально зробити завдання.
JAD

2
Зазвичай у подібних викликах, коли обчислення стає важчим / повільнішим / інтенсивнішим в пам'яті, програмі достатньо працювати теоретично, замість того, щоб встановлювати довільне відсічення та допускати жорстке кодування.
JAD

3
@BillSteihn Оновлення правил після декількох відповідей суперечить духу цього веб-сайту. Ви розмістили це питання в пісочниці ? Ви б мали відгуки дуже рано, що надійдуть жорсткі відповіді.
Олів'є Грегоар,

Відповіді:


20

05AB1E ,  10  8 байт

-2 байти завдяки Аднану ( pвекторизи)

<žsþŒÙpO

Спробуйте в Інтернеті! (буде працювати до n = 98413, але буде дуже повільним навіть для n = 50 через необхідність тестувати такі великі числа для первинності - TIO разів вичерпується за 60 секунд для n = 50.)

Як?

<žsþŒÙpO - implicitly push input, n
<        - decrement = n-1
 žs      - pi to that many decimal places (i.e. to n digits)
   þ     - only the digits (get rid of the decimal point)
    Π   - all sublists
     Ù   - unique values
      p  - is prime? (vectorises) 1 if so, 0 otherwise
       O - sum
         - implicitly print the top of the stack

<žsþŒÙpOповинен працювати на 8 байт
Аднан

Ага так, pвекторизуємо спасибі!
Джонатан Аллан

2
Так! Нарешті, дуже коротка відповідь коду на гольф, яку я насправді розумію! : D
Фабіан Рьолінг

11

Математика, 76 байт

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&

О, ні ярмарок, я не знайомий з гольфом Mathematica. : P (+1)
абсолютнолюдський

@totallyhuman Ми розмістили це одночасно. це так дивно!
J42161217

Я відповів гольфом за допомогою деяких синтаксичних хитрощів, але я втримав функції, які раніше використовував. Сподіваюся, ви не заперечуєте.
повністюлюдський

Tr[1^...]Це розумний спосіб знайти довжину списку, приємно!
numbermaniac

6

Математика, 104 97 90 байт

Length@DeleteDuplicates@Select[FromDigits/@Subsequences@First@RealDigits[Pi,10,#],PrimeQ]&

Ха-ха-ха, мені вдалося зробити цю роботу. Я поняття не маю, як користуватися Mathematica. XD

Вхід:

[50]

1
ти розмістив кілька секунд попереду мене. і наші відповіді дуже схожі! +1
J42161217

Ви впевнені в опублікованих вами числах (двічі перевіряйте округлення цифр) Я бачу дещо інші результати за допомогою Python та sympy
Jonathan Allan

@JonathanAllan 50 96ОП каже, що 50 цифр містять 93 прайми, тому точність Sympy може бути вимкнена ..?
повністюлюдський

@JonathanAllan Чи використовує Sympy імовірнісний чи детермінований тест первинності? (Те саме питання для PrimeQ Mathematica.)
Арнольд,

@Arnauld хороший момент, не впевнений.
Джонатан Аллан

3

Пітон 3 , 274 237 207 194 189 байт

-37 байт завдяки пшеничному майстру! -14 байт завдяки Mr.Xcoder.

Hardcodes перші 50 цифр pi, але вручну обчислює все інше.

x=int(input());l="31415926535897932384626433832795028841971693993751"[:x]
print(sum(all(i%m for m in range(2,i))for i in{int(i)for w in range(x)for i in[l[j:j-~w]for j in range(x-w)]}-{1}))

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



l=list("31415...)має зекономити ~ 40 символів. І ця зміна дозволяє вам замінити map(str,i)на справедливі i.
AShelly


195 байт , видаливши якийсь дивний код.
Містер Xcoder

194 байт , оголосившиlen(l)
пан Xcoder

1

R, 156 123 байт

cat(cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))[scan()])

Супер цікаве рішення. Робота над належним.

Збережено 33 байти завдяки @Giuseppe.

R (+ числа та gmp), 198 байт

function(n,x=unique(gmp::as.bigz(unlist(sapply(1:n,function(x)substring(gsub("[.]","",numbers::dropletPi(50)),x,x:n))))))min(length(x),sum(sapply(sapply(x[x>0&!is.na(x)],gmp::factorize),length)==1))

Правильне рішення. Приймає nяк вхід.

Використовує numbers::dropletPi(50)для створення перших 50 знаків після коми. gsubвидаляє десяткову точку. substringбере всі можливі підрядки (сюрприз сюрприз) пі до n.

Повертається список сплющується і перетворюється в gmp«S bigzформату. Цей формат необхідний для зберігання цілих чисел довжиною 50. uniqueприймає унікальні значення цього вектора. Цей результат зберігається в x.

Потім перевіряємо наявність первинності. Це складно, адже є купа краєвидів і роздратовань:

  • Для високих nє 0ін пі. Це призводить до підрядів з провідним нулем. as.bigzвиробляє NAs з тим, що доведеться видалити.

  • На аналогічній ноті підрядок "0"буде вибиватися gmp::factorize, тому його також потрібно видалити.

  • Для n=1, x = 3. Що само по собі нормально, але bigzподання 3є ітерабельним, тому sapplyзаплутаєтесь і повідомте про 16 примусів. З цією метою ми беремо мінімум довжини вектора xі кількість простих у ньому.

  • gmp::isprimeздається, не може надійно поводитися з великою кількістю. Тож замість цього ми використовуємо gmp::factorizeта перевіряємо довжину виводу 1.

Тож у всіх видаляємо 0і NAз x. Ми розподіляємо всі фактори xі перевіряємо їх довжину. Ми підраховуємо кількість подій 1та повертаємо їх min(occurences, length(x)).


ось ти де! Тепер давайте подивимось, чи може хтось там перевершити це з більш цікавим рішенням. міг бути ти!

використовуйте cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))замість вашого вектора 123 байти :)
Джузеппе,

@Giuseppe Приємний. Це «стиснення», безумовно, переможе будь-яке законне рішення.
JAD

Я думаю, що це неможливо в R без жорсткого кодування або введення іншого пакету, оскільки R має лише 32-бітні вбудови, які точно не представлятимуть 50-значне ціле число.
Джузеппе

1
Так, я можу подумати про це ще трохи. 82 байди з твердим кодом
Джузеппе

0

Желе , 59 32 байти

-27 байтів завдяки Еріку Переможнику.

“!⁶⁷¬,6½ạEC.wʠ€Ẉ!+Ẉfṭ¡’Ṿḣ³ẆVQÆPS

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

Пояснення

“...’Ṿḣ³ẆVQÆPS

“...’           compressed string that evaluates to first 50 digits of pi (314159...)
     Ṿ          uneval; stringify
      ḣ³        first n characters of the string where n is the first command-line argument
        Ẇ       all sublists
         V      convert all elements to integers
          Q     deduplicate
           ÆP   convert all prime elements to 1 and others to 0
             S  sum

Чому ви спамували це на відповіді?
Zacharý

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