ค้นหาคู่ที่ N ของช่วงเวลาคู่


26

สองหมายเลขเฉพาะถูกกำหนดเป็นช่วงเวลาคู่หากพวกเขาแตกต่างกันสอง ตัวอย่างเช่น 3 และ 5 เป็นช่วงเวลาคู่เช่นเดียวกับ 29 และ 31

เขียนโปรแกรมที่ค้นหาคู่ที่ n ของคู่แฝด (โดยที่ n มาจาก STDIN) และพิมพ์ลงบน STDOUT โดยคั่นด้วยเครื่องหมายจุลภาคและเว้นวรรค นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

ตัวอย่างอินพุต:

3

ตัวอย่างผลลัพธ์:

11, 13

5
รอ ... ดังนั้นผู้ใช้จะป้อนคู่ที่สองของช่วงเวลาคู่และคุณต้องการให้เราส่งออกหรือไม่ ดังนั้นเพียงแค่สะท้อนกลับสิ่งที่ผู้ใช้ป้อน? ;-)
Iszi

อืม ... ถ้อยคำนั้นค่อนข้างอึดอัด! : P
Jwosty

คำตอบ:


11

Haskell 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 THคู่


5
ทำได้ดีนี่! ด้วยการแยกฟังก์ชั่นการกรองและการใช้งานinteractแทนคุณputStrLnสามารถไปได้ไกลกว่านั้นและนำสิ่งนี้มาลงที่ 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
Flonk

10

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.                                       ";

9

Perl, 101 87

87 ตัวอักษรสร้างความคิดเห็นของ aschepler

$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
}

การทำงานของ regex ที่ไม่ใช่คนธรรมดามีการอธิบายในคำถามนี้


..นี่คืออะไร?
seequ

@TheRare: มันใช้ regex เพื่อตรวจสอบความเป็นอันดับแรกของตัวเลข
Zaid

1
คุณแค่ทำให้ใจฉัน มี +1
seequ

@TheRare: ฉันได้เพิ่มคำอธิบายว่าทำไมงานนี้ ฉันแน่ใจว่ายังมีห้องพักสำหรับการปรับปรุง :)
Zaid

2
สิ่งที่ฉันจะทำ มีตัวละครที่โกนไม่กี่:$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
aschepler

8

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


คุณสามารถบันทึกไม่กี่ไบต์โดยใช้scanfแทนอาร์กิวเมนต์บรรทัดคำสั่ง นอกจากนี้ยังo=0ไม่จำเป็นเนื่องจากoเป็นระดับโลก
Dennis

mainสามารถเก็บตัวแปร int เริ่มต้นการเพิ่มcและiในระหว่างการมอบหมายและข้อความสั่งอาจทำให้โค้ดสั้นลงการกำหนดของlสามารถถูกนำกลับไปที่แรกสำหรับบล็อกที่สามของลูปดังนั้นคุณไม่จำเป็นต้องใช้เครื่องมือจัดฟันและใช้ตัวคั่นเดียวใน printf ทำให้กะทัดรัดขึ้น
bebe

ขอบคุณ bebe! ฉันสังเกตเห็นว่าฉันยังมีc<=i-1ซึ่งเป็นเพียงโง่
millinon

ฉันไม่เห็นทางที่จะโกนไบต์โดยการเพิ่มiในlการแสดงออกได้รับมอบหมายตั้งแต่ (ใหม่) ค่าของใช้ในการลดลงi nเคล็ดลับใด ๆ
millinon

