是乌龟素吗?


28

众所周知,乌龟一直沉没下来。但是,它是否也一路下降?

如果数字满足以下条件,则将其视为“乌龟”:

1) It is prime.
2) It is possible to remove a single digit leaving a prime number.
3) Step 2 can be repeated until left with a single digit prime.

例如,239是“龟贷”,因为它可以减少到23然后或者23,这两者都是质数。也可以减少到29那时2151不是乌龟素数,因为它减少为15(不是素数),51(不是素数)或1111是素数,但只能减少到1,不是。

给定一个正整数,确定它是否是“乌龟素数”。您的输出可以是任何形式,只要它为任何真实或错误值提供相同的输出即可。

测试用例:

input -> output
1     -> false
2     -> true
17    -> true
19    -> false
239   -> true
389   -> false

计分

这是,因此每种语言中最短的答案将获胜!



@MagicOctopusUrn WOW
Gan


3
我们可以将输入作为数字列表吗?
totallyhuman

1
你的情况说,所有的个位数的素数是不是乌龟素数。条件2失败:无法删除数字并且仍然保留质数,因为删除唯一数字不会留下任何结果。
hvd

Answers:


6

果冻,16字节

DŒPḊṖLÐṀḌ߀¬Ȧ<ÆP

在线尝试!

怎么运行的

DŒPḊṖLÐṀḌ߀¬Ȧ<ÆP  Main link. Argument: n

