Có phải là một thủ tướng rùa?


28

Như chúng ta đã biết, đó là tất cả các con rùa . Nhưng nó có phải là tất cả các cách xuống quá không?

Một số được coi là "số nguyên tố rùa" nếu nó thỏa mãn các điều kiện sau:

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.

Ví dụ, 239là một "số nguyên tố rùa", vì nó có thể được giảm xuống 23sau đó 2hoặc 3cả hai đều là số nguyên tố. Nó cũng có thể được giảm xuống 29sau đó 2. 151không phải là số nguyên tố rùa, vì nó giảm xuống 15(không phải số nguyên tố), 51(không phải số nguyên tố) hoặc 11. 11là số nguyên tố, nhưng chỉ có thể giảm xuống 1, mà không.

Cho một số nguyên dương, xác định xem đó có phải là "số nguyên tố rùa" không. Đầu ra của bạn có thể ở bất kỳ dạng nào miễn là nó cho cùng một đầu ra cho bất kỳ giá trị trung thực hoặc falsey nào.

Các trường hợp thử nghiệm:

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

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!



@MagicOctopusUrn WOW
Keyu Gan


3
Chúng ta có thể lấy đầu vào là một danh sách các chữ số?
hoàn toàn

1
Điều kiện của bạn nói rằng tất cả các số nguyên tố một chữ số không phải là số nguyên tố rùa. Điều kiện 2 không thành công: không thể xóa một chữ số mà vẫn để lại một số nguyên tố, vì loại bỏ chữ số duy nhất không để lại gì.
hvd

Câu trả lời:


6

Thạch , 16 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Thêm Jelly ma thuật! Man, công cụ này có ở khắp mọi nơi ...
caird coinheringaahing

7

Haskell , 104 102 99 98 97 95 91 byte

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]

Hãy thử trực tuyến!

Giải trình

Đầu tiên chúng tôi thiết lập một bài kiểm tra nguyên thủy

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

Điều này sử dụng Định lý Wilson để xác định tính nguyên thủy của đầu vào.

Sau đó chúng tôi tuyên bố một trường hợp cơ sở, sẽ xác nhận rằng chuỗi rỗng là đúng.

f[]=1>0

Bây giờ chúng ta xác định hàm thực

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

Chúng tôi sử dụng một người bảo vệ mẫu để ràng buộc zip[0..]xđể y, bởi vì chúng ta cần phải sử dụng nó hai lần sau đó. Sau đó chúng tôi khẳng định câu trả lời là

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

[[snd b|b<-y,b/=a]|a<-y]là tất cả các số là một chữ số bị xóa khỏi đầu vào của chúng tôi. Vì vậy, chúng tôi đang khẳng định rằng ít nhất một trong những con số này là sự thật f. Để đảm bảo rằng số tổng hợp là giả mạo, chúng tôi thêm vào prime$read x. Nếu số không phải là số nguyên tố, danh sách sẽ trống và anydanh sách trống là sai.


