正确和可截短的素数


11

右截断的素数是素数,其中每个前缀都是素数(以10为底)。可向左截短的素数正好相反,其中每个后缀都是素数(不允许以0开头的素数)。这两个序列都是有限的(只有83个右切线,而有4260个左切线)。

您需要编写一个接受单个数字作为输入并生成第n个可右截断的质数的程序。但是,当程序以向后排列的方式读取时,它将产生第n个可左截断的素数。

为了向后排列程序,我们将程序拆分为单词,然后反转单词的顺序。一个单词可以包含任意数量的字符。

例如,如果以下是您的程序:

hello world
1234567890

尽可能允许以下所有安排:

分割每个字符:

0987654321
dlrow olleh

在空白处分割:

1234567890
world hello

任意分割(为清楚起见添加了管道):

hel|lo w|orld
1|23456|7|8|90

908723456orld
1lo whel

向后排列程序时,必须像对待其他字符一样考虑并反转所有空格。

正向测试输入:

1:  2
2:  3
21: 379
60: 239933
83: 73939133

后向测试输入:

1:    2
2:    3
39:   647
187:  29173
4260: 357686312646216567629137

程序应能够在合理的时间内(少于一分钟)运行

这是一个,因此字节最少的程序将获胜!


没有。之后的原子lo world\n1。换行符不会结束原子
Nathan Merrill

嗯谢谢 现在明白了。删除我之前的两条评论以避免混淆
Luis Mendo

Answers:


6

果冻26 23 字节

向前

Ѷp9¶7ÆR2ĿV€$ÆPÐf$ÐĿFị@

在线尝试!

Ñ p 9 7ÆR2ĿV€$ÆPÐf$ÐĿFị@

向后

7ÆR2ĿV€$ÆPÐf$ÐĿFị@¶9p¶Ñ

在线尝试!

7ÆR2ĿV€$ÆPÐf$ÐĿFị@ 9 p Ñ

这个怎么运作

所有的Jelly程序都由链接(Jelly的承担函数)组成,这些链接由换行符或pilcrows()分隔。最后一个是主要环节 ; 程序运行时会自动调用它。

前进程序的工作方式如下。

Ñ                   Helper link. Unused.


p9                  Helper link. Take the Cartesian product with [1, ..., 9].


7ÆR2ĿV€$ÆPÐf$ÐĿFị@  Main link. Argument: n

7ÆR                 Yield all primes up to 7.
             ÐĿ     
            $ÐĿ     Combine the two quicklinks to the left into a monadic chain,
                    and call it repeatedly until the results are no longer unique.
                    Return the array of all intermediate results.
       $              Combine the two links to the left into a monadic chain.
   2Ŀ               Call the helper link on line 2.
     Ṿ€                 Eval each array in the product. This casts to string
                        before evaluating, thus concatenating both numbers.
        ÆPÐf        Filter by primality; keep only primes.
               F    Flatten the resulting array.
                ị@  Retrieve the element at index n.

向后程序几乎完全相同;只有两个区别。

  • 现在Ñ,主链接为,它简单地调用其下方的链接(环绕),即正向程序的主链接。

  • 9p而不是p9返回相反的笛卡尔积。


4

Python 2 143 139字节

I=1
a={2}
def f(s):
 for d in'123456789':u=d[I:]+s+d*I;z=int(u);z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)
f('')
lambda n:sorted(a)[~-n]
I=0

包括五个部分:

  1. I=1
  2. 换行符
  3. a={2}…[~-n]
  4. 换行符
  5. I=0

因此,逆转只是翻转的值I

说明

函数f根据global的值对左可截短的素数(LTP)或右可截短的素数(RTP)执行递归搜索I。这些值将添加到集合中a。然后,lambda n:sorted(a)[~-n]返回第- n个。

让我们将叶子定义为LTP,RTP,一些非零数字+ LTP或RTP +一些非零数字。这些都是f可能要检查素数的值。

我设计了适用于所有叶子的Fermat伪素数测试:

      

(63973是一个Carmichael号码。)

如果此测试返回true,z则应将其添加到集合中,然后a递归于str(z)。负责的代码是:

z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)

首先,我们希望处理此案z == 2。我们可以通过在此处简单地对其进行躲避并在2最初定义时进行硬编码来实现a!(编辑:如果我们也抓住也不会造成任何有害影响z == 1。)因此我们z ≥ 3现在就可以假设。

我已经将一些“和”转换为短路的链式比较:前三个比较必须先获得成功a.add(z)f(u)得到评估。这是他们的所有角色:

  1. z%91>0编码我们的第一个条件。(63973可被91整除,这本身不是叶子,因此我们可以识别出它。)
  2. 0<2始终为true,但是链接比短and
  3. 2==pow(2,z,z) 编码我们的第二个条件。
  4. pow(2,z,z)>a.add(z)触发加法,并且始终为true,因为set.addreturn None和int始终大于None
  5. a.add(z)<f(u)触发递归。它的真实价值并不重要。

致谢

  • 丹尼斯保存了四个字节(u=[d+s,s+d][I]u=d[I:]+s+d*Iz==2z<3mod 91技巧)。谢谢!
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.