在Pi中查找素数


30

素数无处不在...

他们躲在Pi里面

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如果您喜欢Entries,则
对答案进行硬编码无效

这是最短的答案以字节为单位!


6
“如果愿意,您可以对Pi的前50位进行硬编码”。第一个问题解决了!现在要进行多达50位整数的高尔夫原始性测试……O_o(这是一个不错的挑战,但是可能需要内置的数学内置函数或库。)
Arnauld

3
@totallyhuman该序列甚至不在OEIS中!是时候声称自己成名了?
桑奇斯

3
IMO允许对前50个值进行硬编码对这一挑战是有害的。这个挑战基本上包括两个部分:1)尝试压缩前50个值,或者2)实际进行挑战。
JAD

2
通常,在这类挑战中,计算变得越来越难/慢/需要大量的内存,对于程序理论上就足够了,而不是设置一个任意的临界值允许进行硬编码。
JAD

3
@BillSteihn在回答几个问题后更新规则与本网站的精神背道而驰。您是否已在沙盒中发布了此问题?你将不得不反馈真的月初硬编码的答案会进来,
奥利维尔·格雷瓜尔

Answers:


20

05AB1E 10  8 字节

-2个字节感谢Adnan(pvectorises)

<žsþŒÙpO

在线尝试!(最多可以工作到n = 98413,但即使在n = 50时也会非常慢,因为需要测试这么大的素数-n = 50的TIO在60秒时超时。)

怎么样?

<ž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个字节
Adnan

是的,p谢谢!
乔纳森·艾伦

2
是! 最后,我真正理解了一个非常简短的高尔夫球答案!:D
FabianRöling17年

11

Mathematica,76个字节

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

哦,不公平,我对Mathematica高尔夫球并不熟悉。:P(+1)
完全人类的,

@totallyhuman我们同时发布了此内容。这太奇怪了!
J42161217 '17

我使用一些语法技巧来寻找答案,但是我保留了以前使用的功能。我希望你不要介意。
完全人类

Tr[1^...]那是找到列表长度的一种聪明方法,太好了!
numbermaniac

6

Mathematica,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 96OP表示50位数字包含93个质数,因此Sympy的准确性可能不正确。
完全人类

@JonathanAllan Sympy使用的是概率检验还是确定性素数检验?(对Mathematica的PrimeQ也有相同的问题。)
Arnauld,

@Arnauld好点,不确定。
乔纳森·艾伦,

3

Python 3中274个 237 207 194 189字节

-37个字节,感谢Wheat Wizard!-14字节感谢Mr.Xcoder。

硬编码pi的前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}))

在线尝试!



l=list("31415...)应该节省约40个字符。这项更改使您可以替换map(str,i)为just i
AShelly


删除一些奇怪的代码即可得到195个字节
Xcoder先生17年


1

R,156123字节

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

超级有趣的解决方案。在一个合适的工作。

@Giuseppe节省了33个字节。

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)生成pi的前50个小数位。gsub删除小数点。substring将pi的所有可能的子字符串(惊奇的惊喜)取为n

返回的列表被展平并转换为gmpbigz格式。需要此格式来存储长度为50的整数。unique采用该向量的唯一值。此结果存储在中x

然后我们检查素数。这很棘手,因为有很多边缘情况和烦恼:

  • 对于high n0在pi中有一个。这导致前导零的子字符串。as.bigz产生NA带有的,必须将其删除。

  • 类似地,子字符串"0"将崩溃gmp::factorize,因此也必须将其删除。

  • 对于n=1x = 3。本身可以,但是的bigz表示形式3是可迭代的,因此sapply会感到困惑并报告16个素数。为此,我们采用向量长度的最小值x和其中的质数。

  • gmp::isprime似乎无法可靠地处理大量数据。因此,我们改为使用gmp::factorize并检查输出的长度是否为1。

因此,总的来说,我们从中删除0和。我们将所有因素分解并检查长度。我们计算的出现次数并返回。NAxx1min(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个硬编码字节
Giuseppe

0

果冻59 32字节

-27个字节,感谢Outgolfer的Erik。

“!⁶⁷¬,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

你为什么用答案来垃圾邮件?
扎卡里

因为没有其他人在回答,所以无论如何我都打了代表上限。:P
totallyhuman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.