มันเป็นนายกที่อ่อนแอหรือไม่?


26

ไพร์มนั้นอ่อนแอถ้าไพร์มที่ใกล้เคียงที่สุดนั้นเล็กกว่ามัน หากมีการผูกที่สำคัญไม่ได้อ่อนแอ

ตัวอย่างเช่น73เป็นนายกที่อ่อนแอเพราะ71เป็นนายกรัฐมนตรี แต่75เป็นคอมโพสิต

งาน

เขียนรหัสคอมพิวเตอร์บางตัวที่ให้ค่านายกมากกว่า2เป็นค่าอินพุตจะเป็นตัวตัดสินว่ามันเป็นรหัสเฉพาะ นี่เป็นมาตรฐานดังนั้นคุณควรส่งออกค่าที่ไม่ซ้ำกันสองค่าสำหรับแต่ละสองกรณี (เช่นweakและnot weak)

นี่คือเพื่อใช้กฎมาตรฐานสำหรับแท็ก

OEIS

นี่คือ 47 ช่วงเวลาที่อ่อนแอครั้งแรก:

3, 7, 13, 19, 23, 31, 43, 47, 61, 73, 83, 89, 103, 109, 113, 131, 139, 151, 167, 181, 193, 199, 229, 233, 241, 271, 283, 293, 313, 317, 337, 349, 353, 359, 383, 389, 401, 409, 421, 433, 443, 449, 463, 467, 491, 503, 509, 523, 547, 571, 577, 601, 619, 643, 647

นี่คือ OEIS สำหรับช่วงเวลาที่อ่อนแอ (ควรกลับมาweak) OEIS A051635

นี่คือ OEIS สำหรับช่วงเวลาที่สมดุล (ควรกลับมาnot weak) OEIS A006562

นี่คือ OEIS สำหรับช่วงเวลาที่แข็งแกร่ง (ควรกลับมาnot weak) OEIS A051634


not weakหรือstrong?
CalculatorFeline

7
@CalculatorFeline ไม่อ่อนแอต่างจาก strong
Wheat Wizard

คำตอบ:


26

เยลลี่ขนาด 7 ไบต์

Æn+Æp>Ḥ

ลองออนไลน์!

คำอธิบาย

           See if
Æn         the next prime
  +Æp      plus the previous prime
     >Ḥ    is greater than 2n

เป็นโบนัสที่เปลี่ยนแปลง>ไป =หรือ<การตรวจสอบสำหรับช่วงเวลาที่มีความสมดุลและแข็งแรงตามลำดับ


มันควรจะเป็นอย่าง>นั้นหรือ
Dennis

2
โอ้ว้าวนั่นเป็นคนฉลาด ...
ETHproductions

ฉันเพิ่งหาวิธีนี้เช่นกัน เยี่ยมมาก!
Jonathan Allan

มันช่างฉลาดเหลือเกิน ...
Erik the Outgolfer

12

Mathematica ขนาด 24 ไบต์

n=NextPrime;2#+n@-#<n@#&

NextPrimeในตัวสามารถ (AB?) ใช้ในการคำนวณที่สำคัญก่อนหน้านี้โดยการให้อาหารมันโต้แย้งเชิงลบ


6

เยลลี่ขนาด 9 ไบต์

ḤÆRạÞ⁸ḊḢ>

ผลตอบแทน1สำหรับอ่อนแอและ0ไม่อ่อนแอหรือสมดุล (ผลตอบแทน1สำหรับการป้อนข้อมูลของ2)

ลองออนไลน์!

อย่างไร?

ḤÆRạÞ⁸ḊḢ> - Link: prime number > 2, p
Ḥ         - double -> 2*p
 ÆR       - yield primes between 2 and 2*p inclusive
     ⁸    - chain's left argument, p
    Þ     - sort by:
   ạ      -   absolute difference (i.e. distance from p)
      Ḋ   - dequeue (removes p from the list, since it has distance zero)
       Ḣ  - head (gives us the nearest, if two the smallest of the two)
        > - greater than p?

Ninja'd ฉันด้วยวิธีแก้ปัญหาที่ซับซ้อน ...
Erik the Outgolfer

มันเป็นเสี้ยววินาที!
Jonathan Allan

1
ไม่มันไม่ใช่มันเป็น 9 วินาทีเต็ม iirc ไม่ 10 วินาที
Erik the Outgolfer

ดังนั้นมันเป็น (ดูเวลา) มันเกิดขึ้นตามที่ฉันส่งมาที่นี่ :)
Jonathan Allan

1
ดีดูเหมือนว่าคุณเพียงแค่แข็งแรงเล่นกอล์ฟเร็วกว่าฉัน ... (มันค่อนข้างจะเดินทางไปก่อนจากIIṠ⁼1การII>0ไปI<\) ... คุณคือแม้ว่าจะแตกต่างกันมาก ดูเหมือนว่าคุณจะคิดแตกต่างจากฉัน ... แก้ไข: Pietu1998 กลับมาแล้ว!
Erik the Outgolfer


