มันเป็นเต่าที่ยอดเยี่ยมหรือไม่?


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อย่างใดอย่างหนึ่ง2หรือ3ทั้งสองอย่างได้ นอกจากนี้ยังสามารถลดลงไปแล้ว29 ไม่ได้เป็นเต่าที่สำคัญที่จะช่วยลดการ(ไม่สำคัญ) (ไม่สำคัญ) หรือ เป็นสิ่งสำคัญ แต่สามารถลดได้เพียงอย่างเดียวเท่านั้นซึ่งไม่ใช่2151155111111

รับค่าจำนวนเต็มบวกกำหนดว่าเป็น "เต่าหลัก" หรือไม่ เอาต์พุตของคุณสามารถอยู่ในรูปแบบใดก็ได้ตราบใดที่ให้เอาต์พุตเดียวกันสำหรับค่าความจริงหรือเท็จ

กรณีทดสอบ:

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

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะชนะ!



@MagicOctopusUrn WOW
Keyu Gan


3
เราสามารถรับข้อมูลเป็นรายการตัวเลขได้หรือไม่?
มนุษย์

1
เงื่อนไขของคุณบอกว่าช่วงเวลาที่มีเลขดิจิตเดียวไม่ได้เป็นของเทอร์เทิล เงื่อนไข 2 ล้มเหลว: เป็นไปไม่ได้ที่จะลบตัวเลขและยังคงทิ้งหมายเลขหลักไว้เนื่องจากการลบตัวเลขหลักเพียงอย่างเดียวจะทำให้ไม่มีอะไรเกิดขึ้น
hvd

คำตอบ:


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..]xจะyเพราะเราต้องใช้มันสองครั้งในภายหลัง จากนั้นเรายืนยันคำตอบคือ

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

[[snd b|b<-y,b/=a]|a<-y]คือตัวเลขทั้งหมดที่ถูกลบออกจากตัวเลขของเรา ดังนั้นเราจึงยืนยันว่าอย่างน้อยหนึ่งในตัวเลขเหล่านี้เป็นความfจริง เพื่อให้มั่นใจว่าตัวเลขคอมโพสิต falsy prime$read xเราเพิ่มใน หากหมายเลขไม่ได้อยู่ในรายการรายการจะว่างเปล่าและanyรายการว่างเปล่าเป็นเท็จ


1
−2 bytes: any f[[or[f[
Anders Kaseorg

1
−4 bytes: [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 ไบต์

 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(...)หรืออื่น ๆ คุณจำเป็นต้องใช้ในf sapply
Giuseppe

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

ลิงก์ monadic ที่ใช้และส่งคืนจำนวนเต็ม ( 1สำหรับเต่า0มิฉะนั้น)

ลองออนไลน์!

อย่างไร?

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
มันน่าสนใจที่ได้เห็นคำตอบของเยลลี่ที่แตกต่างกันสองคำ ให้ดูว่าใครสามารถลดขนาดเล็กลงได้บ้าง
ลอร์ด Farquaad

2

Ruby , 72 57 + 8 = 80 65 ไบต์

ใช้-rprimeธง -15 ไบต์จาก histocrat!

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

ลองออนไลน์!


คุณสามารถแทนที่&&!!ด้วย just &มันจะส่งผลให้เป็นบูลีน การเรียกซ้ำของคุณยังสามารถสั้นลงได้เล็กน้อยโดยใช้ perlisms:!n.scan(/./){f[$`+$']&&break}}
ประวัติศาสตร์ 18

@histocrat อ่าใช่ฉันลืมไปแล้วว่าฉันไม่จำเป็นต้องใช้บูลีนลัดวงจรสำหรับส่วนสุดท้ายเนื่องจากเงื่อนไขเริ่มต้น คุณรู้ไหมว่าทำไมn.scanกลอุบายถึงได้ผล?
Value Ink

1
ใช่ตัวแปรทั่วโลกสองตัวที่มีการตั้งค่าเป็นสตริงไปทางซ้ายและขวาของการจับคู่ล่าสุดดังนั้นการต่อข้อมูลเข้าด้วยกันจะทำให้คุณมีสตริงที่ลบด้วยอักขระหนึ่งตัว เนื่องจากเราต้องการสถานะในแต่ละจุดในการทำซ้ำเราจึงไม่สามารถทำอะไรได้เหมือน.scan.findกัน แต่เราสามารถแยกวงออกจากความสำเร็จได้ด้วยตนเอง หากเราแตกหักscanส่งคืนnilมิฉะนั้นจะส่งคืนสตริงซึ่งเป็นความจริงเสมอ
ชำนาญวิชาประวัติศาสตร์

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

Ungolfed:

  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 bytes )
Kevin Cruijssen

คุณสามารถบันทึกบางไบต์โดยส่งกลับ 1 และ 0 แทนจริงและเท็จ
Nevay

@Nevay นั่นจะใช้ได้ใน C ++ แต่ไม่ใช่ใน Java จำนวนเต็มไม่สามารถแปลงเป็น booleans โดยปริยาย

1
ไม่แน่ใจ แต่fมาจากไหน
Roman Gräf

คำถามระบุว่าอาจใช้ค่าใด ๆ สำหรับจริง / เท็จ สถานที่เดียวที่คุณต้องการผลบูลีนของวิธีการอยู่ในเงื่อนไขสุดท้าย (ซึ่งคุณสามารถเพิ่ม>0การแปลง int เป็นบูลีน) ซึ่งควรบันทึก 2 * 2 + 1 * 4 = 8 ไบต์ในเวอร์ชันของ Kevin Cruijssen
Nevay

1

05AB1E , 28 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 อนุญาตให้รายการตัวเลข แต่ถ้าไม่ใช่ +14 ไบต์สำหรับแลมบ์ดาอื่น), และคำนวณ recursively ของแต่ละหมายเลข "turtled" ซ้ำอีก



ฉันคิดว่า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

@Neil มันจะบันทึกไบต์ แต่ถ้อยคำ "เอาต์พุตเดียวกันสำหรับค่าความจริงหรือค่าเท็จ" ทำให้ฉันไม่สามารถรับมันได้เนื่องจากการป้อน 1 คืนค่า 0 แทนที่จะเป็นเท็จเหมือนกรณีอื่น ๆ (เนื่องจากการตรวจสอบแบบดั้งเดิม -8) . หาก OP อนุญาตเอาท์พุทที่แตกต่างกัน (แม้ว่าจะมีความหมายเหมือนกัน) ดังนั้นฉันจะเปลี่ยนมันขึ้นมา
Arnold Palmer

1
ขออภัยคำแนะนำก่อนหน้าของฉันไม่ถูกต้อง 119 bytes
Leun 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)
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.