Bir kaplumbağa astarı mı?


28

Hepimizin bildiği gibi, tamamen aşağı kaplumbağalar . Ama bu tamamen aşağı asal mı?

Aşağıdaki koşullara uyuyorsa, sayı "kaplumbağa üssü" olarak kabul edilir:

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.

Örneğin 239, bir "kaplumbağa üssü", 23ya o zamana ya 2da 3her ikisine de asal olana indirgenebilir . Ayrıca indirgenebilir 29sonra 2. 151kaplumbağa asal değildir, azalır 15(asal değil), 51(asal değil) veya 11. 11asal, ancak sadece azaltabilir 1, hangisi değil.

Olumlu bir tamsayı verildiğinde, bunun bir "kaplumbağa üssü" olup olmadığını belirleyin. Çıktınız, herhangi bir gerçek veya falsey değeri için aynı çıktıyı verdiği sürece herhangi bir biçimde olabilir.

Test durumları:

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

puanlama

Bu , yani her dilde en kısa cevap kazanır!



@MagicOctopusUrn WOW
Keyu Gan


3
Girişleri basamak listesi olarak alabilir miyiz?
totallyhuman

1
Koşullarınız, tüm tek basamaklı astarların kaplumbağa astarı olmadığını söylüyor . Durum 2 başarısız olur: Bir rakamı çıkarmak mümkün değildir ve tek rakamı kaldırmak hiçbir şey bırakmadığı için hala bir asal sayı bırakmak mümkün değildir.
hvd

Yanıtlar:


6

Jöle , 16 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Daha fazla sihirli Jelly! Dostum, bu şey her yerde olur ...
21'de caird coinheringaahing

7

Haskell , 104 102 99 98 97 95 91 bayt

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]

Çevrimiçi deneyin!

açıklama

İlk önce bir primallik testi kurduk

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

Bu , bir girişin önceliğini belirlemek için Wilson Teoremini kullanır .

Daha sonra boş dizginin truthy olduğunu iddia edecek bir temel durum ilan ettik.

f[]=1>0

Şimdi asıl işlevi tanımlarız

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

Bağlanmak zip[0..]xiçin bir desen koruyucu kullanıyoruz y, çünkü daha sonra iki kez kullanmamız gerekiyor. Daha sonra cevabın

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

[[snd b|b<-y,b/=a]|a<-y]girişten kaldırılan bir rakam olan sayıların tümüdür. Bu nedenle, bu sayılardan en az birinin gerçek olmadığını iddia ediyoruz f. Bileşik sayıların sahte olduğundan emin olmak için ekledik prime$read x. Sayı asal değilse, liste boş hale gelir ve anyboş bir listenin yanlış olur.