3

อ็อกเทฟ93 93ไบต์

ขอบคุณ @LuisMendo และ @ rahnema1 สำหรับการบันทึกไบต์!

function r=f(x);i=j=x;do--i;until(i<1|isprime(i));do++j;until(isprime(j));r=x-i<j-x;

ลองออนไลน์!


คุณไม่สามารถใช้i-=1ฯลฯ ได้หรือ นอกจากนี้ยังendไม่จำเป็นในฟังก์ชั่น; คุณสามารถย้ายไปยังส่วนท้าย
Luis Mendo



3

GNU APL 1.2, 78 ไบต์

∇f N
X←(R←(~R∊R∘.×R)/R←1↓⍳N×2)⍳N
(|R[X-1]-N)<|R[X+1]-N
∇

∇f N ประกาศฟังก์ชั่นที่จะโต้แย้ง

(~R∊R∘.×R)/R←1↓⍳N×2แสดงรายการช่วงเวลาทั้งหมดตั้งแต่ 2 ถึงสองครั้ง ฉันสมมติว่านายกถัดไปนั้นน้อยกว่าต้นฉบับสองเท่า หากสิ่งนี้ไม่จริงN*2ให้ N กำลังสองและใช้จำนวนไบต์เท่ากัน (หวังว่ามันจะใหญ่พอที่จะเกินไพรม์ถัดไป) (ดูคำอธิบายของวิกิพีเดียสำหรับวิธีการค้นพบที่สำคัญ)

X←(R←(...))⍳Nกำหนดว่ารายการเวกเตอร์R(แทนที่เนื้อหาเดิม) พบว่าดัชนีของนายกเดิมในรายการที่แล้วกำหนดว่าดัชนีNX

|R[X-1]-Nคำนวณความแตกต่างระหว่างไพรม์ก่อนหน้า (เนื่องจากRมีจำนวนเฉพาะX-1องค์ประกอบ th คือไพร์มก่อนหน้าN) Nจากนั้นรับค่าสัมบูรณ์ (APL ทำงานจากขวาไปซ้าย)

|R[X+1]-N ทำเช่นเดียวกัน แต่สำหรับนายกต่อไป

(|R[X-1]-N)<|R[X+1]-Nพิมพ์ 1 ถ้านายกก่อนหน้านั้นใกล้เคียงกับต้นฉบับมากกว่านายกรัฐมนตรีถัดไปและ 0 เป็นอย่างอื่น ต้องใช้วงเล็บในการมาก่อน

สิ้นสุดฟังก์ชั่น




2

Perl 6 , 41 ไบต์

{[>] map ->\n{$_+n,*+n...&is-prime},1,-1}

ลองออนไลน์!

$_เป็นอาร์กิวเมนต์ของฟังก์ชัน ฟังก์ชั่นการทำแผนที่-> \n { $_ + n, * + n ... &is-prime }ใช้ตัวเลขnและส่งกลับลำดับของตัวเลข$_ + n, $_ + 2*n, ...ที่สิ้นสุดลงเมื่อถึงจำนวนเฉพาะ การแม็พฟังก์ชันนี้กับตัวเลขสองตัว1และ-1สร้างลำดับของสองซีเควนซ์ เริ่มแรกที่มี$_ + 1และจบลงด้วยมากกว่าจำนวนครั้งแรกที่สำคัญกว่า$_และจะเริ่มต้นที่สองกับและจบลงด้วยจำนวนครั้งแรกที่สำคัญน้อยกว่า $_ - 1 ลดรายการองค์ประกอบสองรายการนี้ด้วยโอเปอเรเตอร์ที่ยิ่งใหญ่กว่าคืนค่าจริงหากลำดับแรกมากกว่า (เช่นนานกว่า) ที่สอง$_[>]


2

Python 2.7 - 120 ไบต์

from math import*
i=lambda x:factorial(x-1)%x==x-1
def f(n,c):return 1 if i(n-c)>i(n+c) else 0 if i(n+c)>0 else f(n,c+1)

เนื่องจากไพ ธ อนไม่มีฟังก์ชั่นที่ดีเยี่ยมเราสามารถใช้ทฤษฎีบทของวิลสันเพื่อให้ได้ตัวตรวจสอบระยะสั้นที่ดี ทฤษฎีบทของวิลสันกล่าวว่าตัวเลขนั้นมีค่าเฉพาะถ้า (n-1) เท่านั้น! สอดคล้องกับ -1 mod (n) ดังนั้นฟังก์ชันฉันจะคืนค่า 1 ถ้าจำนวนนั้นเป็นจำนวนเฉพาะและ 0 ถ้าไม่ใช่ หลังจากนั้นฟังก์ชั่น f จะกำหนดว่าจะให้ไพรม์ถัดไปจากจำนวนนั้นเกิดขึ้นก่อนหรือไม่เมื่อเพิ่มค่าลงแทนที่จะเพิ่มค่าขึ้น หากไม่มีตัวเลขที่เพิ่มขึ้นเฉพาะค่าใด ๆ มันจะถูกเรียกซ้ำอีกครั้ง