ถ้าฉันจำถูกต้องมีที่เดียวที่คุณสามารถเพิ่ม i ได้ แต่ฉันเชื่อว่ามันขึ้นอยู่กับผู้แปล :(
bebe

6

CJam - 26

1e4,{mp},_2f-&qi(=_2+", "\

มันใช้งานได้สำหรับจำนวนเฉพาะที่น้อยกว่า 10,000; คุณสามารถแทนที่4ด้วยเลขชี้กำลังที่สูงขึ้นสำหรับจำนวนที่มากขึ้น (อาจสูงถึง 10 20 ) แต่โปรแกรมจะช้าลงและจะใช้หน่วยความจำมากขึ้น

ลองที่http://cjam.aditsu.net/

คำอธิบาย:

1e4,สร้างอาร์เรย์ [0 1 2 ... 9999]
{mp},เลือกเฉพาะจำนวนเฉพาะ
_2f-คัดลอกอาร์เรย์และลบ 2 จากแต่ละรายการที่
&ตัดกันทั้งสองอาร์เรย์ดังนั้นการค้นหาช่วงเวลาที่ต่ำกว่าจากคู่ไพรม์คู่แต่ละคู่
qiจะอ่านอินพุตและแปลงเป็นจำนวนเต็ม
(=ปรับ จัดทำดัชนีและรับค่านายกคู่ที่ตรงกัน (ต่ำกว่า) จากอาร์เรย์
_2+คัดลอกเฉพาะและเพิ่ม 2
", "\ใส่เครื่องหมายจุลภาคและช่องว่างระหว่างสองช่วง


4

Mathematica - 63 ตัวอักษร

Print[#-2,", ",#]&@Nest[NestWhile[NextPrime,#,#2-#!=2&,2]&,1,n]

หมายเหตุ

นี่คือการดำเนินการที่ค่อนข้างตรงไปตรง การทำให้สั้นลงทำให้แทบไม่ทำให้งง

NextPrime เป็น builtin ที่ค้นหานายกถัดไปหลังจากตัวเลข

NestWhile[NextPrime,#,#2-#1!=2&,2]& เป็นฟังก์ชั่นนิรนามที่ค้นหานายกที่ใหญ่กว่าของคู่แฝดคู่ถัดไปหลังจากตัวเลข

Nestใช้ฟังก์ชันnเวลาที่ไม่ระบุชื่อนี้

Print[#-2,", ",#]&เป็นฟังก์ชั่นไม่ระบุชื่อที่พิมพ์ไปยัง stdout ตามข้อกำหนด น่าเศร้าที่สิ่งนี้เพียงอย่างเดียวใช้เวลา 18 ตัวอักษรสำหรับโซลูชัน 63 ตัว

ตัวอย่าง

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]


STDIN ของคุณอยู่ที่ไหน :)
mfvonh

4

Javascript (E6) 92 96

ตัวย่อและสอดคล้อง - ใช้เชลล์ spidermonkey เพื่ออ่าน stdin / write stdout (พร้อมเครื่องหมายจุลภาคและช่องว่าง) พบว่าคู่ที่ 10,000 1260989, 1260991 ใช้เวลาน้อยกว่าหนึ่งนาทีบนพีซีของฉัน
อาจจะใช้น้อยกว่าp[n]=o=nแทนp.push(o=n)เพื่อที่ว่าอาร์เรย์ p จะกระจัดกระจาย แต่มันค่อนข้างช้าและฉันจะไม่ชนะเพราะความยาวของรหัสอยู่ดี

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)

วิธีลองใช้คอนโซล firefox:

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)

Ungolfed

ฟังก์ชั่นที่พบฝาแฝด 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)

4

J - 49 60 55 51 ไบต์

ฉันตัดสินใจที่จะใช้วิธีการง่ายๆ ฟังก์ชั่นtพบว่าคู่ที่สำคัญต่อไปกำหนดจำนวนที่สำคัญเป็น input (ตอนนี้จะรวมอยู่ในfฟังก์ชั่น) ฟังก์ชั่นfค้นหานายกคู่ที่ n นี่เป็นโปรแกรมแรกที่ฉันเขียนใน J

f=:[:(":,', ',":@+&2)(4&p:(,{~-=2:)])^:_@>:^:(]`2:)

ตัวอย่าง:

   f 1
3, 5
   f 2
5, 7
   f 3
11, 13
   f 4
17, 19
   f 5
29, 31
   f 100000
18409199, 18409201

สำหรับคิ้วบางมีรุ่น ungolfed

twin =: (4&p:)(($:@[)`(,)@.(=(]+2:)))]
f    =: ((]-2:),])((0:{twin) ^: (]`(2:)))

คำอธิบาย:

f=:[:(":,', ',":@+&2)(4&p:(,{~-=2:)])^:_@>:^:(]`2:)
                     (4&p:(,{~-=2:)])^:_@>:^:(]`2:)
                                        @>:^:(]`2:)  main loop
                                           ^:(]`2:)  Repeat n times, starting with value of 2
                                        @>:          Add one to the current value and apply to the following function.
                     (4&p:(,{~-=2:)])^:_             Get the next twin prime
                                     ^:_             Recurse until there's no change
                          (,{~-=2:)                  If next prime - current value == 2, return current value, otherwise the next prime.
                      4&p:                           Get the next prime
     (":,', ',":@+&2)                                Format the output and add 2 to the second value.
   [:                                                Apply the twin prime to the formatter.

Basically, if n is 4, this creates a recursion tree like this:
 let T be the recursion inside t
 and numbers between rows the return values of according function
   (t * n) 3
-> (t * 4) 3
-> t  t  t  t  3
   17 11 5  3
-> (T  T) (T  T) T  T  3
    17 13  11 7  5  3
-> 17

สิ่งนี้ต้องการงานเพิ่มอีกเล็กน้อยเพื่อให้เป็นไปตามข้อกำหนด: "พิมพ์ลงบน STDOUT โดยคั่นด้วยเครื่องหมายจุลภาคและเว้นวรรค" แน่นอนว่าไม่เกี่ยวข้องกับอัลกอริทึม แต่เพิ่มความยาวของโปรแกรม
Szabolcs

@Sababcs ดีขึ้นหรือไม่
seequ

แน่นอน +1 เจค่อนข้างเท่ห์
Szabolcs

@ Szabolcs มันคือเรื่องจริง แม้ว่ามันจะทำให้จิตใจของฉันโค้งงอ ทำให้ง่ายขึ้นตลอดเวลา (นี่เป็นโปรแกรมแรกที่ฉันเขียนด้วยมือ) นอกจากนี้ขอบคุณ
seequ

4

C #, 265

using System.Linq;class P{static void Main(string[] args){var i=int.Parse(args[0]);int f=0,c=0;for(int j=1;;j+=2){var b=(Enumerable.Range(1,j).Count(x=>j%x==0)==2);if(f==0 && b){f=j;continue;}if(b){c++;if(c==i){System.Console.WriteLine(f+","+j);break;}j-=2;}f=0;}}}

2
+1 แต่คุณต้องเพิ่มหนึ่งช่องว่างหลังเครื่องหมายจุลภาคเมื่อคุณพิมพ์จำนวน
Cristian Lupascu

1
คุณสามารถบันทึกอีกสองตัวอักษร: .Count(x=>j%x==0)==2)->.Count(x=>j%x<1)<3)
Cristian Lupascu

2
นอกจากนี้ยังมีชั้นเรียนของคุณอาจจะเรียกPแทนProgramและพารามิเตอร์แทนa args
Cristian Lupascu

1
จะไม่คอมไพล์เหมือนเดิม - คุณมีความสามารถพิเศษ)หลังจาก.Count(...)<3นั้น นอกจากนี้คุณยังสามารถบันทึกบิตโดยการเปลี่ยนไปvar i=int.Parse(args[0]);int f=0,c=0; int i=int.Parse(args[0]),f=0,c=0;คุณสามารถบันทึกเพิ่มเติมบางส่วนโดยแยก initialiser จากวงดังนั้น=>c=0;for(int j=1; c=0,j=1;for(;
Bob

นอกจากนี้การเขียนที่สมบูรณ์ของเนื้อความของforลูปรวมถึงการใช้ชื่อที่ผ่านการรับรองโดยสมบูรณ์มากกว่าusing System: using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}, 238 chars
Bob


2

Perl, 100 95

$n=<>;$i=3;while($c<$n&&($l=$i++)){$i++until!grep{$i%$_<1}(2..$i-1);$c++if$i-$l<3}print"$l, $i"

Ungolfed:

$n = <>;          # Read from STDIN
$i = 3;           # Tiny hack because I know I don't need the number 2
while ($c<$n && ($l = $i++)) {   # $c counts the pairs, $l is the last prime
  $i++ until ! grep {$i%$_<1} (2..$i-1);   # Increase $i until it's not divisible by anything
  $c++ if $i-$l < 3   # If $i and $l are twin primes, count it
}
print "$l, $i"    # That damned comma added a whole character to my code!

2

T-SQL (2008+): 344

Brute บังคับให้ CTE ค้นหาช่วงเวลา, ฟังก์ชันหน้าต่างนับ n, ตามด้วยการเข้าร่วมเพื่อค้นหา twin ทำงานในเสี้ยววินาทีสำหรับเอาต์พุต <1,000 เพียงไม่ถึงหนึ่งนาทีสำหรับเอาต์พุต <10,000

Golfed (SQLFiddle ที่นี่ ):

WITH x(i) AS(SELECT 99 UNION ALL SELECT i-2
FROM x WHERE i>3),z AS(SELECT RANK()OVER(ORDER BY x.i)n,x.i
FROM x x LEFT JOIN x y ON x.i%y.i=0 AND y.i NOT IN(x.i,1)
WHERE y.i IS NULL)SELECT LTRIM(a)+', '+LTRIM(b)FROM(SELECT RANK()
OVER(ORDER BY x.i)n,x.i a,y.i b FROM z x,z y WHERE x.n=y.n-1
AND x.i=y.i-2) o WHERE n=3
OPTION(MAXRECURSION 0)

ชัดเจน:

WITH x(i) AS (
   SELECT 99
    UNION ALL
   SELECT i-2
   FROM x
   WHERE i > 3
)
,z AS (
SELECT RANK()OVER(ORDER BY x.i)n,x.i
FROM x x
WHERE NOT EXISTS
  (SELECT *
   FROM x y
   WHERE x.i%y.i = 0
    AND y.i NOT IN (x.i,1)
  )
)
SELECT LTRIM(a)+', '+LTRIM(b)
FROM (
    SELECT RANK()OVER(ORDER BY x.i)n,x.i a, y.i b
    FROM z x, z y
    WHERE x.n = y.n+1
    AND x.i = y.i+2
) o
WHERE n = 3
OPTION(MAXRECURSION 0)

1

GolfScript 46

~[1 3]\{\{))}%.{:x,{)x\%!},,2=}/*@\-.}do;', '*

การทดสอบออนไลน์: ลิงค์

รหัสข้อเขียน:

~                       # parse the input as an int
[1 3]                   # add the array [1, 3] on the stack
\                       # invert the items on the stack
{                       # begin loop
  \                     # bring the array to the top of the stack
  {))}%                 # add 2 to each of the numbers in the array
  .{:x,{)x\%!},,2=}/    # check if numbers are prime (leaves a 0 or 1 for both numbers on the stack)
  *                     # multiply the two 0/1 numbers (will only get 1 if both are 1)
  @\-                   # subtract the result from the inital int
  .                     # copy the new int value on the stack to be consumed by the 'do' loop
}do                     # repeat until the initial int was taken down to 0
                        # at this point the array contains the two numbers we're looking for
;                       # get rid of the 0 from the stack
', '*                   # format the output

1

PHP 5.4, 223

ไม่ใช่อันที่เล็กกว่า แต่ลองจาก php

$n=$argv[1];function i($k){for($i=2;$i<=(int)($k/2);$i++)if($k%$i==0)return 0;return 1;}function t($t){return (i($t) && i($t+2))?1:0;}$g=1;$d=0;do{if(t($g)==1){if($d<$n){$d++;}else{print_r([$g,$g+2]);break;}}$g++;}while(1);

1

C 309

ช่วยให้ได้รับช่วงต่อไปและเก็บคำแปลกและแม้กระทั่งจากนั้นตรวจสอบว่าความแตกต่างเป็นสอง

int main()
{
int n;
scanf("%d",&n);
int a=2,b=3,k=2,q;
int odd=1;
int p;
if(n>0)
{
while(n)
{
k++;
p=1;
q=ceil(sqrt(k));
for(int i=2;i<=q;i++)
{
if(k%i==0)
{
p=0;
break;
}
}
if(p)
{
if(odd%2==0)a=k;
else b=k;
if(abs(a-b)==2)n--;
odd++;
}
}
}
printf("%d %d\n",a,b);
return 0;
}

1
โปรดอย่ารากที่สอง! for (int i=2;i*i<=k;i++)
edc65

1

R, 91 ตัวอักษร

a=scan();n=1;p=5;while(n!=a){p=p+1;q=p-2;if(sum(!p%%2:p,!q%%2:q)<3)n=n+1};cat(q,p,sep=", ")

ไม่มีอะไรแฟนซี:

a=scan()
n=1
p=5
while(n!=a){
    p=p+1
    q=p-2
    if(sum(!p%%2:p,!q%%2:q)<3) # Check that p and q are both primes by checking
       n=n+1                   # the number of zeroes resulting from 
}                              # p modulo each integers 2 to p and same for q
cat(q,p,sep=", ")

การใช้งาน:

> a=scan();n=1;p=5;while(n!=a){p=p+1;q=p-2;if(sum(!p%%2:p,!q%%2:q)<3)n=n+1};cat(q,p,sep=", ")
1: 10
2: 
Read 1 item
107, 109


0

JavaScript (Node.js), 162 ตัวอักษร

อ่านจาก stdin, เอาท์พุทที่ stdout ออกจาก "ต้น" <= 0สำหรับการป้อนข้อมูล

t=process.argv[2],c=0,l=1;if(t>0){for(i=0;;i++){p=!Array(i+1).join(1).match(/^1?$|^(11+?)\1+$/);if(p){if(i-2==l){if(c>=t-1){console.log(l+", "+i);break}c++}l=i}}}

การใช้งาน (สคริปต์ด้านบนบันทึกเป็นntp.js):

>for /l %x in (0, 1, 10) do node ntp.js %x
>node ntp.js 0
>node ntp.js 1
3, 5
>node ntp.js 2
5, 7
>node ntp.js 3
11, 13
>node ntp.js 4
17, 19
>node ntp.js 5
29, 31
>node ntp.js 6
41, 43
>node ntp.js 7
59, 61
>node ntp.js 8
71, 73
>node ntp.js 9
101, 103
>node ntp.js 10
107, 109

0

AWK - 129

ไฟล์fsoe-pairs.awk:

{n=2;N=1
for(;;){if(n in L){p=L[n];del L[n]}else{p=n
if(n-N==2)if(!--$0){print N", "n;exit}N=n}P=p+n++
while(P in L)P+=p;L[P]=p}}

ใช้มัน

$ awk -f fsoe-pairs.awk
1
3, 5
$ awk -f fsoe-pairs.awk
2
5, 7
$ awk -f fsoe-pairs.awk
10
107, 109

(บรรทัดที่ 1 หลังจากป้อนคำสั่งแล้วบรรทัดที่สองจะถูกส่งออก)

สิ่งนี้ขึ้นอยู่กับอัลกอริธึมของตัวสร้างไพรมเฉพาะของตัวเองที่ฉันเรียกว่า "ตะแกรงร่อนของเอรัสอะเทสเธเนส" (จนกว่าฉันจะพบมันอธิบายที่อื่น) ซึ่งเก็บเฉพาะส่วนที่ต้องการของตะแกรงและ primes ที่คำนวณแล้วเท่านั้น


0

Python 2 (75)

c=input()
n=3
while c:n+=2;c-=all(n%i&~2for i in range(2,n-2))
print(n-2,n)

แล้วเกิดอะไรขึ้นที่นี่?

อันดับแรกให้ดูที่นิพจน์all(n%i&~2for i in range(2,n-2))ซึ่งตรวจสอบว่า(n-2,n)เป็นคู่ของช่วงเวลาคู่หรือไม่

นิพจน์ที่ง่ายกว่านั้นall(n%i for i in range(2,n))จะตรวจสอบว่าnมันยอดเยี่ยมหรือไม่โดยการลองตัวหารทั้งหมดiในช่วง2<=i<=n-1และดูว่าส่วนที่เหลือทั้งหมดไม่ใช่ศูนย์หรือไม่ สิ่งนี้allจะตรวจสอบสิ่งนี้อย่างแน่นอนเนื่องจาก Python ปฏิบัติ0ตามFalseและหมายเลขอื่น ๆ ทั้งหมดเป็นTrueทั้งหมดเป็น

ตอนนี้สังเกตได้ว่า(n-2)%i==0ว่าเมื่อสำหรับตัวหารn%i==2 i>2ดังนั้นเราสามารถดำเนินการตรวจสอบ primality บนnและn-2ในเวลาเดียวกันโดยการตรวจสอบที่เหลือทั้งสองและ0 2ซึ่งสามารถทำได้all(n%i not in [0,2] for i in range(2,n-2))ดังนี้ เราลองใช้ตัวหารในช่วง2<=i<=n-3เพื่อผลประโยชน์n-2แต่ก็เพียงพอแล้วnเช่นกันn-1และn-2ไม่สามารถเป็นตัวหารn<=4ได้ เราจะพยายามที่แปลกnเริ่มต้นจากการที่จะหลีกเลี่ยงภาวะแทรกซ้อนนี้และที่ของตัวหาร5i=2

เรากอล์ฟแสดงออกn%i not in [0,2]เข้าไปในn%i&~2ความทรงจำที่เป็นเท็จและตัวเลขอื่น0Trueลำดับความสำคัญของโอเปอเรเตอร์(n%i)&(~2)คือสิ่งที่จำเป็น bit-complement ~2คือ...11111101bitwise ที่andมีตัวเลขเป็นศูนย์2ค่าของสถานที่ไบนารี สิ่งนี้ให้0(เช่นFalse) สำหรับเท่านั้น0และ2ตรงตามที่เราต้องการ

วุ้ย ตอนนี้เรามีการแสดงออกที่all(n%i&~2for i in range(2,n-2))ตรวจสอบว่าnเป็นจำนวนที่สูงกว่าของคู่ที่สำคัญคู่ สิ่งที่เหลืออยู่ก็คือย้ำพวกเขาจนกว่าเราจะเห็นcพวกเขาอยู่ที่ไหนcจำนวนที่ป้อน เราเริ่มต้นด้วย5และนับขึ้น2เพื่อหลีกเลี่ยงปัญหาตัวหาร เราลดลงcทุกครั้งที่พบการnทำงานหยุดเมื่อc=0ใด ในที่สุดเราพิมพ์คู่สำคัญคู่ที่เราลงท้ายด้วย


0

T-SQL (2012 +), 255 อักขระ

เครื่องมือค้นหาคู่แฝด T-SQL ขนาดกะทัดรัดที่มีความเร็วเพิ่มขึ้นเล็กน้อย

with t(n)as(select 2+number from spt_values where type='p')select*from(select concat(b,', ',a),rank()over(order by a)from(select n,lag(n)over(order by n)from t where not exists(select*from t f where f.n<t.n and t.n%f.n=0))z(a,b)where a=b+2)r(s,k)where k=2

รูปแบบที่มนุษย์อ่านได้ ::

    with t(n)as(
        select 2+number 
        from spt_values 
        where type='p'
    )
    select *
    from(
        select concat(b,', ',a),rank() over (order by a)
        from(
            select n, lag(n) over(order by n)


    from t 
        where not exists(
            select 1 from t f 
            where f.n<t.n and t.n%f.n=0)
    ) z(a,b)
    where a=b+2
) r(s,k)
where k=2

สรุปสาระสำคัญพื้นฐานคือเราใช้ตารางตัวเลข (master..spt_values ​​type = 'p') ในตัวและนามแฝงที่มี CTE เป็นสิ่งที่สั้น เราเพิ่ม 2 เพื่อลบความกังวลในการดึงข้อผิดพลาดเล็ก ๆ น้อย ๆ 0 หรือ 1 ข้อสำหรับชุดของเราดังนั้นตอนนี้เรามีผู้สมัครจำนวน 2,2050 คน

Z ข้อความค้นหาส่วนใหญ่ได้รับช่วงเวลาทั้งหมดตั้งแต่ 2 ถึง 2050 โดยการกรองตัวเลขใด ๆ ที่หารด้วยจำนวนที่น้อยกว่า n จากนั้นเราใช้ฟังก์ชั่นหน้าต่าง T-SQL 2012 lagที่ดีที่ช่วยให้เราดึงผลลัพธ์ก่อนหน้าดังนั้นตอนนี้ผลลัพธ์ของ A และ b เป็นช่วงเวลาP[n]และP[n-1]ตามลำดับ เคียวรี R สร้างสตริงเอาต์พุตและกรองช่วงเวลาที่ไม่ใช่คู่และสร้างหมายเลขลำดับสำหรับเอาต์พุตที่เราเรียกว่าเคในที่สุดเคียวรีสุดท้าย R ช่วยให้เราสามารถกรองและรับ Kth twin prime โดยการเปลี่ยนตัวแปร


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.