素数范围的第一个和最后一个质数


12

挑战

对于给定的正整数范围,找到完全由质数数字组成的第一个和最后一个质数,特殊情况下包括0(对于数字,0-2的范围应输出2-2)。范围包括在内。如果找不到数字,则预期输出为0。如果只有一个这样的数字,则预期输出为该数字的两倍。

例子

  • 对于范围1–100,第一个质数是2,最后一个质数是73(7和3是质数)。
  • 对于70-80的范围,第一个质数是73,最后一个质数也是73(由于给定范围中只有一个正确的数字,因此将其返回两次)。
  • 对于190-200范围,没有正确的答案,因此您返回0。
  • 对于2000-2100范围,第一个质数是2003,最后一个质数是2053(我们省略了数字0,但其他所有数字都是质数)

这是,所以最短的代码以字节为单位!

所有标准漏洞均适用。

输入值

  • 您可以自由接受两个整数作为输入,但是您可能会看到fit,stack,函数参数,CLI参数,stdin。
  • 必须只收到两个整数。

输出量

  • 必须返回结果(一个元组,一个数组,如果您的语言支持它,则应多次返回),将其保留在堆栈中或打印出来(在这种情况下,必须以某种方式将它们分开)。
  • 输出的顺序无关紧要。
  • 您可以使用前导/后括号和换行符。
  • 即使有答案,您也必须返回两个数字,即使它们相同。
  • 如果没有答案,则必须返回0。

只是为了确保,如果我在有答案的情况下返回整数列表,那么在没有答案的情况下我可以返回仅包含0的列表?我不需要0代替[0]吗?
2009年

Answers:



5

Perl 6,105 94 90 86字节

{my @b=grep {is-prime all($_,|.comb>>.Int Xor 2)},$^a..$^b;say @b??"@b[0] @b[*-1]"!!0}

4

JavaScript(ES6),83个字节

采用currying语法的范围[ab](a)(b)。返回2元素数组或0

n=>g=(m,a=0)=>n>m?a:g(m-1,(P=d=>m%--d?P(d):d>1|/[14689]/.test(m))(m)?a:[m,a[1]||m])

测试用例



3

果冻,14字节

æRµDo2ÆPẠµÐf.ị

在线尝试!

怎么运行的

æRµDo2ÆPẠµÐf.ị〜完整程序。

æR〜包含质数范围。
  µ µÐf〜只保留那些满足条件的。
   Do2ÆPẠ〜过滤条件:
   D〜当前数字的十进制数字。
    o2〜逻辑或为2(将0映射到2,并将任何其他数字映射到自身)。
      〜P〜是素数(在元素方面)吗?
        Ạ〜检查所有数字是否都满足条件。
            .ị〜获取元素的模块化索引为0.5。一些细节:
                 〜果冻是1索引的,所以1给我们第一个元素,而0
                   给了我们最后一个要素。
                 〜如果给定数字N的天花板和地板不匹配, 
                   然后Jelly返回索引为floor(N) ceil(N)的项目。
                 〜如果列表为空,则产生0,因此非常方便。

如果允许整个范围(尽管我认为不应该),则为12个字节:

Do2,ÆPȦµÐf.ị

在线尝试!


13个字节,虽然不是超级相似。我应该自己张贴吗?如果愿意,可以接受,但如果您要保留解决方案,请告诉我。
dylnan '17

OP说For a given positive integers range。我要求澄清一下
-dylnan

@dylnan请注意,您的版本仍然无效(0质询是一个例外,因为出于某些原因应将其视为质数)。总之,我贴一个较短的有效的版本
Xcoder先生

哦,我认为0是主要规则已被更改
dylnan

3

Brachylog,16个字节

⟦₂{ṗṗᵐ}ˢ⟨⌋≡⌉⟩|∧0

在线尝试!

完全没有意义的“如果没有质数则返回0”使我们|∧0无缘无故地丢失3个字节()(false.如果我们不加它们就会返回)

说明

⟦₂                Range from the smallest element of the input to the biggest
  {   }ˢ          Select on that range:
   ṗ                Numbers that are primes
    ṗᵐ              And whose digits are primes
        ⟨   ⟩     Fork on this new list:
         ⌋          Minimum
           ⌉        maximum
          ≡         Do nothing and return [Minimum, Maximum]
             |∧0  If all of this fails (i.e. the list after selection is empty), return 0

无效,因为它不将数字0视为质数(如质询中所指定)。因此,它对[2000, 2100]
Xcoder先生17年

3

Pyth,24个字节

使用我的最初方法会更短。

.x,eKfP#I_M-+TjT;0}EQhKZ

在这里尝试!

(我刚刚更新到23,但史蒂文击败了我

?KfP#I_M-+TjT;0}FQhM_BK0

在这里尝试!

通常,hM_BK可以用代替,hKeK

25字节

.x,eKf.AmP_|d2+TjT;}EQhKZ

在这里尝试!

26字节

|>2.<f.AmP_|d2+TjT;*2}EQ1Z

在这里尝试!

|>2.<fP#I_M|R2+TjT;*2}EQ1Z

在这里尝试!


他们如何工作

.x,eKfP#I_M-+TjT;0}EQhKZ ~ Full program. Q, E = first, second inputs

