การเพิ่มพาร์ติชัน Goldbach


9

การคาดคะเนของ Goldbach ระบุว่า:

ทุกเลขคู่ที่มากกว่า 2 คือผลรวมของสองช่วง

เราจะพิจารณาพาร์ทิชัน Goldbach ของจำนวนnจะเป็นคู่ของทั้งสองช่วงเวลาการเพิ่มn เรามีความกังวลกับตัวเลขคือการเพิ่มขึ้นของพาร์ทิชัน Goldbach เราทำการวัดขนาดของพาร์ติชั่น Goldbach ของตัวเลขด้วยขนาดของไพรม์ที่เล็กที่สุดในพาร์ติชันของตัวเลขนั้นทั้งหมด จำนวนคือการเพิ่มพาร์ติชันถ้าขนาดนี้มากกว่าขนาดของตัวเลขที่เล็กกว่าทั้งหมด

งาน

รับจำนวนเต็มคู่n> 2พิจารณาว่าnเป็นการเพิ่มพาร์ติชัน Goldbach และส่งออกค่าที่ไม่ซ้ำกันสองค่าหนึ่งค่าถ้าเป็นและหนึ่งค่าหากไม่ได้

นี่คือ ดังนั้นคุณควรตั้งเป้าหมายที่จะลดจำนวนไบต์ลงในซอร์สโค้ดของคุณ

OEIS A025018


ขอให้เรายังคงอภิปรายนี้ในการแชท
Ad Hoc Garf Hunter

เป็นคำถามที่ดีที่เข้าใจยาก ฉันแก้ไขมันเพื่อลดความซับซ้อนของถ้อยคำ โปรดตรวจสอบและถ้าทั้งหมดถูกต้องใช้การเปลี่ยนแปลง
ЕвгенийНовиков

1
@ ЕвгенийНовиковฉันพบว่าการแก้ไขของคุณสับสนมากกว่าเดิม ฉันได้ปฏิเสธมัน บางทีเราสามารถพูดคุยวิธีที่จะทำให้เรื่องนี้ชัดเจนที่นี่
Ad Hoc Garf Hunter

ตัวอย่างการทำงานยังคงสับสนอยู่มาก - ดูเหมือนว่าจะดึงตัวเลขออกจากที่ใดก็ได้และการเปรียบเทียบแต่ละรายการจะแสดงต่างกันโดยไม่อธิบายว่าเหตุใดจึงใช้ตัวเลขบางตัว หากคุณรู้คำตอบแล้วคุณสามารถค้นหาคำตอบได้ . . ซึ่งฉันทำโดยกลับไปที่ย่อหน้าแรกโดยไม่สนใจตัวอย่างจนกว่าจะชัดเจนจากนั้นจึงหาวิธีสร้างตัวอย่าง บางทีโครงสร้างตารางบางอย่างอาจช่วยได้รวมถึง 10 อาจช่วยได้
Neil Slater

@ NeilSlater ขอบคุณสำหรับความคิดเห็น ฉันลบตัวอย่างทั้งหมดเพราะฉันคิดว่าพวกเขาทำอันตรายมากกว่าดี ฉันคิดว่าความท้าทายชัดเจนจากคำอธิบายและตัวอย่างก็มี แต่สิ่งที่ซับซ้อนเท่านั้น หากคำอธิบายไม่เพียงพอฉันยินดีที่จะขยายหรืออธิบายให้ชัดเจนยิ่งขึ้นอย่างไรก็ตามฉันไม่คิดว่าฉันจะเพิ่มตัวอย่างกลับมาเพราะพวกเขาดูเหมือนจะเป็นแหล่งที่มาของความสับสนที่ยิ่งใหญ่ที่สุด
Ad Hoc Garf Hunter

คำตอบ:


5

เยลลี่ 12 ไบต์

ÆRðfạṂ
Ç€M⁼W

ลองออนไลน์!

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

Ç€M⁼W   Main link. Argument: n

Ç€      Map the helper link over [1, ..., n].
  M     Get all indices of the maximum.
    W   Wrap; yield [n].
   ⁼    Test the results to both sides for equality.


ÆRðfạṂ  Helper link. Argument: k

ÆR      Prime range; get all primes in R := [1, ..., k].
  ð     Begin a dyadic chain with arguments R and k.
    ạ   Absolute difference; yield k-p for each p in R.
   f    Filter; keep the q in R such that q = k-p for some p in R.
     Ṃ  Take the minimum.
        This yields 0 if the array is empty.

