Найти простые числа в пи

30

Простые числа везде ...

они прячутся внутри Пи

3.141592653 58979 3238 462643 3832 795028841 971693993751

Давайте получим эти простые числа!

Соревнование

Получив в качестве входных данных целое число n>0, выясните, сколько простых чисел спрятано в первых nцифрахPi

Примеры

Ибо n=3мы должны искать простые числа в [3,1,4]. Есть 2 простых числа (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
msgstr "вы можете жестко закодировать первые 50 цифр числа Пи, если хотите" . Первая проблема решена! Теперь о проверке первичности в гольфе до 50-значных целых чисел ... O_o (Это хорошая задача, но, вероятно, требуются твердые математические встроенные модули или библиотеки.)
Арно
3
@totallyhuman Эта последовательность еще даже в OEIS! Время вашей претензии на славу?
Санчиз
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

Mathematica, 76 байт

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&
J42161217
источник
О, несправедливо, я не знаком с Mathematica Golf. : P (+1)
полностью человек
@totallyhuman Мы разместили это одновременно. это так странно!
J42161217
Я играл в гольф, используя некоторые синтаксические приемы, но я сохранил функции, которые использовал раньше. Надеюсь, ты не против.
полностью человек
Tr[1^...]Это умный способ найти длину списка, хорошо!
Числовой маньяк
6

Mathematica, 104 97 90 байт

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

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

Входные данные:

[50]
totallyhuman
источник
1
Вы отправили несколько секунд впереди меня. и наши ответы очень похожи! +1
J42161217
Вы уверены в числах, которые вы только что опубликовали (дважды проверьте округление цифр) Я вижу немного другие результаты с использованием Python и sympy
Джонатан Аллан
@JonathanAllan 50 96ОП говорит, что 50 цифр содержат 93 простых числа, поэтому точность Симпи может быть выключена ..?
полностью человек
@JonathanAllan Использует ли Sympy вероятностный или детерминированный тест на простоту? (Тот же вопрос для
Арно
@ Арнаулд: хорошо, не уверен.
Джонатан Аллан
3

Python 3 , 274 237 207 194 189 байт

-37 байт благодаря Wheat Wizard! -14 байтов благодаря Mr.Xcoder.

Твердо кодирует первые 50 цифр числа Пи, но все остальное вычисляет вручную.

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

Попробуйте онлайн!

totallyhuman
источник
l=list("31415...)должен сэкономить ~ 40 символов. И это изменение позволяет вам заменить map(str,i)просто i.
AShelly
195 байт , удалив какой-то странный код.
Мистер Кскодер
194 байта путем объявленияlen(l)
Mr. 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принимает каждую возможную подстроку (неожиданный сюрприз) от pi до n.

Возвращенный список сглаживается и конвертируется в gmpроссийский 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)).

JAD
источник
вот ты где! Теперь давайте посмотрим, сможет ли кто-нибудь обойти это с более интересным решением. может быть ты!
используйте 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 байта :)
Джузеппе
@ Джузеппе Хороший. Это «сжатие» определенно превзойдет любое законное решение.
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
totallyhuman
источник
Почему вы спамили это с ответами?
Захари
Потому что никто больше не отвечал, и я все равно ударил по репутации. : P
полностью человек