마우스 오른쪽 절단 가능 소수는 모든 접두사 (기본 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 분 미만)에 실행될 수 있어야합니다.
이것은 code-golf 이므로 가장 적은 바이트를 가진 프로그램이 승리합니다!
답변
젤리 , 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.
후진 프로그램은 거의 동일하게 작동합니다. 두 가지 차이점 만 있습니다.
-
메인 링크는 이제
Ñ
아래 링크 (포장), 즉 순방향 프로그램의 메인 링크를 호출합니다. -
9p
p9
역 카티 전 곱을 반환하는 대신 .
답변
파이썬 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
다섯 부분으로 구성됩니다.
I=1
- 개행
a={2}…[~-n]
- 개행
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)
평가되었습니다. 모든 역할은 다음과 같습니다.
z%91>0
첫 번째 조건을 인코딩합니다. (63973은 91로 나눌 수 있는데, 잎 자체는 아니기 때문에이를 인식합니다.)0<2
항상 사실이지만 체인은보다 짧습니다and
.2==pow(2,z,z)
두 번째 조건을 인코딩합니다.pow(2,z,z)>a.add(z)
set.add
반환None
을 추가하고 정수는 항상보다 크므로 더하기를 트리거하고 항상 참None
입니다.a.add(z)<f(u)
재귀를 트리거합니다. 진실의 가치는 중요하지 않습니다.
감사의 말
- Dennis는 4 바이트를 절약했습니다 (
u=[d+s,s+d][I]
→u=d[I:]+s+d*I
;z==2
→z<3
및 mod 91 트릭). 감사!