ตัวอย่างบางส่วนของ I / O

f(3,1)
1
f(15,1)
0

2

Python 2 , 122 108 103 94 92 ไบต์

def a(n):
 r=[2];x=2
 while r[-1]<=n:x+=1;r+=[x]*all(x%i for i in r)
 return sum(r[-3:])>3*n

ลองออนไลน์!

ใช้ความคิดของ Pietu ... จากนั้นบันทึก 28 ไบต์ด้วยการเล่นซ้ำตัวทำรายการที่สั้นกว่า จากนั้นอีก 2 รายการโดยแทนที่-3*n>0ด้วย>3*n(d'oh!)


2

Regex (รสชาติส่วนใหญ่) 47 ไบต์

^(?=(x*)(?!(x+)(\2\2x)+$)\1)x+(?!(xx+)\4+$)\1\1

ลองออนไลน์!

ใช้อินพุตเป็น unary แสดงผลลัพธ์การจับคู่สำหรับช่วงเวลาที่อ่อนแอไม่มีการจับคู่สำหรับช่วงเวลาที่ไม่อ่อนแอ ทำงานใน ECMAScript, Perl, PCRE, Python, Ruby

คำอธิบาย:

ให้ N เป็นอินพุท A ไพรม์ที่ใกล้เคียงที่สุด <N และ B ไพรม์ใกล้เคียงที่สุด> N ความยากลำบากหลักของวิธีการ regex ต่อความท้าทายนี้คือเราไม่สามารถแทนตัวเลขที่มากกว่าอินพุทเช่น B แทนเราได้ หา b ที่เล็กที่สุดซึ่ง 2b + 1 เป็นไพร์มและ 2b + 1> N ซึ่งทำให้แน่ใจว่า 2b + 1 = B

(?=
  (x*)              # \1 = N - b, tail = b
  (?!(x+)(\2\2x)+$) # Assert 2b + 1 is prime
  \1                # Assert b ≥ \1 (and thus 2b + 1 > N)
)

จากนั้นโปรดทราบว่าเราไม่จำเป็นต้องค้นหา A. ตราบใดที่นายก <N ใกล้กับ N มากกว่า B, N เป็นนายกรัฐมนตรีที่อ่อนแอ

x+                  # tail iterates over integers < N
(?!(xx+)\4+$)       # assert tail is prime
\1\1                # assert tail ≥ 2 * \1 (and thus tail + B > 2N)


1

JavaScript ES6, 162 154 ไบต์

8 ไบต์บันทึกโดยใช้กลอุบายของJörgHülsermann "ไม่ต้องพิมพ์อะไรเลยในกรณีเดียว" ไม่จำเป็นต้อง?"Y":"N"หลังจากone<two

var isWeak=

a=>{p=[2];i=0;f=d=>{j=p[i];l:while(j++){for(x=0;p[x]*p[x]<=j;x++){if(j%p[x]==0){continue l}}return p[++i]=j}};while(p[i]<a+1){f()};return a*2<p[i]+p[i-2]}

[43,//true
53,//false
7901,//false
7907,//true
1299853,//true
1299869//false
].forEach(n=>{console.log(n,isWeak(n))})




0

JavaScript, 98 ไบต์

let test = _=>(o.innerHTML=f(+prime.value))
let f= 

n=>{P=n=>{for(i=n,p=1;--i>1;)p=p&&n%i};a=b=n;for(p=0;!p;P(--a));for(p=0;!p;P(++b));return n-a<b-n}
Enter Prime: <input id="prime">
<button type="button" onclick="test()">test if weak</button>
<pre id="o"></pre>

Golphed น้อย

n=>{
   P=  // is a Prime greater than 1, result in p
       n=>{
           for(i=n,p=1;--i>1;)
               p=p&&n%i
       };

   a=b=n; // initialize lower and upper primes to n
   for(p=0;!p;P(--a)); // find lower,
   for(p=0;!p;P(++b)); // find upper,
   return n-a<b-n // is weak result
}

หมายเหตุรหัสทดสอบไม่ได้ตรวจสอบอินพุต "prime" ว่าจริงแล้วเป็น prime


0

braingasm , 23 22 ไบต์

พิมพ์1สำหรับช่วงเวลาที่อ่อนแอและ0ไม่อ่อนแอ

;>0$+L[->+>2[>q[#:Q]]]

เกมส์:

;                       Read a number to cell 0
 >0$+                   Go to cell 1 and copy the value of cell 0
     L                  Make the tape wrap around after cell 1
      [              ]  Loop:
       ->+>               Decrease cell 1 and increase cell 0
           2[       ]     Twice do:
             >              Go to the other cell
              q[   ]        If it's prime:
                #:Q         Print the current cell number and quit


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