ฉันมีห้องคู่ดีหรือไม่?


23

จำนวนเต็มนั้นสำคัญถ้าหากเป็นบวกและมีตัวหารที่แตกต่างกัน 2 ตัว: 1 และตัวของมันเอง คู่แฝดสำคัญทำจากสององค์ประกอบ: pและp±2นั่นคือทั้งคู่

คุณจะได้รับจำนวนเต็มบวกเป็นอินพุต งานของคุณคือการส่งคืนความจริง / เท็จขึ้นอยู่กับว่าจำนวนเต็มที่กำหนดเป็นคู่แฝดตามกฎมาตรฐาน(ค่าจะต้องสอดคล้องกัน)

กรณีทดสอบ

  • Truthy (Twin Primes): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Falsy (ไม่ใช่ Twin Primes): 2, 15, 20, 23, 37, 47, 97, 120, 566

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!


คือ 13 คู่แฝด?
LiefdeWen

@LiefdeWen ใช่เพราะมันเป็นของคู่ (11, 13)
daniero

คำตอบ:



11

เยลลี่ , 10 9 ไบต์

%6+_2_ÆP⁺

ลองออนไลน์!

พื้นหลัง

มีข้อยกเว้นของ(3, 5)ทุกคู่คู่ที่สำคัญมีของแบบฟอร์ม(6k - 1, 6k + 1)