4

PHP , 154 ไบต์

for(;$n++<$a=$argn;$i-1?:$p[]=$n)for($i=$n;--$i&&$n%$i;);foreach($p as$x)foreach($p as$y)if(!$r[$z=$x+$y]){$r[$z]=$x;$l[]=$z<$a?$x:0;};echo$r[$a]>max($l);

ลองออนไลน์!

ขยาย

for(;$n++<$a=$argn;$i-1?:$p[]=$n) # loop through all integers till input if is prime add to array 
  for($i=$n;--$i&&$n%$i;);
foreach($p as$x) #loop through prime array
  foreach($p as$y) #loop through prime array 
    if(!$r[$z=$x+$y]){
      $r[$z]=$x; # add only one time lower value for a sum of $x+$y 
      $l[]=$z<$a?$x:0;}; # add lower value if sum is lower then input
echo$r[$a]>max($l); # Output 1 if lower value for sum of input is greater then all lower values of all numbers under input

ลองออนไลน์! ตรวจสอบหมายเลขทั้งหมดจนถึง 1,000


3

JavaScript (ES6), 135 ไบต์

ใช้ตรรกะที่คล้ายกันเป็นคำตอบของ PHP Jörg

(n,P=[...Array(n).keys()].filter(n=>(p=n=>n%--x?p(n):x==1)(x=n)))=>P.map(p=>P.map(q=>a[q+=p]=a[q]||(m=q<n&&p>m?p:m,p)),a=[m=0])&&a[n]>m

การสาธิต


2

Python 3: 156 151 142 138 136 128 ไบต์

r=range
m=lambda n:min(x for x in r(2,n+1)if all(o%i for o in[x,n-x]for i in r(2,o)))
f=lambda n:m(n)>max(map(m,r(2,n,2)))or n<5

(ขอบคุณ OP)

(ขอบคุณ @Rod) (อีกครั้ง) (และอีกครั้ง)


@Ommmman คุณชอบมัน?
enedil

@Rod เนื่องจากmaxองค์ประกอบการส่งคืนคีย์มีค่าสูงสุดหลังจากใช้คีย์ฉันต้องเพิ่มแอปพลิเคชันฟังก์ชั่น แต่มันก็สั้นกว่า
enedil

@Rod และผมก็ไม่สามารถใช้คำแนะนำของคุณสำหรับrangeตั้งแต่อยู่ภายในขอบเขตn lambda
enedil

@enedil แน่นอน แต่สำหรับจำนวนสูงสุดคุณสามารถใช้max(map(m,r[::2]))
Rod

1
คุณไม่จำเป็นต้องไปที่ชื่อfและทำให้สามารถประหยัด 2 f=ไบต์โดยการเอา
Ad Hoc Garf Hunter

1

Python 3: 204 196 ไบต์

ไบต์ที่บันทึกไว้ต้องขอบคุณ: Olm Man

from itertools import*
m=lambda g:min([x for x in product([n for n in range(2,g)if all(n%i for i in range(2,n))],repeat=2)if sum(x)==g][0])
i=lambda g:1if all(m(g)>m(x)for x in range(4,g,2))else 0

ลองออนไลน์!


2
เคล็ดลับเล็ก ๆ น้อย ๆ ฟังก์ชั่นที่มีอยู่ภายในส่วนใหญ่เช่นminและallสามารถใช้กำเนิดเป็นอาร์กิวเมนต์หมายความว่าmin([...])สามารถย่อmin(...)และเหมือนกันได้ทั้งหมด นอกจากนี้คุณยังสามารถกำจัดช่องว่างบางอย่างโดยเฉพาะอย่างยิ่งพื้นที่ในimport *และช่องว่างใด ๆ หลังจากวงเล็บปีกกาฉันเห็นคุณมีหนึ่งหลังrange(g)และหนึ่งก่อนมา[i for i in ...ไม่จำเป็น
Ad Hoc Garf Hunter

^ มันยอดเยี่ยมฉันไม่รู้ว่า
งงงวย

นอกจากนี้คุณสามารถตรวจสอบนายกของคุณสั้นลงเล็กน้อยโดยการเปลี่ยนเป็นall(n%i for i in range(2,g))แต่คุณต้องเปลี่ยนrange(g)ไปrange(1,g)เพราะสิ่งนี้จะให้ผลบวกที่ผิดพลาดในวันที่ 1
Ad Hoc Garf Hunter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.