섬세한 프라임
가장 큰 깨지기 쉬운 프라임 찾기에서 영감을 얻었습니다 .
양의 정수에서 최소 1 자리를 제거하면 음이 아닌 다른 정수를 얻을 수 있습니다. 이것은 Remove연결된 질문 의 기능과 다릅니다 . 이런 식으로 생성 된 모든 정수가 소수가 아닌 경우 소수는 섬세하다고 말합니다. 예 : \$60649\$ 다음 정수를 생성합니다.
0, 4, 6, 9, 49, 60, 64, 66, 69, 604, 606, 609, 649, 664, 669, 6049, 6064, 6069, 6649
이 정수 중 어느 것도 소수가 아니므로 \$60649\$섬세한 프라임입니다. 선행 0은 제거되고 요구 사항은 "소수가 아님"이므로 \$0\$및 \$1\$둘 다 자격이 있습니다. 예를 들어 \$11\$ 섬세한 프라임입니다.
표준 시퀀스 규칙과 유사하게 다음 작업 중 하나를 수행해야합니다.
- 양의 정수 \$n\$, \ 여부에 따라 두 개의 별개의 일관된 * 값을 출력 합니다.$n\$ 섬세한 프라임인지 아닌지
- 양의 정수 \$n\$, 출력 \$n\$섬세한 프라임
- 양의 정수 \$n\$, 출력 첫 번째 \$n\$ 섬세한 소수
- 섬세한 소수 목록을 무한 출력
* : 대신 두 세트의 값을 출력하도록 선택할 수 있습니다. 여기서 세트의 값은 언어의 진실 및 거짓 정의에 해당합니다. 예를 들어 Python 답변은 거짓 / 진정한 경우 빈 목록을 출력하고 그렇지 않은 경우 비어 있지 않은 목록을 출력 할 수 있습니다.
수행 할 작업을 선택할 수 있습니다.
표준 방식으로 입력 및 출력 할 수 있으며, 이것이 code-golf 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.
참고로 처음 20 개의 섬세한 프라임은 다음과 같습니다.
2, 3, 5, 7, 11, 19, 41, 61, 89, 409, 449, 499, 881, 991, 6469, 6949, 9001, 9049, 9649, 9949
주의해야 할 몇 가지 사항 :
821 - False (Removing the 8 and the 1 gives 2 which is prime)
결정 문제 방법이 아닌 표준 시퀀스 I / O 중 하나를 구현하는 답변에 대해 +100 바운티를 제공 합니다.
- 순진한 의사 결정 문제 구현 보다 짧습니다 (아직 게시되지 않은 경우 증거로 이러한 버전을 포함하십시오).
- 또는 값을 생성 할 때 값이 섬세한 소수인지 아닌지 확인하는 데 의존하지 않습니다 (예 : 특정 숫자 만 발생할 수 있다는 사실 또는 단순히 "숫자에 대한 루프, 섬세한 소수 찾기"가 아닌 다른 것을 사용할 수 있음) )
이것은 "섬세한 프라임 검사"로 간주되는 것에 대해 다소 주관적이므로 현상금 수여에 관해서는 최선의 판단을 내릴 것입니다.
답변
05AB1E , 4 바이트
암호
05AB1E 인코딩을 사용합니다 . 주어진 숫자가 섬세한 소수 인지 아닌지 확인합니다 .
æpJΘ
온라인으로 시도하십시오! 또는 1에서 9949 사이의 모든 숫자를 확인합니다 .
설명
æ # Get the powerset of the number.
p # Check for each element whether it is a prime.
J # Join these numbers into one big number.
Θ # Check whether this joined number is equal to 1.
APL (Dyalog 확장) , 16 14 바이트
</1⍭⍎⍕(⊢,,¨)\⍞
∊⍎¨¨ → ⍎⍕@ngn 덕분에 -2 바이트 ( ).
stdin에서 단일 숫자를 가져와 1 (true) 또는 0 (false)을 인쇄하는 전체 프로그램입니다.
여기서 트릭은 비어 있지 않은 모든 하위 시퀀스를 생성하는 방법입니다.
(⊢,,¨)/ strstr마지막 문자를 포함하는 모든 하위 시퀀스를 제공합니다 .
(⊢,,¨)/ '1234'
→ '1' (⊢,,¨) '2' (⊢,,¨) '3' (⊢,,¨) '4'
→ '1' (⊢,,¨) '2' (⊢,,¨) '4' '34'
→ '1' (⊢,,¨) '4' '34' '24' '234'
→ '4' '34' '24' '234' '14' '134' '124' '1234'
(⊢,,¨)\ str의(⊢,,¨)/각 접두사에 적용 되며str비어 있지 않은 모든 하위 시퀀스를 문자열 목록으로 제공합니다.
(⊢,,¨)\ '1234'
→ '1' ('2' '12') ('3' '23' '13' '123') ('4' '34' '24' '234' '14' '134' '124' '1234')
전체 코드 설명 :
</1⍭⍎⍕(⊢,,¨)\⍞
⍞ ⍝ Take n from stdin as a string
( )\ ⍝ For each prefix, reduce from right by
,¨ ⍝ prepend the previous char to each string
⊢, ⍝ and append to the previous list of strings
⍎⍕ ⍝ Convert nested strings to a single string,
⍝ and then eval it to get a simple integer vector
1⍭ ⍝ Test each number for primality
</ ⍝ Test if the only truth is the last one
Brachylog , 7 6 바이트
ṗ⊇ᵘṗˢȮ
ṗ⊇ᵘṗˢȮ the implicit input
ṗ is a prime
⊇ᵘ and from every unique subset
ṗˢ select the primes
Ȯ and this should be a list with one element (the prime input itself)
젤리 , 7 바이트
DŒPḌẒḄ’
섬세한 소수 인 경우 0 (거짓)을 반환하고 그렇지 않으면 0이 아닌 정수 (진정한)를 반환하는 양의 정수를 받아들이는 모나 딕 링크.
온라인으로 시도하십시오! 또는 처음 20 개를 참조하십시오.
어떻게?
DŒPḌẒḄ’ - Link: n e.g. 824 409
D - decimal digits [8,2,4] [4,0,9]
ŒP - power-set [[],[8]...,[8,2,4]] [[],[4],...,[4,0,9]]
Ḍ - undecimal [0,8,2,4,82,84,24,824] [0,4,0,9,40,49,9,409]
Ẓ - is prime? [0,0,1,0,0,0,0,0] [0,0,0,0,0,0,0,1]
Ḅ - from binary 32 1
’ - decrement 31 0
Japt , 7 바이트
¥à f_°j
시도 하거나 테스트[0,1000)
¥à f_°j :Implicit input of integer string
¥ :Is equal to
à :Combinations
f :Filter
_ :By passing each through a function
° :Postfix increment, to cast to an integer
j :Is prime?
J , 25 23 바이트
-2 조나 덕분에!
1이 진실이거나 0이 아닌 목록을 반환합니다.
1</@p:(#~2#:@i.@^#)&.":
작동 원리
1</@p:(#~2#:@i.@^#)&.":
&.": convert the number to a string
( 2 ^#) 2 ^ length
#:@i.@ enumerated and to base 2
#~ select from the string based on the bit mask
&.": convert from strings to numbers
1 p: primes -> 1, non-primes -> 0
so in the delicate prime case, we have
(2^L) - 1 zeros and one 1 for the input itself
</@ reduce from left to right with less-than
(so last position is 1, everything else 0)
Pyth , 14 8 바이트
qjfP_sTy
설명
qjfP_sTy
f # filter
y # all subsets of input
P_sT # with a primality test
j # join result of filter on newlines
q # check if it equals input
Retina 0.8.2 , 53 바이트
^
;
+%`;(.)
$1;$'¶$`;
.+
$*
%A`^.?$|^(..+)\1+$
^1+¶+$
온라인으로 시도하십시오! 링크에는 테스트 케이스가 포함됩니다. 설명:
^
;
+%`;(.)
$1;$'¶$`;
입력의 모든 하위 시퀀스를 생성합니다.
.+
$*
그런 다음 단항으로 변환하십시오.
%A`^.?$|^(..+)\1+$
프라임이 아닌 것은 삭제하되 개행은 삭제하지 마십시오. (여러 줄 바꾸기도 작동하지만 설명 형식을 지정하기가 더 어렵습니다.)
^1+¶+$
원래 입력이 소수 였지만 적절한 하위 시퀀스가 없는지 확인하십시오.
Scala , 173170 바이트
n=>(s"$n".indices.toSet.subsets.filter{x=>1<x.size&x.size<s"$n".size}.map(_.toSeq.sorted.map(""+n).mkString.toInt).toSet+n).filter{x=>x>1&2.to(x/2).forall(x%_>0)}==Set(n)
R , 163154 바이트
function(x,n=nchar(x),s=sum)(a=apply(!expand.grid(rep(list(0:1),n)),1,function(v)(y=s((x%/%10^(n:1-1)%%10)[v]*10^(s(v):1-1)))&s(!y%%1:y)==2))[1]&!s(a[-1])
x에서 모든 숫자 조합을 제거하여 형성된 숫자 중 소수를 확인합니다. 첫 번째 조합의 제거입니다 없는 자리 :이 TRUE이어야하며, 다른 모든 주요 테스트는 FALSE해야합니다.
댓글 :
is_delicate_prime=
function(x, # x = number to test
n=nchar(x), # n = number of digits of x
s=sum) # s = alias to sum() function
(a= # a = matrix of all prime-tests:
apply( # apply the function v to each of...
!expand.grid(rep(list(0:1),n)), # all combinations of n of TRUE/FALSE...
1, # row-by-row...
function(v) # defining the output of v as:
(y=s((x%/%10^(n:1-1)%%10) # the digits of x...
[v] # (considering only the elements chosen by v)...
*10^(s(v):1-1))) # multiplied by 10^((v-1)..0)...
&s(!y%%1:y)==2)) # tested for primality AND non-zero
[1] # Finally, output TRUE if a[1] is TRUE...
&!s(a[-1]) # and the sum of all other elements of a are FALSE
Wolfram 언어 (Mathematica) , 54 바이트
Select[FromDigits/@Subsets@@RealDigits@#,PrimeQ]=={#}&
JavaScript (ES6), 98 95 바이트
n문자열로 예상 됩니다. 부울 값을 반환합니다.
n=>[...n].reduce((a,x)=>[...a,...a.map(y=>(g=k=>y%--k?g(k):(p+=q=y>1&k<2,y))(y+=x))],[p=0])|q/p
어떻게?
우리 n는 순서가 보존되고 n그 자체가 마지막에 계산 되는 방식으로 자릿수의 거듭 제곱을 계산합니다 . 결과 정수 중 유일한 소수가 마지막 정수이면 결과는 참입니다.
Python 3.8 (사전 릴리스) , 146144 바이트
중복 괄호를 제거하여 -2 바이트
나는 또한 Noodle9 가 그들의 답변을 게시 하기 직전에 매우 유사한 답변을 작업하고 있었고 , 아이디어를 결합하여 이것을 얻었습니다 ( upvote it! ). 처음에는 망가 졌기 때문에 지금은 꽤 달라서 제 것을 게시 할 것이라고 생각했습니다.
lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})
설명:
lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})
lambda s : function
,R=range alias `range` built-in to `R`
{ s[j]for j in R(l)if i>>j&1 for i in R(1,2**l)} compute the power-set (excluding the empty set)
int(''.join( )) convert each list of digits to an integer
all( for g in ) check the integers for primality
all(g%k for k in R(2,g)) check for factors in the number
(g>1)& makes sure 0 and 1 aren't treated as prime
(g!=int(s))^ ensure the number itself is prime
(l:=len(s))* store the length in `l`
SageMath , 139 바이트
def f(n):s=str(n);l=len(s);return p(n)*all(~-p(g)for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l-1)})
R=range;p=is_prime
내 Python 답변의 포트.
파이썬 3 , 181 바이트
사용 itertools 과의 golfed 조리법을 powerset.
lambda s,R=range:all(p(int(''.join(t)),R)for t in sum(([*combinations(s,k)]for k in R(1,len(s))),[]))>p(int(s),R)
from itertools import*
p=lambda n,R:any(n%i<1for i in R(2,n))or 2>n
입력을 문자열로 예상합니다.
함수 p는 True입력 값이 소수가 아니고 소수이면 반환 합니다 False. 주 함수는의 모든 "하위 값"을 취하는 (forall t, p(t)) > p(s)위치를 반환합니다 . 부울이이 부등식을 충족시키는 유일한 방법은이며 , 이는 모두 프라임 이 아니며 프라임이 아님 을 의미합니다 .tsTrue > Falsets
면책 조항 : 내가 이것을 게시했을 때 이미 두 개의 파이썬 답변이있었습니다.