ตั้งแต่(6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 +5 - 3 = 6k + 1และ
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , รับอินพุตn> 3 , ก็เพียงพอที่จะตรวจสอบว่าnและn + n% 6 - 3เป็นทั้งคู่หรือไม่

สูตรนี้จะเกิดขึ้นกับการทำงานสำหรับn = 3เช่นกัน3 + 3% 6-3 = 3คือนายกรัฐมนตรีและ3เป็นคู่สำคัญ

มันทำงานอย่างไร

%6+_2_ÆP⁺  Main link. Argument: n

%6         Compute n%6.
  +        Add n to the result.
   _2      Subtract 2.
     _ÆP   Subtract 1 if n is prime, 0 if not.
           If n is not a prime, since (n + n%6 - 2) is always even, this can only
           yield a prime if (n + n%6 - 2 = 2), which happens only when n = 2.
        ⁺  Call ÆP again, testing the result for primality.

7

Python 3 , 53 ไบต์

lambda n:sum((n+n%6-3)*n%k<1for k in range(2,4*n))==2

ลองออนไลน์!

พื้นหลัง

จำนวนเต็มทั้งหมดใช้เวลาหนึ่งในรูปแบบดังต่อไปนี้ด้วยจำนวนเต็มk : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2

ตั้งแต่6k - 2 , 6kและ6k + 2มีทั้งหมดได้และตั้งแต่6k - 3หารด้วย3 , ช่วงเวลาที่ทุกคนยกเว้น2และ3จะต้องอยู่ในรูปแบบ6k - 1หรือ6k + 1 เนื่องจากความแตกต่างของคู่แฝดที่สำคัญคือ2 , มีข้อยกเว้นของ(3, 5)ทุกคู่คู่ที่สำคัญมีของแบบฟอร์ม(6k - 1, 6k + 1)

ให้nอยู่ในรูปแบบ6k ± 1

  • ถ้าn = 6k -1แล้ว+ n n% 6-3 = 6k - 1 + (6k - 1)% 6-3 = 6k - 1 + 5-3 = 6k + 1

  • ถ้าn = 6k + 1แล้ว+ n n% 6-3 = 6k + 1 + (6k + 1)% 6-3 = 6k + 1 + 1-3 = 6k - 1

ดังนั้นถ้า nเป็นส่วนหนึ่งของฝาแฝดคู่นายกรัฐมนตรีและn ≠ 3มันของคู่จะn + n% 6-3

มันทำงานอย่างไร

Python ไม่มีการทดสอบเบื้องต้นในตัว ในขณะที่มีวิธีสั้น ๆ ในการทดสอบหมายเลขเดียวสำหรับ primality การทำเช่นนั้นสำหรับสองหมายเลขจะมีความยาว เราจะไปทำงานกับ divisors แทน

sum((n+n%6-3)*n%k<1for k in range(2,4*n))

นับจำนวนเต็มkในช่วงเวลา[2, 4n)หาร(n + n% 6 - 3) nเท่ากันนั่นคือนับจำนวนตัวหารของ(n + n% 6 - 3) nในช่วง[2 , 4n) เราอ้างว่าการนับนี้เป็น2ถ้าหากว่าnเป็นส่วนหนึ่งของคู่ที่สำคัญคู่เท่านั้น

  • ถ้าn = 3 (คู่สำคัญ) (n + n% 6-3) n = 3 (3 + 3-3) = 9มีสองตัวหาร ( 3และ9 ) ใน[2, 12)

  • ถ้าn> 3เป็น twin prime อย่างที่เห็นก่อนหน้านี้m: = n + n% 6 - 3เป็น twin ในกรณีนี้ล้านมีตรงสี่ตัวหาร: 1, m, n, มินนิโซตา

    ตั้งแต่n> 3เรามีม> 4ดังนั้น4n <ล้านและตรงสองตัวหาร ( ม.และn ) ตกอยู่ในช่วงเวลา[2 4n)

  • ถ้าn = 1แล้ว(n + n% 6-3) n = 1 + 1-3 = -1ไม่มีตัวหารใน[2, 4)

  • ถ้าn = 2แล้ว(n + n% 6-3) n = 2 (2 + 2-3) = 2มีหนึ่งตัวหาร (ตัวเอง) ใน[2, 8)

  • ถ้าn = 4แล้ว(n + n% 6-3) n = 4 (4 + 4-3) = 20มีสี่ตัวหาร ( 2 , 4 , 5และ10 ) ใน[2, 16)

  • ถ้าn> 4เป็นเลขคู่ 2 , n / 2และnทั้งหมดหารnและดังนั้น(n + n% 6-3) n เรามีn / 2> 2ตั้งแต่n> 4จึงมีอย่างน้อยสามตัวหารใน[2 4n)

  • ถ้าn = 9แล้ว(n + n% 6-3) n = 9 (9 + 3-3) = 81มีสามตัวหาร ( 3 , 9และ21 ) ใน[2, 36)

  • ถ้าn> 9มีหลาย3แล้ว3 , n / 3และnหารทั้งหมดnและดังนั้น(n + n% 6-3) n เรามีn / 3> 3ตั้งแต่n> 9จึงมีอย่างน้อยสามตัวหารใน[2 4n)

  • สุดท้ายถ้าn = 6k ± 1> 4ไม่ได้เป็นคู่ที่สำคัญทั้งnหรือm: n = n +% 6-3จะต้องเป็นคอมโพสิตและจึงยอมรับตัวหารที่เหมาะสมd> 1

    เนื่องจากทั้งn = m + 2หรือm = n + 2และn, M> 4 , นัมเบอร์วัน , ม.และnเป็นที่แตกต่างกันหารของล้าน นอกจากนี้ม. <n + 3 <4nตั้งแต่n> 1ดังนั้นล้านมีอย่างน้อยสามตัวหารใน[2 4n)


ว้าว. รหัสย่อดังกล่าวและยังมีกรณีพิเศษมากมายที่ต้องจัดการอย่างถูกต้อง เหตุผลใดที่คุณพูด Python 3 เท่าที่ฉันสามารถบอกได้มันยังใช้งานได้ใน Python 2
kasperd

ใช่มันจะทำงานได้ดีใน Python 2 3เป็นส่วนหนึ่งของการโพสต์ SE ที่สร้างขึ้นโดยอัตโนมัติจาก TIO
Dennis


4

PHP, 52 ไบต์

<?=($p=gmp_prob_prime)($n=$argn)&&$p($n+2)|$p($n-2);

ไม่มี GMP, 84 ไบต์

(ใช้ฟังก์ชั่นเฉพาะของฉันจากกองล้น )

<?=p($n=$argn)&&p(2+$n)|p($n-2);function p($n){for($i=$n;--$i&&$n%$i;);return$i==1;}

-nFทำงานเป็นท่อด้วย เอาท์พุทที่ว่างเปล่าสำหรับเท็จ1สำหรับความจริง

โซลูชันที่ยอดเยี่ยมของ Dennis´ถูกย้ายไปยัง PHP, 56 ไบต์

while($i++<4*$n=$argn)($n+$n%6-3)*$n%$i?:$s++;echo$s==3;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์



3

MATL 11 ไบต์

HOht_v+ZpAa

เอาท์พุทเป็นหรือ01

ลองออนไลน์!

คำอธิบาย

H    % Push 2
O    % Push 0
h    % Concatenate horizontally: gives [2 0]
t_   % Push a negated copy: [-2 0]
v    % Concatenate vertically: [2 0; -2 0]
+    % Add to implicit input
Zp   % Isprime
A    % All: true for columns that only contain nonzeros
a    % Any: true if there is at least a nonzero. Implicit display


2

เรติน่า45 45ไบต์

.*
$*
11(1+)
$1¶$&¶11$&
m`^(11+)\1+$

1<`1¶1

ส่งคืน 1 ถ้าอินพุตเป็นไพรเวตคู่หรือมิฉะนั้น 0

ลองออนไลน์!

คำอธิบาย

.*              
$*

แปลงเป็น Unary

11(1+)          
$1¶$&¶11$&

ใส่ n-2, n และ n + 2 บนบรรทัดของตัวเอง

m`^(11+)\1+$   

(ขึ้นบรรทัดใหม่) ลบคอมโพสิตทั้งหมดที่มากกว่า 1

1<`1¶1          

ตรวจสอบว่ามีสองช่วงเวลาติดต่อกัน (หรือ 1,3 เพราะ 3 เป็นคู่ที่สำคัญ)


2

Perl 6 , 24 ไบต์

?(*+(0&(-2|2))).is-prime

ลองออนไลน์!

*เป็นอาร์กิวเมนต์ของฟังก์ชันที่ไม่ระบุตัวตนนี้ 0 & (-2 | 2)เป็นทางแยกที่ประกอบด้วยตัวเลข0และทั้งหรือ-2 2เพิ่ม*ไปจนถึงทางแยกนี้ผลิตชุมทางของตัวเลข*และทั้งของตัวเลขหรือ* - 2 * + 2การเรียกis-primeเมธอดบนจุดเชื่อมต่อนี้ส่งคืนค่าความจริงถ้า*เป็นไพร์มและอย่างใดอย่างหนึ่ง* - 2หรือ* + 2เป็นไพรม์ ในที่สุดการ?ยุบจุดเชื่อมต่อสัจธรรมกับค่าบูลีนเป็นไปตามเงื่อนไขผลตอบแทนที่สอดคล้องกัน


2

JavaScript, 91 ไบต์ , 81 ไบต์ขอบคุณJared Smith

p=n=>{for(i=2;i<n;)if(n%i++==0)return !!0;return n>1},t=n=>p(n)&&(p(n+2)||p(n-2))

คำอธิบาย

pบอกสภาพอากาศตัวเลขที่ระบุnเป็นสำคัญหรือไม่และtการทดสอบได้รับหมายเลขและnn±2

ตัวอย่าง


คุณไม่ต้องการvarวงเล็บnในคำจำกัดความของฟังก์ชั่นอื่น ๆ
Jared Smith

ฉันคิดว่าคุณสามารถแก้ไขส่วนย่อยของคุณเพื่อแสดงค่าของ nด้านข้างt(n)เพื่อความชัดเจนที่เพิ่มขึ้น (เช่น. 7: true)
Taylor Scott

1
ขอบคุณทั้งคู่
Serge K.

1

J, 23 ไบต์

1&p:*.0<+/@(1 p:_2 2+])

