두 개의 소수는 서로 다른 경우 두 개의 소수로 정의됩니다. 예를 들어, 3과 5는 29와 31과 같이 트윈 프라임입니다.
n 번째 쌍 소수 (n은 STDIN에서 온)를 찾아 STDOUT에 쉼표와 공백으로 구분하여 인쇄하는 프로그램을 작성하십시오. 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.
샘플 입력 :
3
샘플 출력 :
11, 13
답변
하스켈 118
main=putStrLn.(!!)[show n++", "++show(n+2)|n<-[2..],all((>0).rem n)[2..n-1],all((>0).rem(n+2))[2..n]].(+)(-1)=<<readLn
모든 트윈 프라임을 무차별 대입하고 n 번째 쌍을 인쇄합니다 .
답변
CJam, 29 26 바이트
Y4]{{:)_{mp}/&!}g}q~*", "*
예
$ for i in {1..10}; do cjam twin-primes.cjam <<< $i; echo; done
3, 5
5, 7
11, 13
17, 19
29, 31
41, 43
59, 61
71, 73
101, 103
107, 109
작동 원리
Y4] " Push [ 2 4 ]. ";
{ " ";
{ " ";
:) " Increment each integer in the array. ";
_ " Duplicate the array. ";
{mp}/ " For each integer in the array, push 1 if it's prime and 0 otherwise. ";
&! " Compute the logical NOT of the bitwise AND of the two previous integers. ";
}g " If the result is non-zero, repeat the loop. ";
}q~* " Do the above “N” times, where “N” is the integer read from STDIN. ";
", " " Join the array by comma and space. ";
답변
펄, 101 87
아스키 플러의 의견을 바탕으로 한 87 자
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11t"=~$r||--$n||die"$s, ",$s+2,$/while++$s
101 자, 조기 답변
$n=pop;$r=qr/^1$|^(11+?)\1+$/;(1x$s)!~$r&&(1x($s+2))!~$r&&++$i==$n&&say($s,", ",$s+2)&&exit while++$s
용법:
$ perl ./twin_primes.pl 10
107, 109
설명
$n = pop; # Pulls twin prime pair counter from @ARGV
$r = qr/^1$|^(11+?)\1+$/; # The money line - a regex that verifies
# if a string of 1's has non-prime length
while ( ++$s ) { # Loop over integers
# '&&' short-circuits
(1 x $s ) !~ $r # Negated regex match evaluates to true if $s is prime
&& (1 x ($s+2) ) !~ $r # Same for $s + 2
&& ++$i == $n # Counter to control which pair to print
&& say( $s, ", ", $s+2 ) # Print the line
&& exit # Terminate program
}
비 우선 순위 정규 표현식의 작동은 이 SO 질문에 설명되어 있습니다.
답변
C : 113
n,c,l;main(i){for(scanf("%d",&n),l=2;n;l=c==i?n-=i==l+2,i:l,i+=2)for(c=2;c<i&&i%c++;);printf("%d, %d\n",l-2,l);}
샘플 실행 :
$ for i in $(seq 1 10); do echo $i | ./twinprimes; done
3, 5
5, 7
11, 13
17, 19
29, 31
41, 43
59, 61
71, 73
101, 103
107, 109
Dennis, bebe 및 Alchymist의 도움에 감사드립니다.
답변
CJam-26
1e4,{mp},_2f-&qi(=_2+", "\
10000보다 작은 소수에 적용됩니다. 4
더 큰 숫자 (잠재적으로 최대 10 20 )에 대해 더 높은 지수로 대체 할 수 있지만 프로그램이 느려지고 더 많은 메모리를 사용합니다.
http://cjam.aditsu.net/ 에서 시도 하십시오
설명:
1e4,
배열 생성 [0 1 2 … 9999] 소수만
{mp},
선택
_2f-
하여 배열을 복사하고 각 항목에서 2를 빼면
&
두 배열을 교차하므로 각 쌍 소수 쌍에서 하위 소수를 찾으면
qi
입력을 읽고 정수로 변환
(=
합니다. 배열에서 해당 (더 낮은) 트윈 소수를 가져오고 소수를
_2+
복사하고 2
", "\
를 추가 하면 두 소수 사이에 쉼표와 공백이 추가됩니다.
답변
Mathematica-63 자
Print[#-2,", ",#]&@Nest[NestWhile[NextPrime,#,#2-#!=2&,2]&,1,n]
노트
이것은 실제로 다소 간단한 구현입니다. 단축으로 인해 난독 화가 거의 발생하지 않았습니다.
NextPrime
숫자 다음에 오는 소수를 찾는 내장입니다.
NestWhile[NextPrime,#,#2-#1!=2&,2]&
숫자 뒤의 다음 쌍 소수 쌍의 큰 소수를 찾는 익명 함수입니다.
Nest
이 익명 함수 n
시간을 적용합니다 .
Print[#-2,", ",#]&
사양에 따라 stdout으로 인쇄하는 익명 함수입니다. 슬프게도 이것만으로 63 개의 문자 솔루션 중 18 개의 문자를 차지합니다.
예
In[1]:= Do[ Print[#-2,", ",#]&@Nest[NestWhile[NextPrime,#,#2-#!=2&,2]&,1,n], {n, 1, 10} ] 3, 5 5, 7 11, 13 17, 19 29, 31 41, 43 59, 61 71, 73 101, 103 107, 109
업데이트 : 이 CJam 솔루션 을 다시 구현하여 두 문자를 저장할 수 있습니다 . 그러나이 알고리즘은의 최대 값을 제한합니다 n
. Nest...
부품을 교체하십시오Intersection[#,#-2][[5]]&@Prime@Range[999]
답변
자바 스크립트 (E6) 92 96
더 짧고 호환-spidermonkey 쉘을 사용하여 stdin / write stdout (쉼표와 공백)을 읽습니다. 내 PC에서 1 분 만에 10000 번째 쌍 1260989, 1260991을 발견하는 대신 p 배열이 희소하므로 대신
사용 p[n]=o=n
하는 것이 더 짧을 수 있습니다 p.push(o=n)
. 그러나 그것은 훨씬 느리며 어쨌든 코드 길이로 이길 수는 없습니다.
m=readline();for(n=3,o=p=[];m;n+=2)p.every(e=>n%e)&&(m-=n-o<3,p.push(o=n));print(o-2+', '+o)
파이어 폭스 콘솔에서 시도하려면 :
m=prompt();for(n=3,o=p=[];m;n+=2)p.every(e=>n%e)&&(m-=n-o<3,p.push(o=n));alert(o-2+', '+o)
언 골프
모든 첫 m 트윈을 찾은 함수 (가장 큰 값을 반환 함) :
T=m=>{
for (o=n=3, p=[2], t=[]; !t[m-1]; n+=2)
p.every(e => n%e) && (n-o-2 ? 0 : t.push(n), p.push(o=n))
return t
}
예: console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
마지막 :
L=m=>{
for (o=n=3,p=[2]; m; n+=2)
p.every(e => n%e) && (m -= n-o==2, p.push(o=n))
return o
}
그런 다음 2 줄을 가져 와서 IO를 추가하십시오.
m = prompt()
for (o=n=3, p=[2]; m; n+=2)
p.every(e => n%e) && (m -= n-o==2, p.push(o=n))
alert('o-2+', '+o)