자르기 쉬운 소수와 소수


11

마우스 오른쪽 절단 가능 소수는 모든 접두사 (기본 10)는 소수 소수입니다. A는 왼쪽 절단 가능 소수는 정확하게 모든 접미사가 소수 반대, (0으로 시작 소수은 허용되지 않습니다). 이 두 시퀀스는 모두 유한합니다 (오른쪽 잘림은 83 개이고 왼쪽 잘림은 4260 개입니다).

단일 숫자를 입력으로 허용하고 n 번째 오른쪽 잘림 가능한 소수를 생성하는 프로그램을 작성해야합니다 . 프로그램이 판독되는 경우에는, 배치를 거꾸로 , 상기 생성한다 N 왼쪽 truncatable 번째 프라임.

프로그램을 뒤로 정렬하기 위해 프로그램을 단어로 나누고 단어의 순서를 반대로 바꿉니다. 단어는 여러 문자로 구성 될 수 있습니다.

예를 들어, 다음이 프로그램 인 경우 :

hello world
1234567890

다음은 가능한 한 역방향 배열이 가능합니다.

각 캐릭터를 나누기 :

0987654321
dlrow olleh

공백으로 나누기 :

1234567890
world hello

임의로 분할 (명확성을 위해 추가 된 파이프) :

hel|lo w|orld
1|23456|7|8|90

908723456orld
1lo whel

프로그램을 거꾸로 배열 할 때는 다른 모든 문자와 마찬가지로 모든 공백을 고려해야합니다.

순방향 테스트 입력 :

1:  2
2:  3
21: 379
60: 239933
83: 73939133

뒤로 테스트 입력 :

1:    2
2:    3
39:   647
187:  29173
4260: 357686312646216567629137

프로그램은 합리적인 시간 (1 분 미만)에 실행될 수 있어야합니다.

이것은 이므로 가장 적은 바이트를 가진 프로그램이 승리합니다!


아니. 이후의 원자 lo world\n1입니다. 줄 바꿈은 원자를 끝내지 않습니다
Nathan Merrill

아 고마워 알았어 혼란을 피하기 위해 이전의 두 가지 의견 제거
Luis Mendo

답변:


6

젤리 , 26 23 바이트

앞으로

Ѷp9¶7ÆR2ĿV€$ÆPÐf$ÐĿFị@

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

Ñ p 9 7ÆR2ĿV€$ÆPÐf$ÐĿFị@

뒤로

7ÆR2ĿV€$ÆPÐf$ÐĿFị@¶9p¶Ñ

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

7ÆR2ĿV€$ÆPÐf$ÐĿFị@ 9 p Ñ

작동 원리

모든 Jelly 프로그램은 링크 (Jelly의 기능 수행)로 구성되며, 줄 바꿈 또는 순례자 ( ) 로 구분됩니다 . 그들 중 마지막은 메인 링크입니다 . 프로그램이 실행될 때 자동으로 호출됩니다.

전달 프로그램은 다음과 같이 작동합니다.

Ñ                   Helper link. Unused.


p9                  Helper link. Take the Cartesian product with [1, ..., 9].


7ÆR2ĿV€$ÆPÐf$ÐĿFị@  Main link. Argument: n

7ÆR                 Yield all primes up to 7.
             ÐĿ     
            $ÐĿ     Combine the two quicklinks to the left into a monadic chain,
                    and call it repeatedly until the results are no longer unique.
                    Return the array of all intermediate results.
       $              Combine the two links to the left into a monadic chain.
   2Ŀ               Call the helper link on line 2.
     Ṿ€                 Eval each array in the product. This casts to string
                        before evaluating, thus concatenating both numbers.
        ÆPÐf        Filter by primality; keep only primes.
               F    Flatten the resulting array.
                ị@  Retrieve the element at index n.

후진 프로그램은 거의 동일하게 작동합니다. 두 가지 차이점 만 있습니다.

  • 메인 링크는 이제 Ñ아래 링크 (포장), 즉 순방향 프로그램의 메인 링크를 호출합니다.

  • 9pp9역 카티 전 곱을 반환하는 대신 .


4

파이썬 2, 143 139 바이트

I=1
a={2}
def f(s):
 for d in'123456789':u=d[I:]+s+d*I;z=int(u);z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)
f('')
lambda n:sorted(a)[~-n]
I=0

다섯 부분으로 구성됩니다.

  1. I=1
  2. 개행
  3. a={2}…[~-n]
  4. 개행
  5. I=0

따라서 반전은의 가치를 뒤집는 것입니다 I.

설명

이 함수 f는 global 값에 따라 왼쪽 잘림 가능한 소수 (LTP) 또는 오른쪽 잘릴 수있는 소수 (RTP)에 대한 재귀 검색을 수행합니다 I. 이 값은 세트에 추가됩니다 a. 그런 다음- 번째를 lambda n:sorted(a)[~-n]리턴합니다 n.

리프 를 LTP, RTP, 0이 아닌 숫자 + LTP 또는 RTP + 0이 아닌 숫자로 정의합시다 . 이것들은 우선 성 f을 검사하고 싶었던 모든 값입니다 .

나는 모든 잎에서 작동하는 Fermat 의사 프라임 테스트를 설계했습니다.

      

(63973은 Carmichael 번호 입니다.)

이 테스트가 true를 반환 z하면 집합에 추가 a해야하고에 반복해야합니다 str(z). 책임있는 코드는 다음과 같습니다.

z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)

먼저, 우리는 사건을 다루고 싶습니다 z == 2. 우리는 단순히 여기에 그것을 피하고 2처음 정의 할 때 하드 코딩함으로써 그렇게 합니다 a! (편집 : 그리고 우리가 잡으면 해로운 일도 일어나지 않습니다 z == 1.) 그래서 우리는 지금 그것을 가정 할 수 있습니다 z ≥ 3.

필자는“및”을 단락 체인 비교로 변환했습니다. 처음 세 비교는 이전에 성공 a.add(z)했고 f(u)평가되었습니다. 모든 역할은 다음과 같습니다.

  1. z%91>0첫 번째 조건을 인코딩합니다. (63973은 91로 나눌 수 있는데, 잎 자체는 아니기 때문에이를 인식합니다.)
  2. 0<2항상 사실이지만 체인은보다 짧습니다 and.
  3. 2==pow(2,z,z) 두 번째 조건을 인코딩합니다.
  4. pow(2,z,z)>a.add(z)set.add반환 None을 추가하고 정수는 항상보다 크므로 더하기를 트리거하고 항상 참 None입니다.
  5. a.add(z)<f(u)재귀를 트리거합니다. 진실의 가치는 중요하지 않습니다.

감사의 말

  • Dennis는 4 바이트를 절약했습니다 ( u=[d+s,s+d][I]u=d[I:]+s+d*I; z==2z<3mod 91 트릭). 감사!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.