D                 Decimal; convert n to base 10.
 ŒP               Powerset; get all sub-arrays of n's decimal digits.
   Ḋ              Dequeue; remove the first sub-array (empty array).
    Ṗ             Pop; remove the last sub-array (all of n's digits).
     LÐṀ          Maximal by length; keep those of the remaining subarrays that
                  have maximal length. This keep exactly those sub-arrays that have
                  one (and only one) digit removed. If n < 10, this yields an empty
                  array. Without Ḋ, it would yield [[]] instead.
        Ḍ         Undecimal; turn the generated digit arrays into integers.
         ߀       Recursively map the main link over the generated integers.
           ¬      Negate; map 1 to 0 and 0 to 1.
            Ȧ     Any and all; yield 0 if the array is empty (n < 10) or any of the
                  recursive calls returned 1 (mapped to 0). If all calls returned
                  0, this will yield 1.
              ÆP  Test n for primality, yielding 1 for primes, 0 otherwise.
             <    Test if the result to the left is less than the result to the
                  right. This is possible only if the left result is 0 (n < 10 or
                  removing a digit results in a turtle prime) and the right result
                  is 1 (n itself is prime).

更神奇的果冻!伙计,这些东西到处都是...
Caird coinheringaahing

7

Haskell中104 102 99 98 97 95 91字节

p x=product[2..x-1]^2`mod`x>0
f[]=1>0
f x|y<-zip[0..]x=or[f[snd b|b<-y,b/=a]|a<-y,p$read x]

在线尝试!

说明

首先,我们进行素数测试

p x=product[2..x-1]^2`mod`x>0

这使用威尔逊定理确定输入的素数。

然后,我们声明一个基本案例,它将断言空字符串是真实的。

f[]=1>0

现在我们定义实际功能

f x|y<-zip[0..]x=or[f[snd b|b<-y,b/=a]|a<-y,p$read x]

我们使用模式防护来绑定zip[0..]xy,因为我们需要稍后再使用两次。然后我们断言答案是

or[f[snd b|b<-y,b/=a]|a<-y,p$read x]

[[snd b|b<-y,b/=a]|a<-y]是从输入中删除的所有数字。因此,我们断言这些数字中至少有一个是对的f。为了确保组合数字是虚假的,我们添加prime$read x。如果数字不是素数,则列表将为空,而any空列表的则为false。


1
-2字节:any f[[or[f[
安德斯Kaseorg

1
-4字节:[b|(i,b)<-y,i/=a]|(a,_)<-y[snd b|b<-y,b/=a]|a<-y
安德斯Kaseorg

6

R,124 122 120 113 95 93 106 105字节

 g=pryr::f(`if`(gmp::isprime(sum(x*10^((l<-sum(x|1)-1):0))),any(!l,sapply(0:l+1,function(z)g(x[-z]))),!1))

对函数求值:

function (x) 
if (gmp::isprime(sum(x * 10^((l <- sum(x | 1) - 1):0)))) any(!l, 
    sapply(0:l + 1, function(z) g(x[-z]))) else !1

递归解决方案。将输入作为数字列表。

有2个逻辑语句:

  1. x连接时是素数吗?

  2. 是否为以下任何一项TRUE

    1. 长度是否为x非零?这是我们最终的终止条件。

    2. f TRUE针对的任何子集x吗?

第一条语句确保我们仅使用质数。第二个执行实际的递归。

感谢@Giuseppe,节省了两个字节。

由于一个错误,我不得不恢复我的一些高尔夫,这是我在偶然的情况下使用先前的功能定义进行测试的地方。

R,98字节,无竞争

就像我在评论中提到的那样,我做了一个包装。由于挑战早于此,所以这是不竞争的,但是我想展示一下。到目前为止还不多,但是我们会到达那里。

g=pryr::f(`if`(gmp::isprime(RG::C(x)),any(!(l<-sum(x|1)-1),sapply(0:l+1,function(z)g(x[-z]))),!1))

C() 是包中的第一个函数,负责将数字连接成数字。


其中一些操作(看着你 sum(x*10^(((l<-sum(x|1))-1):0)))太糟糕了。我真的在考虑为制作高尔夫球包R
JAD

这本来是我的解决方案,但我无法绕开sapply... ...我也认为您可能想要做f=pryr::f(...)否则需要在Windows f中使用sapply
朱塞佩

1
@Giuseppe所有内容的单个字母名称:D为什么不给包裹打电话g呢?
JAD

1
@Giuseppe创建了一个包的开始:p看看: github.com/JarkoDubbeldam/RG
JAD

1
@JarkoDubbeldam美丽。我确信未来的挑战将使需要增加哪些附加功能变得显而易见。字符串操作很大:这样做el(strsplit(x,''))可以节省大量字节。
BLT

5

果冻,19字节

DJḟЀ`ịDḌḟ0߀¬Ȧ¬aÆP

在线尝试!

怎么运行的

DJḟЀ`ịDḌḟ0߀¬Ȧ¬aÆP                input:239

D                    decimal         [2,3,9]
 J                   range@length    [1,2,3]
  ḟЀ`               filter out each [[2,3],[1,3],[1,2]]
      ịD             index&decimal   [[3,9],[2,9],[2,3]]
        Ḍ            undecimal       [39,29,23]
         ḟ0          filter out 0    [39,29,23]
           ߀        this@each       [1,1,1]
             ¬       logical not     [0,0,0]
              Ȧ      any and all     0
               ¬     logical not     1
                aÆP  and&is_prime    1

没有基本情况的递归ftw。


3

果冻27 26字节

DµœcL’$Ḍµ€FÆPÐf
×⁵WÇÐĿFṪ<8

接受和返回整数的单子链接(10否则为龟)。

在线尝试!

怎么样?

DµœcL’$Ḍµ€FÆPÐf  Link 1: primes by digit removal: list of numbers  e.g. [19790]
D                cast to decimal list (vectorises)                      [[1,9,7,9,0]]
 µ      µ€       monadic chain for €ach:
      $            last two links as a monad:
    L                length                                             5
     ’               decrement                                          4
  œc             combinations without replacement                       [[1,9,7,9],[1,9,7,0],[1,9,9,0],[1,7,9,0],[9,7,9,0]]
       Ḍ         cast from decimal list (vectorises)                    [1979,1970,1990,1790,9790]
          F      flatten (from a list of lists form the for €ach to a single list)
             Ðf  filter keep if:
           ÆP      is prime?

×⁵WÇÐĿFṪ<8  Main Link: number, n             e.g. 1979
 ⁵          literal 10
×           multiply                              19790
              (this is so the first number is tested as prime too)
  W         wrap in a list                        [19790]
    ÐĿ      loop, collecting results (including the input×10) while change still occurs:
   Ç          call the last (1) link as a monad   [[19790],[1979],[197,199,179],[19,17,97,19,19,17,19,79],[7,7,7,7],[]]
      F     flatten                               [19790,1979,197,199,179,19,17,97,19,19,17,19,79,7,7,7,7]
       Ṫ    tail                                  7
        <8  less than 8?                          1
              (if a single digit prime was reached this will be 1
               otherwise it will be 0
               e.g. an input of 4 yields 40 at the end which is not <8)

1
看到两个截然不同的Jelly答案很有趣。让我们看看谁可以缩小他们的规模。
法夸德勋爵(Lord Farquaad)'17年

2

红宝石72 57 + 8 = 80 65字节

使用-rprime标志。-15个字节的历史记录!

f=->n{n==''||n.to_i.prime?&!n.scan(/./){f[$`+$']&&break}}

在线尝试!


您可以替换&&!!为just &,它将结果转换为布尔值。:您的递归调用也可以得到一点点缩短使用perlisms!n.scan(/./){f[$`+$']&&break}}
histocrat

@histocrat啊,是的,我忘记了由于初始条件,我实际上不需要为最后一部分进行布尔短路。您知道为什么该n.scan技巧会如此起作用吗?
价值墨水

1
是的,那里的两个全局变量被设置为最近匹配项左右两边的字符串,因此将它们串联可以使字符串减去一个字符。由于我们需要迭代中每个点的状态,因此我们无法做类似的事情.scan.find,但是我们可以在成功后手动退出循环。如果我们中断,则scan返回nil,否则它将返回始终为真的字符串。
histocrat

2

Java,220字节

在线尝试!

打高尔夫球:

boolean t(String n){int l=n.length();if(f(x->{for(int i=2;i<x;)if(x%i++==0)return 1<0;return x>1;},new Integer(n)))if(l<2)return 1>0;else for(int i=0;i<l;)if(t(n.substring(0,i)+n.substring(++i,l)))return 1>0;return 1<0;}

取消高尔夫:

  boolean t(String n) {
    int l = n.length();
    if (f(x -> {
      for (int i = 2; i < x;) {
        if (x % i++ == 0) {
          return 1 < 0;
        }
      }
      return x > 1;
    } , new Integer(n))) {
      if (l < 2) {
        return 1 > 0;
      }
      else {
        for (int i = 0; i < l;) {
          if (t(n.substring(0, i) + n.substring(++i, l))) {
            return 1 > 0;
          }
        }
      }
    }
    return 1 < 0;
  }

忽略我以前的评论。但您可以将其打高尔夫:boolean t(String n){int l=n.length(),x=new Integer(n),i;for(i=2;i<x;x=x%i++<1?0:x);if(x>1)if(l<2)return 1>0;else for(i=0;i<l;)if(t(n.substring(0,i)+n.substring(++i,l)))return 1>0;return 1<0;}191个字节
Kevin Cruijssen

您可以通过返回1和0而不是true和false来保存一些字节。
Nevay

@Nevay可以在C ++中工作,但不能在Java中工作。整数不能隐式转换为布尔值。

1
不确定,但f从哪里来?
罗曼·

问题指出,任何值都可以用于true / false;唯一需要该方法的布尔结果的地方是在最后一个if条件(可以在其中添加>0以将int转换为布尔值),该条件在Kevin Cruijssen的版本中应节省2 * 2 + 1 * 4 = 8个字节。
涅瓦

1

05AB1E28 27字节

迭代解决方案。

¸[D0èg2‹#εæ¨D€gZQÏDpÏ}˜]p1å

在线尝试!

说明

¸                              # wrap input in a list
 [                             # start a loop
  D0èg2‹#                      # if the length of the first element is less than 2, break
         ε                     # apply to each element in the list
          æ                    # compute powerset
           ¨                   # remove last element (the full number)
            D€gZQÏ             # keep only the elements whose length is the max length
                  DpÏ          # keep only primes
                     }         # end apply
                      ˜        # flatten list
                       ]       # end loop
                        p1å    # is any element in the resulting list prime

1

Python 2中132 124 119字节

-8感谢@WheatWizard

-5感谢@LeakyNun

p=lambda i:i>1and all(i%v for v in range(2,i))
f=lambda n:n<'0'or any(f(n[:i]+n[i+1:])for i in range(len(n)))*p(int(n))

在线尝试!

没有一些内置的素数检查器,想不出什么东西可以磨练它。将数字作为一个字符串(我假设给定OP,它允许一个数字列表,但如果不允许,则为另一个lambda +14字节),然后递归计算每个“乌龟”数字的乌龟度。



我认为f=lambda n,i=0:n==''or p(int(n))and i<len(n)and(f(n[:i]+n[i+1:])or f(n,i+1))可以节省一个字节。具有更好的Python打高尔夫球技能的人可能会进一步缩短。
尼尔

@Neil,它确实保存了一个字节,但是“对任何真值或假值的相同输出”一词阻止了我使用它,因为输入1返回0而不是像其他情况一样为False(由于-8素数检查) 。如果OP允许不同(尽管是同义)输出,那么我将对其进行更改。
阿诺德·帕尔默

1
抱歉,我之前的建议无效。119字节
Leaky Nun

1

C#,355个字节

namespace System{using B=Numerics.BigInteger;class A{static void Main(){Console.WriteLine(D(Console.ReadLine()));}static bool P(B x){if(x<2)return 1<0;B r=1;for(int i=1;i<=x-1;i++)r*=i;return(r+1)%x==0;}static bool D(string x){if(x.Length==0)return 1>0;bool b;if(b=P(B.Parse(x))){var n=1<0;for(int i=0;i<x.Length;i++)n|=D(x.Remove(i,1));b&=n;}return b;}}}

在线尝试!

我第一次打高尔夫球,所以我希望我能做到。我想不出一种使它更小的方法(除了使用int而不是BigInteger之外,但我做到了,因此它适用于所有提供的测试用例)。无论如何,这里的格式正确:

namespace System
{
    using B = Numerics.BigInteger;
    class A
    {
        static void Main()
        {
            Console.WriteLine(D(Console.ReadLine()));
        }

        static bool P(B x)
        {
            if (x < 2)
                return 1<0;
            B r = 1;
            for (int i = 1; i <= x - 1; i++)
                r *= i;
            return (r + 1) % x == 0;
        }

        static bool D(string x)
        {
            if (x.Length == 0)
                return 1>0;
            bool b;
            if (b = P(B.Parse(x)))
            {
                var n = 1<0;
                for (int i = 0; i < x.Length; i++)
                    n |= D(x.Remove(i, 1));
                b &= n;
            }
            return b;
        }
    }
}


0

PHP,164字节

function t($n){for($i=1;++$i<$n;)if($n%$i<1)return 0;if($n<10)return $n>1;foreach($r=str_split($n)as$k=>$v){$q=$r;array_splice($q,$k,1);$z|=t(join($q));}return $z;}

在线尝试!

首先测试数字的素数,然后将数字作为数组循环,弹出每个数字,然后将其余的数字重新组合在一起,然后再次通过函数递归地输入它们。向下的每个链接与较低的路径进行逻辑或运算,仅true当存在所有素数的至少一条路径时才返回。


0

Javascript 167字节

n=>{a=[];for(i=1;i++<=n;)a.every(x=>i%x)?a.push(i):0;b=k=>(s=''+k,a.indexOf(k)>-1&&(k<10||[...s].some((x,i)=>(r=[...s],r.splice(i,1),b(~~(r.join('')))))));return b(n)}

说明

n=>{
    a=[];                             // create array to store primes in
    for(i=1;i++<=n;)                  // iterate from 2 to n
        a.every(x=>i%x)?a.push(i):0;  // if i % x is truthy for all x in a,
                                      // then i is prime
    b=k=>(                            // function to test is k is turtle prime
        s=''+k,                       // convert k to a string
        a.indexOf(k)>-1 && (          // if k is prime and
            k<10 ||                   // k is a single digit or
            [...s].some((x,i)=>(      // iterate over the digits of k
                                      // and check to see if, by removing each
                                      // any of the resulting numbers is turtle prime
                                      // ... is spread operator
                                      // [...s] converts string s to an array of characters 
                r=[...s],             // convert s to an array again,
                                      // importantly, this cannot be the same array
                                      // we created above, as we need to
                r.splice(i,1),        // splice out the ith element of the array
                b(~~(r.join('')))     // join the array to a string, convert to int,
                                      // and check if this number is turtle prime
                                      // ~ is bitwise negate, implicitly converts to int first before negating
                                      // ~~ negates the negation, getting us the int
            ))
        )
    );
    return b(n)
}

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.