.x                     Z ~ Try-catch block. If the code errors, output 0.
     f            }EQ    ~ Filter the range [E ... Q] for (uses a variable T):
            +TjT;          ~ Append T to the list of its digits.
           -     0         ~ Remove the zeros.
         _M                ~ Multiply each by -1 (for primality testing).
        I                  ~ Check if the result is invariant over...
      P#                   ~ Removing non-prime items.
    K                    ~ Assigned the filtered range to a variable K.
  ,e                     ~ Pair the last element of K with...
                     hK  ~ Its first element.

|>2.<f.AmP_|d2+TjT;*2}EQ1Z ~ Full program.

                   *2}EQ   ~ Inclusive range, repeated twice..
     f                     ~ Filter, using T as the current number.
                jT;        ~ Base-10 digits of T.
              +T           ~ Concatenated with T.
        mP_|d2             ~ Prime check after performing OR 2 (makes 0 be treated as prime)
      .A                   ~ Do all satisfy this condition?
   .<                   1  ~ Rotate by one place cyclically to the left.
 >2                        ~ Last two elements (ignored if there aren't enough)
|                        Z ~ Logical or with 0.


在[70,80]测试用例中,这个没有返回[73]的两个实例。
史蒂文·

Outgolfed 1在25你回来,现在
史蒂芬H.

@StevenH。Outgolfed 1在24你回来,现在
Xcoder先生

比赛越来越激烈了……23岁!
史蒂文H.

2

Mathematica 85字节

我知道已经有一个类似的答案,但是这里的方法是完全不同的。

MinMax@Cases[Range@##,x_/;PrimeQ@x&&DisjointQ@@IntegerDigits/@{x,14689}]/.{_,∞}->0&

这个83个字符的答案将粘贴并在Mathematica中运行。TIO站点不知道如何解释∞。


2

果冻,14字节

Do2ÆPẠ
æRÇÐf.ị

在线尝试!

æRÇÐf.ị            Main link
æR                 Prime range
   Ðf              Filter the range with...
  Ç                The helper link
      ị            At index (decimal, returns [xs[floor], xs[ceil]], otherwise 0)
     .             0.5

Do2ÆPẠ             Helper link
D                  For each decimal
 o2                Replace 0s with 2s, an actual prime prime (could be 3, 5, or 7).
   ÆP              Filter primes (1 if true, 0 if false)
     Ạ             Check if all are true

感谢Outgolfer的Erik对修复错误的帮助。由于Xcoder先生.ị绝招。


ṙ-ḣ2对其Ḣ,Ṫ进行修复(可能需要进行一些修改)吗?
扎卡里

@Zacharý会以错误的顺序给出输出。它似乎没有用:\
Ven

@ Mr.Xcoder果冻室使我想到了相同的解决方案。谢谢!
Ven

.ị可能工作以及(的实物XCoder先生被盗)
扎卡里

你是对的!真好。
Ven



1

Perl 6的 68个66 65 61  58字节

{($_=($^a..$^b).grep({.is-prime&&/^<[02357]>+$/})[0,*-1])[1]??$_!!0}

尝试一下

{($_=($^a..$^b).grep({.is-prime&&!/<[14689]>/})[0,*-1])[1]??$_!!0}

尝试一下

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/})[0,*-1])[1]??$_!!0}

尝试一下

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/}))??.[0,*-1]!!0}

尝试一下

{($_=grep {.is-prime*!/<[14689]>/},$^a..$^b)??.[0,*-1]!!0}

尝试一下

展开:

{  # bare block lambda with two placeholder parameters 「$a」 and 「$b」

  (
    $_ =  # store the list in 「$_」 for later use

      grep {
          .is-prime

        *              # True * True == 1 (all others equal 0)

          !/<[14689]>/ # doesn't contain a non-prime other than 0
      },

      $^a .. $^b       # inclusive Range

  )            # is the list Truish (not empty)
  ?? .[0,*-1]  # if so output the first and last values (from 「$_」)
  !! 0         # otherwise return 0
}


1

Java的8,165个 164字节

(a,b)->{for(;a<=b&!p(a);a++);for(;b>a&!p(b);b--);return a>b?"0":a+" "+b;}boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}

说明:

在这里尝试。

(a,b)->{            // Method with two integer parameters and String return-type
                    //  (Input `a` is the lowest input, input `b` is the highest input)
  for(;a<=b         //  Increase `a` as long as it's smaller than or equal to `b`,
       &!p(a);a++); //   and it's not a prime, and not all of its digits are prime-digits
  for(;b>a          //  Decrease `b` as long as it's larger than `a`,
       &!p(b);b--); //   and it's not a prime, and not all of its digits are prime-digits
  return a>b?       //  If `a` is now larger than `b`:
    "0"             //   Return 0, because nothing is found
   :                //  Else:
    a+" "+b;}       //   Return the resulting `a` and `b`

boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}
                    // Separate method that returns whether the input integer is a prime,
                    //  and all of its digits are also primes (or 0)

1

干净142个 131 125字节

import StdEnv
@a b#l=[n\\n<-[a..b]|and[gcd p n<2&&or[c==k\\k<-:"02357"]\\p<-[1..n-1],c<-:toString n]]
|l>[]=[hd l,last l]=[0]

取消高尔夫:

import StdEnv
fn start finish
    # primes
        = [ n
            \\
            n <- [start..finish]
            | and [ gcd p n == 1 && isMember c ['0','2','3','5','7'] 
                \\
                p <- [1..n-1],
                c <-: toString n
            ]
        ]
    | isEmpty primes
        = [0]
    = [hd primes, last primes]

在线尝试!


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.