쌍둥이 소수의 N 번째 쌍을 찾습니다 트윈 프라임입니다. n

두 개의 소수는 서로 다른 경우 두 개의 소수로 정의됩니다. 예를 들어, 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)