ลองออนไลน์!

อย่างไร

1&p:                               is the arg a prime?
    *.                             boolean and
                                   one of +2 or -2 also a prime
                     (1 p:_2 2+])  length 2 list of booleans indicating if -2 and +2 are primes
               @                   pipe the result into...
      0<+/                         is the sum of the elements greater than 0
                                   ie, at least one true

16 ไบต์ด้วย3>0#.@p:0 2 _2&+
ไมล์

@miles ดี การใช้ฐาน 2 อย่างชาญฉลาดในการประมวลผลผลลัพธ์
Jonah



1

JavaScript (ES6), 54 ไบต์

a=x=>f(x)&(f(x+2)|f(x-2));f=(n,x=n)=>n%--x?f(n,x):x==1


1

Excel VBA, 102 100 ไบต์

ไม่มีบิวด์อินสำหรับ VBA :(

รหัส

ฟังก์ชั่นหน้าต่างแบบไม่ระบุชื่อ VBE แบบทันทีที่รับอินพุตจากเซลล์[A1]และเอาต์พุต1(ความจริง) หรือ0(เท็จ) ไปยังหน้าต่าง VBE ทันที

a=[A1]:?p(a)*(p(a-2)Or p(a+2))

ฟังก์ชั่นผู้ช่วย

Function p(n)
p=n>2
For i=2To n-1
p=IIf(n Mod i,p,0)
Next
End Function

อีกวิธีหนึ่งคือ 122 ไบต์

รหัส

ฟังก์ชั่นการตรวจสอบแบบพื้นฐานแบบเรียกซ้ำ

a=[A1]:?-1=Not(p(a,a-1)Or(p(a-2,a-3)*p(a+2,a+1)))

ฟังก์ชั่นผู้ช่วย

Function p(n,m)
If m>1Then p=p(n,m-1)+(n Mod m=0)Else p=n<=0
End Function

0

PHP, 85 ไบต์24 ไบต์ขอบคุณ Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}

สิ่งนี้สามารถเล่นกอล์ฟได้อย่างมากโดยการเปลี่ยนชื่อของทั้งสองฟังก์ชั่นเป็น 1 ตัวอักษรแต่ละตัว (เช่นaและb)
Skidsdev

2
PHP ไม่ต้องการfunctionคำหลักอีกต่อไปหรือไม่
ติตัส


0

Japt , 13 ไบต์

j ©[U+2U-2]dj

ผลตอบแทนtrueและfalseสำหรับหรือไม่จำนวนเป็นส่วนหนึ่งของคู่แฝดที่สำคัญ

ลองออนไลน์!

คำอธิบาย

โดยนัย: U= จำนวนเต็มอินพุท

j ©

ตรวจสอบว่าอินพุทเป็นไพร์ม ( j), และ ( ©) ...

[U+2U-2]dj

ใช้อาร์เรย์[U+2, U-2]ตรวจสอบว่ารายการใด ๆ เป็นจริง ( d) ตามฟังก์ชั่นjดั้งเดิม( )

is input prime AND is any ±2 neighbor primeการส่งออกโดยนัยของผลบูลของ


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