1
-2 byte: any f[[or[f[
Anders Kaseorg

1
-4 byte: [b|(i,b)<-y,i/=a]|(a,_)<-y[snd b|b<-y,b/=a]|a<-y
Anders Kaseorg

6

R, 124 122 120 113 95 93 106 105 byte

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

Mà đánh giá chức năng:

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

Giải pháp đệ quy. Lấy đầu vào là một danh sách các chữ số.

Có 2 câu lệnh logic:

  1. xnguyên tố khi nối?

  2. Có bất kỳ điều nào sau đây TRUE:

    1. Là chiều dài của xnonzero? Đây là điều kiện chấm dứt cuối cùng của chúng tôi.

    2. f TRUEcho bất kỳ tập hợp con của x?

Tuyên bố đầu tiên đảm bảo chúng tôi tiếp tục làm việc với các số nguyên tố. Thứ hai không đệ quy thực tế.

Đã lưu hai byte nhờ @Giuseppe.

Tôi đã phải hoàn nguyên một số golf của mình vì một lỗi, nơi tôi đang kiểm tra với một định nghĩa chức năng trước đây một cách tình cờ.

R, 98 byte, không cạnh tranh

Giống như tôi đã đề cập trong các ý kiến, tôi đã thực hiện một gói . Vì thử thách trước đó, đây không phải là cuộc thi, nhưng tôi muốn thể hiện nó một chút. Nó không nhiều cho đến nay, nhưng chúng ta sẽ đến đó.

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() là hàm đầu tiên trong gói và đảm nhiệm việc ghép các chữ số thành một số.


Một số trong các hoạt động này (Nhìn vào bạn sum(x*10^(((l<-sum(x|1))-1):0))) thật là tệ hại. Tôi thực sự đang xem xét việc tạo ra một gói golf cho R.
JAD

đây sẽ là giải pháp của tôi nhưng tôi không thể quấn đầu sapply... Ngoài ra tôi nghĩ bạn có thể muốn làm f=pryr::f(...)nếu không bạn cần sử dụng ftrong sapply.
Giuseppe

1
@Giuseppe Tên chữ cái duy nhất cho mọi thứ: D Tại sao không gọi gói ghoặc cái gì đó?
JAD

1
@Giuseppe Tạo sự khởi đầu cho một gói: p Hãy xem: github.com/JarkoDubbeldam/RG
JAD

1
@JarkoDubbeldam đẹp. Tôi chắc chắn những thách thức trong tương lai sẽ làm rõ những chức năng bổ sung cần được thêm vào. Thao tác chuỗi là lớn: một cái gì đó el(strsplit(x,''))sẽ tiết kiệm được một tấn byte.
BLT

5

Thạch , 19 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Đệ quy không có trường hợp cơ sở ftw.


3

Thạch , 27 26 byte

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

Một liên kết đơn và lấy số nguyên ( 1đối với rùa 0khác).

Hãy thử trực tuyến!

Làm sao?

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
Thật thú vị khi thấy hai câu trả lời Jelly khác nhau đáng kể. Hãy xem ai có thể cắt chúng xuống nhỏ hơn.
Lord Farquaad

2

Ruby , 72 57 + 8 = 80 65 byte

Sử dụng -rprimecờ. -15 byte từ lịch sử!

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

Hãy thử trực tuyến!


Bạn có thể thay thế &&!!bằng chỉ &, nó sẽ chuyển kết quả thành boolean. Cuộc gọi đệ quy của bạn cũng có thể rút ngắn hơn một chút bằng cách sử dụng các phép ẩn dụ:!n.scan(/./){f[$`+$']&&break}}
lịch sử

@histocrat À đúng rồi, tôi quên rằng tôi không thực sự cần đoản mạch boolean cho phần cuối đó do điều kiện ban đầu. Bạn có biết tại sao các n.scanthủ thuật hoạt động theo cách nó không?
Mực giá trị

1
Vâng, hai biến toàn cục được đặt thành chuỗi ở bên trái và bên phải của trận đấu gần đây nhất, do đó, việc ghép chúng sẽ cho bạn chuỗi trừ đi một ký tự. Vì chúng ta cần trạng thái tại mỗi điểm trong vòng lặp, chúng ta không thể làm bất cứ điều gì như thế .scan.find, nhưng chúng ta có thể tự thoát ra khỏi vòng lặp thành công. Nếu chúng ta phá vỡ, scantrả về nil, nếu không nó trả về chuỗi luôn luôn đúng.
lịch sử

2

Java, 220 byte

Hãy thử trực tuyến!

Chơi gôn

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

Ung dung:

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

Bỏ qua bình luận trước đây của tôi. Nhưng bạn có thể chơi nó với điều này: 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 byte )
Kevin Cruijssen 18/07/17

Bạn có thể lưu một số byte bằng cách trả về 1 và 0 thay vì đúng và sai.
Nevay 18/07/17

@Nevay Điều đó sẽ hoạt động trong C ++, nhưng không phải trong Java. Số nguyên không thể được chuyển đổi hoàn toàn thành booleans.

1
Không chắc chắn nhưng fđến từ đâu?
Roman Gräf

Câu hỏi nói rằng bất kỳ giá trị nào cũng có thể được sử dụng cho đúng / sai; nơi duy nhất mà bạn cần một kết quả boolean của phương thức là trong điều kiện if cuối cùng (nơi bạn có thể thêm >0để chuyển đổi int thành boolean) để lưu 2 * 2 + 1 * 4 = 8 byte trong phiên bản của Kevin Cruijssen.
Nevay

1

05AB1E , 28 27 byte

Giải pháp lặp lại.

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

Hãy thử trực tuyến!

Giải trình

¸                              # 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 byte

-8 Cảm ơn @WheatWizard

-5 Cảm ơn @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))

Hãy thử trực tuyến!

Không thể nghĩ ra bất cứ điều gì để trau dồi nó mà không có trình kiểm tra chính dựng sẵn. Lấy số dưới dạng một chuỗi (tôi giả sử điều này đã cho OP cho phép một danh sách các chữ số, nhưng nếu không thì +14 byte cho một lambda khác) và tính toán đệ quy cho mỗi độ nhiễu của số "rùa".



Tôi nghĩ 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))tiết kiệm một byte. Một người có kỹ năng chơi gôn Python tốt hơn có thể rút ngắn hơn nữa.
Neil

@Neil, nó không lưu một byte, nhưng từ ngữ "cùng một đầu ra cho bất kỳ giá trị trung thực hoặc falsey" nào ngăn tôi lấy nó, vì nhập 1 trả về 0 thay vì Sai như các trường hợp khác (do kiểm tra tính nguyên thủy -8) . Nếu OP cho phép các đầu ra khác nhau (mặc dù đồng nghĩa), thì tôi sẽ thay đổi nó.
Arnold Palmer

1
Xin lỗi, đề nghị trước đây của tôi không hợp lệ. 119 byte
Leaky Nun

1

C #, 355 byte

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

Hãy thử trực tuyến!

Golf mã đầu tiên của tôi, vì vậy tôi hy vọng tôi đã làm được. Tôi không thể nghĩ ra cách nào để làm cho nó nhỏ hơn nữa (ngoài việc sử dụng int thay vì BigInteger, nhưng tôi đã làm nó để nó hoạt động cho tất cả các trường hợp thử nghiệm được cung cấp). Dù sao, đây là cùng một định dạng đúng:

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 byte

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

Hãy thử trực tuyến!

Bắt đầu bằng cách kiểm tra số nguyên thủy, sau đó lặp qua các chữ số dưới dạng một mảng, bật từng cái ra và nối phần còn lại lại với nhau và cho chúng đệ quy qua hàm một lần nữa. Mỗi liên kết đi xuống thực hiện HOẶC logic với các đường dẫn thấp hơn, chỉ quay lại truenếu tồn tại ít nhất một đường dẫn của tất cả các số nguyên tố.


0

Javascript 167 byte

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

Giải trình

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.