거북이 프라임입니까?


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그때 로 줄일 수 있습니다 2. (프라임 아님), (프라임 아님) 또는으로 151줄어들 기 때문에 거북이 프라임이 아닙니다 . 소수이지만로만 줄일 수 있지만 그렇지 않습니다.155111111

양의 정수가 주어지면 "거북이"인지 확인하십시오. 진실하거나 거짓된 가치에 대해 동일한 산출물을 제공하는 한 당신의 산출물은 어떤 형태 일 수 있습니다.

테스트 사례 :

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

더 많은 마법 젤리! 남자,이 물건은 ... 사방 얻을
coinheringaahing 케어 드

7

하스켈 , 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. 복합 숫자가 허위인지 확인하기 위해 추가 prime$read x합니다. 숫자가 소수가 아닌 경우 목록이 비어 있고 any빈 목록의 수가 거짓입니다.


1
−2 바이트 : any f[[or[f[
Anders Kaseorg

1
−4 바이트 : [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

재귀 솔루션. 숫자 목록으로 입력을받습니다.

두 가지 논리적 인 진술이 있습니다 :

  1. x연결하면 프라임 인가 ?

  2. 다음 중 하나입니다 TRUE.

    1. 길이가 x0이 아닌가요? 이것이 마지막 종료 조건입니다.

    2. f TRUE하위 집합 x입니까?

첫 번째 진술은 우리가 소수만을 계속 사용하도록 보장합니다. 두 번째는 실제 재귀를 수행합니다.

@Giuseppe 덕분에 2 바이트를 절약했습니다.

실수로 이전 함수 정의로 테스트하던 버그로 인해 일부 골프를 되돌려 야했습니다.

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.
주세페

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

정수를 가져오고 리턴하는 모나드 링크 ( 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

루비 , 72 57 + 8 = 80 65 바이트

-rprime플래그를 사용합니다 . histocrat에서 -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, 그렇지 않으면 항상 truthy있는 문자열을 반환합니다.
histocrat

2

자바, 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

true와 false 대신 1과 0을 반환하여 일부 바이트를 절약 할 수 있습니다.
Nevay

@Nevay C ++에서는 작동하지만 Java에서는 작동하지 않습니다. 정수는 내재적으로 부울로 변환 될 수 없습니다.

1
확실하지 않지만 어디에서 f왔습니까?
Roman Gräf

이 질문에는 모든 값이 참 / 거짓에 사용될 수 있다고 명시되어 있습니다. 메소드의 부울 결과가 필요한 유일한 곳은 마지막 if 조건 ( >0int를 부울로 변환하기 위해 추가 할 수있는 곳 )에 있으며 Kevin Cruijssen 버전에서 2 * 2 + 1 * 4 = 8 바이트를 절약해야합니다.
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

파이썬 (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 바이트를 허용한다고 가정하면). 각 "거북이"숫자의 거북을 재귀 적으로 계산합니다.



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))바이트를 절약 한다고 생각 합니다. 더 나은 파이썬 골프 기술을 가진 사람은 아마도 그것을 더 단축시킬 수 있습니다.
Neil

@Neil은 바이트를 저장하지만 "진실한 값 또는 거짓된 값에 대해 동일한 출력"이라는 문구는 다른 경우와 마찬가지로 1을 입력하면 False 대신 0을 반환하므로 (-8 우선 검사로 인해) . OP가 다른 (동의하지만) 출력을 허용하면 변경합니다.
Arnold Palmer

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

온라인으로 사용해보십시오!

내 첫 번째 코드 골프, 나는 그것을 잘했으면 좋겠다. BigInteger 대신 int를 사용하는 것 외에는 더 작게 만드는 방법을 생각할 수 없었지만 제공된 모든 테스트 사례에서 작동하도록했습니다. 어쨌든 다음은 올바르게 형식이 동일합니다.

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

온라인으로 사용해보십시오!

우선 순위 숫자를 테스트하여 시작한 다음 숫자를 배열로 반복하여 각 숫자를 꺼내고 나머지를 다시 결합하고 함수를 통해 재귀 적으로 피드합니다. 아래의 각 링크는 더 낮은 경로의 논리 OR을 수행하며 true모든 소수의 경로가 하나 이상있는 경우 에만 반환 됩니다.


0

자바 스크립트 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.