1
any f[[or[f[
By2

1
[b|(i,b)<-y,i/=a]|(a,_)<-y[snd b|b<-y,b/=a]|a<-y
By4

6

R, 124 122 120 113 95 93 106 105 bayt

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

İşleve değer veren:

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

Özyinelemeli çözüm. Girdiyi basamak listesi olarak alır.

2 mantıksal ifadeye sahiptir:

  1. xBirleştirildiğinde asal mı ?

  2. Aşağıdakilerden herhangi biri TRUE:

    1. xSıfır olmayan uzunluğu mu? Bu bizim son fesih şartımız.

    2. f TRUEherhangi alt kümesi için x?

İlk ifade, yalnızca astarlarla çalışmaya devam etmemizi sağlar. İkincisi, gerçek özyinelemeyi yapar.

@Giuseppe sayesinde iki bayt kaydedildi.

Bir hata nedeniyle bazı golf sahalarımı geri almak zorunda kaldım, önceki fonksiyon tanımını kazayla test ediyordum.

R, 98 bayt, rakipsiz

Yorumlarda da bahsettiğim gibi bir paket hazırladım . Mücadele bundan önce geldiğinden, bu rekabet edici değil, ama biraz göstermek istiyorum. Çok uzak değil, ama oraya gideceğiz.

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() paketteki ilk işlevdir ve rakamları sayısal olarak birleştirmeyi önemser.


Bu işlemlerin bazıları (sana bakmak sum(x*10^(((l<-sum(x|1))-1):0))), kahrolası kahrolası askerler. Ben gerçekten bir golf paketi oluşturmayı düşünüyorum R.
JAD,

bu benim çözümüm olurdu ama kafamı etrafa saramadım sapply... Ayrıca yapmak isteyip istemediğinizi f=pryr::f(...)veya fiçinde kullanmanız gerekebileceğini düşünüyorum sapply.
Giuseppe

1
@Giuseppe Herşeyin tek harfli isimleri: D Neden paketini aramıyoruz g?
JAD,

1
@Giuseppe Bir paket için başlangıç ​​yaptı: p Bir göz atın: github.com/JarkoDubbeldam/RG
JAD

1
@JarkoDubbeldam güzel. Gelecekteki zorlukların hangi ek işlevlerin eklenmesi gerektiğini açıkça ortaya koyacağından eminim. Dize manipülasyonu büyüktür: bir şey el(strsplit(x,''))bir bayttan tasarruf sağlar.
BLT

5

Jöle , 19 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Temel durum olmadan tekrarlama ftw.


3

Jöle , 27 26 bayt

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

Tamsayıları alıp geri veren monadik bir bağlantı ( aksi takdirde 1kaplumbağa için 0).

Çevrimiçi deneyin!

Nasıl?

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
İki farklı Jelly cevabını görmek ilginç. Bakalım kimin daha küçük kesebileceğini görelim.
Lord Farquaad

2

Ruby , 72 57 + 8 = 80 65 bayt

-rprimeBayrağı kullanır . -Hestokrattan 15 bayt!

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

Çevrimiçi deneyin!


Sen yerine &&!!sadece birlikte &bu sonuç bir mantıksal döküm olacak. Özyinelemeli çağrı ayrıca perlisms kullanarak biraz daha kısa olabilir:!n.scan(/./){f[$`+$']&&break}}
histocrat

@ histokrat Ah evet, başlangıçtaki durumdan dolayı son bölüm için gerçekten kısa devre yapmak zorunda olmadığımı unuttum. n.scanPüf noktasının neden olduğu gibi çalıştığını biliyor musunuz ?
Value Ink,

1
Evet, buradaki iki global değişken en son eşleşmenin solunda ve sağında bir dizgeye ayarlanmıştır, bu yüzden bunları birleştirmek size eksi bir karakter verir. Yinelemenin her noktasında bir duruma ihtiyaç duyduğumuzdan, benzer bir şey yapamayız .scan.find, ancak başarıdaki döngüden el ile ayrılabiliriz. Eğer kırılırsak, scangeri döner nil, aksi takdirde her zaman truthy olan dizeyi döndürür.
histocrat

2

Java, 220 bayt

Çevrimiçi deneyin!

golfed:

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

Önceki yorumumu yoksay. Ancak bunu golf oynayabilirsiniz: 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

Bazı baytları doğru ve yanlış yerine 1 ve 0 döndürerek kaydedebilirsiniz.
Nevay

@Nevay Bu, C ++ ile çalışır, ancak Java ile çalışmaz. Tamsayılar örtük olarak booleanlara dönüştürülemez.

1
Emin değil ama nereden fgeliyor?
Roman Gräf

Soru, herhangi bir değerin doğru / yanlış için kullanılabileceğini; Yöntemin bir boolean sonucuna ihtiyaç duyduğunuz tek yer, son durumda ( >0int'yi bir boole dönüştürmek için ekleyebileceğiniz ) durumdadır;
Nevay

1

05AB1E , 28 27 bayt

Yinelemeli çözüm.

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

Çevrimiçi deneyin!

açıklama

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

-8 @WheatWizard sayesinde

-5 @LeakyNun 'e teşekkürler

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

Çevrimiçi deneyin!

Yerleşik bir denetleyici olmadan onu bilemek için bir şey düşünemiyorum. Sayıyı bir dize olarak alır (OP'nin basamaklar listesine izin verdiğini kabul edersem, ancak başka bir lambda için +14 bayt değilse) ve yinelenerek her "kaplumbağa" sayısının kaplumbağalığını hesaplar.



Sanırım 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))bir bayt kurtarıyor. Daha iyi Python golf becerisine sahip biri muhtemelen bunu daha da kısaltabilir.
Neil,

@Neil, bir baytı kurtarır, ancak "herhangi bir hakikat veya falsey değeri için aynı çıktı" ifadesi, almamı engeller, çünkü diğer girişlerde olduğu gibi False yerine 1 döndürürken 0 girişi (-8 öncelik kontrolü nedeniyle) . Eğer OP (farklı olsalar da) farklı çıktılara izin verirse, o zaman değiştiririm.
Arnold Palmer

1
Maalesef önceki önerim geçersiz. 119 bayt
Sızdıran Rahibe

1

C #, 355 bayt

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

Çevrimiçi deneyin!

Benim ilk kod golf, bu yüzden umarım iyi yaptım. Bunu daha da küçük yapmanın bir yolunu düşünemedim (BigInteger yerine int kullanmaktan başka, ancak sunulan tüm test durumlarında işe yaraması için yaptım). Neyse, işte aynen düzgün bir şekilde formatlandı:

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 bayt

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

Çevrimiçi deneyin!

İlkel sayının sınanmasıyla başlar, ardından bir dizi olarak rakamlar arasında dolaşır, her birini dışarı çıkarır ve geri kalanı bir araya getirir ve tekrar tekrar işlev boyunca tekrarlayarak besler. Aşağıya doğru her bağlantı, daha düşük yollarla mantıklı bir OR yapar; yalnızca truetüm asalların en az bir yolu varsa döner .


0

Javascript 167 bayt

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

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.