이중 프라임 단어
\ 길이의 단어 / 문자열을 고려하십시오.$n\$, 문자 AZ, az 만 포함합니다. 단어 / 문자열은 n이 소수이고 문자의 합 s도 소수 인 경우에만 이중 소수 단어이며 알파벳 ( a=1, B=2, c=3등) 의 숫자 위치를 사용합니다 .
수치 사이의 차이가 없기 때문에 입력은 대문자 또는 소문자의 알파벳 문자의 조합 a또는이 A.
출력은 언어와 관련된 적절한 논리 형식입니다. 즉, True 또는 False, T 또는 F, 1 또는 0 등. 출력이 표시 될 형식을 지정하는 것은 높이 평가되지만 필수는 아닙니다. (출력에는 n, s가 포함될 필요는 없지만 아래에 데모 및 예제로 포함)
승리 조건은 문자열이 이중 소수인지 감지 할 수있는 바이트 단위의 가장 짧은 코드로, n과 s가 소수가되도록 조건을 맞 춥니 다. (이제 n, s의 가능한 4 가지 상황 모두에서 사례를 포함했습니다.)
예
Input -> Output (n, s)
Prime -> True (5, 61)
han -> True (3, 23)
ASK -> True (3, 31)
pOpCoRn -> True (7, 97)
DiningTable -> True (11, 97)
METER -> True (5, 61)
Hello -> False (5, 52)
SMILE -> False (5, 58)
frown -> False (5, 76)
HelpMe -> False (6, 59)
John -> False (4, 47)
TwEnTy -> False (6, 107)
HelloWorld -> False (10, 124)
Donald -> False (6, 50)
telePHONES -> False (10, 119)
A -> False (1, 1)
C -> False (1, 3) {1 is not prime}
d -> False (1, 4)
답변
젤리 , 12 바이트
ŒuO_64µL,SẒP
작동 원리
ŒuO_64µL,SẒP - Main link, takes string s as argument e.g. s = "Prime"
Œu - Convert to upper case "PRIME"
O - Convert to ordinals [80, 82, 73, 77, 69]
_64 - Subtract 65 (call this L) [16, 18, 9, 13, 5]
µ - Start a new link with L as the left argument
L - Take the length 5
S - Take the sum 61
, - Pair the two values [5, 61]
Ẓ - Take primality of each [1, 1]
P - Take product 1
R , 68 71 바이트
Dominic van Essen이 지적한 버그 수정을위한 +3 바이트
`?`=sum;s=?b<-utf8ToInt(scan(,""))%%32;l=?b^0;l-1&5>?c(!s%%1:s,!l%%1:l)
대문자와 소문자를 모두 정수 1 ... 26으로 변환하기 위해 ASCII 코드 포인트 모듈로 32를 사용할 수 있습니다. sum(!x%%1:x)는의 제수를 계산하는 골프 방법이며 x,이면 2와 같습니다 x.
미 골프 :
`?` = sum # shorthand for sum
b = utf8ToInt(scan(, "")) %% 32 # take input and convert to ASCII, then take mod 32
s = sum(b)
l = sum(b^0) # l = length(b)
5 > sum(c(!s%%1:s,!l%%1:l)) # sum the number of divisors of s and l, and check whether you get <5.
& l!=1 # and that l is not 1
Ruby , 27 59 바이트
->a{[a.size,a.upcase.bytes.map{|i|i-64}.sum].all? &:prime?}
DrQuarius 덕분에 솔루션 수정 후 +33 바이트.
perl -Mfeature = say -MList :: Util = sum -pl, 95 바이트
s/[^a-z]//gi;$m=sum map-64+ord,split//,uc;$_=(1 x y===c)!~/^(11+)\1+$|^1$/&&(1x$m)!~/^(11+)\1$/
어떻게 작동합니까?
s/[^a-z]//gi; # Clean the input, remove anything which isn't an ASCII letter.
uc; # Upper case the string
split//, # Split it into individual characters
-64+ord # Calculate its value:
# subtract 64 from its ASCII value
map # Do this for each character, return a list
$m=sum # Sum the values, and store it in $m
y===c # Returns the length of the input string
(1 x y===c) # Length of the input string in unary
/^(11+)\1+$|^1$/ # Match a string consisting of a composite
# number of 1's, or a single 1
!~ # Negates the match, so
(1 x y===c)1~/^(11+)\1+$|^1$/ # this is true of the input string (after
# cleaning) has prime length
(1x$m)!~/^(11+)\1+$/ # Similar for the sum of the values --
# note that the value is at least 2, so
# no check for 1.
이를 결합하면 프로그램은 조건과 일치하는 행에 1을 인쇄하고 일치하지 않는 행에 대해서는 빈 행을 인쇄합니다.
05AB1E , 10 바이트
gAIlk>O‚pP
문자 목록으로 입력합니다.
온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .
설명:
g # Get the length of the (implicit) input-list
A # Push the lowercase alphabet
I # Push the input-list of characters
l # Convert the input to lowercase
k # Get the (0-based) index of each character in the alphabet-string
> # Increase each by 1 to make them 1-based indices
O # Take the sum of that
‚ # Pair the length together with this sum
p # Check for both whether they're a prime (1 if it's a prime; 0 if not)
P # And check if both are truthy by taking the product of the pair
# (after which the result is output implicitly)
R , 70 바이트
function(s,S=sum,t=S(utf8ToInt(s)%%32))S(!nchar(s)%%1:t)^S(!t%%1:t)==4
나는 이것을 시도하기 전에 Robin Ryder의 대답 을 들여다 보지 않도록 강요 했으며 (만족스럽게) 우리는 다소 다른 골프 트릭을 사용했다는 것이 밝혀졌습니다.
t모든 문자 인덱스의 합계입니다. 이것은보다 크거나 같음이 확실합니다 nchar(s)(문자열 s이 "A"또는 "a"인 경우에만 동일 함 ). 그래서 우리는 modulo 1:t대신에 문자열 길이의 소수성을 테스트하기 위해 modulo 를 사용할 수 있으며 1:nchar(s),를 저장하기 위해 변수 선언에 낭비 문자가 필요하지 않습니다 nchar(s).
두 소수 테스트 모두 문자 인덱스의 합계와 문자열 길이가 모두 소수 인 경우 2 sum(!t%%1:t)와 sum(!nchar(s)%%1:t)같아야합니다.
둘 다 2인지 확인할 수 있지만 ==2두 번 (더하기 a &또는 이와 동등한) 이 필요하므로 낭비적인 것 같습니다. 합계가 4인지 확인해도됩니까? 우리가 걱정해야 할 가장 중요한 경우는 그들 중 하나가 1이고 다른 하나가 3과 같으면 문자열 "D"에 대해 발생합니다 (제수 1,2 및 4가있는 길이 = 1 및 문자 인덱스 = 4). 그래서 그것은 Ok가 아닙니다. 곱할 수 있습니까? 또한 1과 4가 다시 4를 줄 것이기 때문입니다 (문자열 "F"에 대해 생각해보십시오).
그러나-문자열 길이가 문자 인덱스의 합보다 작거나 같아야한다는 것을 알고 있기 때문에 지수를 사용할 수 있습니다. 4를 얻는 유일한 방법은 4 ^ 1 또는 2 ^ 2이므로 문자열 길이가 4 인 경우 문자 인덱스 합계는 1이 될 수 없으며 2 ^ 2가 유일한 가능성입니다.
따라서 이중 소수에 대한 최종 결합 검사는이며 sum(!nchar(s)%%1:t)^sum(!t%%1:t)==4, 개별 테스트에 비해 3 개의 문자를 절약합니다.
록 스타 , 327 321 319 바이트
프라임 테스트를위한 내장 기능이 없습니다!
대소 문자 변환이 없습니다!
캐릭터의 코드 포인트를 얻을 수있는 방법이 없습니다!
왜 나 자신에게 이런 일을 하는가?! 빌어 먹을 일을하는 데 너무 오래 걸렸고, 나는 그것이 최적의 골프와는 거리가 멀다고 확신하지만 지금은 할 것입니다.
F takes N
let D be N
let P be N aint 1
while P and D-2
let D be-1
let M be N/D
turn up M
let P be N/D aint M
return P
G takes I
Y's0
N's27
while N
cast N+I into C
if C is S at X
return N
let N be-1
return G taking 64
listen to S
X's0
T's0
while S at X
let T be+G taking 96
let X be+1
say F taking T and F taking X
여기에서 시도해보세요 (코드를 붙여 넣어야합니다).
Retina 0.8.2 , 77 바이트
\W|\d|_
$
¶$`
\G.
1
T`L`l
[t-z]
55$&
[j-z]
55$&
T`_l`ddd
.
$*
A`^(..+)\1+$
¶
온라인으로 시도하십시오! 링크에는 테스트 케이스가 포함됩니다. 설명:
\W|\d|_
문자가 아닌 것은 삭제하십시오.
$
¶$`
편지를 복제하십시오.
\G.
1
첫 번째 줄의 문자를 1s로 바꾸어 길이를 단항으로 사용합니다.
T`L`l
나머지 문자를 소문자로 변환하십시오.
[t-z]
55$&
[j-z]
55$&
T`_l`ddd
숫자 위치의 합이 될 숫자로 변환하십시오.
.
$*
숫자를 단항으로 변환하여 합계를 얻습니다.
A`^(..+)\1+$
복합 값을 삭제하십시오.
¶
두 값이 모두 여전히 존재하는지 확인하십시오.
Python 3 , 86 78 87 바이트
ovs 덕분에 8 바이트 절약 !!! Robin Ryder가
친절하게 지적한 버그를 수정하기 위해 9 바이트를 추가했습니다 .
lambda s:~-len(s)*all(n%i for n in(len(s),sum(ord(c)&31for c in s))for i in range(2,n))
진실 또는 거짓 값을 반환합니다.
Brachylog , 11 바이트
ḷạ-₉₆ᵐ+ṗ&lṗ
작동 원리
ḷạ-₉₆ᵐ+ṗ&lṗ (is the implicit input)
ḷ to lowercase
ạ to list of char codes
-₉₆ᵐ minus 96 (so 'a' -> 1)
+ summed
ṗ prime?
&l and is the input's length
ṗ prime?
J , 27 22 18 바이트
1*/@p:#,1#.32|3&u:
xash 덕분에 -5 바이트
-Dominic van Essen 덕분에 4 바이트
32|3&u:먼저 ASCII 번호로 변환하고 32로 모딩하여 각 문자를 색인으로 변환합니다.1#.합집합.#,목록 길이를 앞에 추가합니다.1...p:이 두 숫자가 각각 소수입니까?*/@그것들을 함께 곱하십시오-모두 소수입니까?
C- 119108 99 98 바이트 (gcc)
@ceilingcat이 다른 바이트를 저장했습니다!
b,t,e;p(c){for(;--e&&c%e;);c=e==1;}a(char*a){t=0;for(e=b=strlen(a);b;)t+=a[--b]%32;t=p(e)*p(e=t);}
이전에
@DominicvanEssen과 @ceilingcat에게 20 바이트를 절약 해주셔서 감사합니다! -특히 n = 1 (프라임이 아님)의 오류를 수정 한 Dominic에게
b,t,e;p(c){for(b=c;--b&&c%b;);c=b==1;}a(char*a){t=0;for(e=b=strlen(a);b;)t+=a[--b]%32;t=p(e)*p(t);}
119 바이트 미만의 첫 번째 시도
a(char*a){int t=0,d=strlen(a),e=d;while(d)t+=a[--d]%32;return p(e)*p(t);}
p(int c){int b=c;while(--b&&c%b);return b<2;}
실제로 while(c%--b)두 번째 루틴에서 사용하여 3 바이트를 절약 할 수 있지만 p (1)의 경우에는 실패합니다 (예 : 'a'). 또는 다른 단일 문자.
Scala , 75 74 69 바이트
| =>p(|size)&p(|map(_&95-64)sum)
def p(n:Int)=(2 to n/2)forall(n%_>0)
요소 , 78 바이트
: d ( s -- ? ) dup [ length ] dip >lower [ 96 - ] map sum [ prime? ] bi@ and ;
JavaScript (Node.js) , 88 바이트
0 또는 1을 반환합니다 .
s=>(g=k=>n%--k?g(k):k==1)(Buffer(s).map(c=>x+=n<(n+=c>64&(c&=31)<27&&c),x=n=0)|n)&g(n=x)
댓글 작성
도우미 기능
g = k => // g is a helper function testing if n is prime
n % --k ? // decrement k; if it does not divide n:
g(k) // do recursive calls until it does
: // else:
k == 1 // test whether k = 1
주요 기능
s => // s = input string
g( // test if the 'sum of the letters' is prime
Buffer(s).map(c => // for each ASCII code c in s:
x += // increment x if ...
n < ( // ... n is less than ...
n += // ... the new value of n:
c > 64 & // if c is greater than 64
(c &= 31) < 27 // and c mod 32 is less than 27:
&& c // add c mod 32 to n
), //
x = n = 0 // start with x = n = 0
) | n // end of map(); yield n
) // end of the first call to g
& g(n = x) // 2nd call to g with the 'length' x
Perl 5 -pl , 52 바이트
@Abigail의 답변 에서 프라임 식별 정규식을 사용합니다.
$_.=$".1x s/./1x(31&ord$&)/ge;$_=!/\b((11+)\2+|1)\b/
Ruby , 50 55 50 바이트
->s{[s.size,s.upcase.sum-64*s.size].all? &:prime?}
배열이 진실한 것으로 간주 될 수 있는지에 대한 오해로 인해 +5 바이트.
Razetime 덕분에 -5 바이트, "& : prime?" ".all?"앞에 ".map (& : prime?)"을하는 대신 끝에.
Razetime의 솔루션은 실제로 알파벳 색인이 아니라 단순히 ascii 서수를 합산했기 때문에 별도로 게시되었습니다. 이중 프라임 단어 "DiningTable"및 "METER"에 대해 실패합니다 .