หมายเลขของฉันเป็นหมายเลข de Polignac หรือไม่


21

ตัวเลขคือหมายเลข de Polignac ถ้าหากว่าเป็นเลขคี่และไม่สามารถแสดงในรูปแบบp + 2 nโดยที่nเป็นจำนวนเต็มไม่เป็นลบและpเป็นจำนวนเต็มเฉพาะ

งาน

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

กรณีทดสอบ

สำหรับกรณีที่เป็นบวกนี่คือ OEIS

1, 127, 149, 251, 331, 337, 373, 509, 599, 701, 757, 809, 877, 905, 907, 959, 977, 997, 1019, 1087, 1199, 1207, 1211, 1243, 1259, 1271, 1477, 1529, 1541, 1549, 1589, 1597, 1619, 1649, 1657, 1719, 1759, 1777, 1783, 1807, 1829, 1859, 1867, 1927, 1969, 1973, ...

นี่คือกรณีเชิงลบบางส่วน:

22, 57

เราสามารถมีเอาท์พุทที่เป็นความจริงและเป็นเท็จแทนที่จะเป็นเอาท์พุทที่แตกต่างกันสองแบบได้หรือไม่?
Okx

@ อ็อกซ์ฉันจะบอกว่าไม่
ข้าวสาลีตัวช่วยสร้าง

ขอให้เรายังคงอภิปรายนี้ในการแชท
ข้าวสาลีตัวช่วยสร้าง

เอ่อ ... สำหรับกรณีลบมันเป็นจำนวนที่ไม่ได้อยู่ใน OEIS ใช่มั้ย ทำให้แน่ใจว่าฉันไม่พลาดสิ่งที่ชัดเจน
Magic Octopus Urn

@MagicOctopusUrn ใช่
ข้าวสาลี Wizard

คำตอบ:


11

Japt , 9 14 13 ไบต์

o!²mnU dj |Uv

ทดสอบออนไลน์! หรือพบ integers Polignac ทั้งหมด de ภายใต้ 1000

เอาต์พุต1สำหรับอินพุตที่ผิดพลาดและ0สำหรับความจริง

คำอธิบาย

 o!²  mnU dj |Uv
Uo!p2 mnU dj |Uv  : Ungolfed
                  : Implicit: U = input integer (e.g. 9)
Uo                : Create the range [0..U), and map each item X to
  !p2             :   2 ** X.               [1, 2, 4, 8, 16, 32, 64, 128, 256]
      m           : Map each of these powers of 2 by
       nU         :   subtracting from U.   [8, 7, 5, 1, -7, -23, -57, -119, -247]
          d       : Return whether any item in the result is
           j      :   prime.                (5 and 7 are, so `true`)
             |    : Take the bitwise OR of this and
              Uv  :   U is divisble by (missing argument = 2).
                  : This gives 1 if U cannot be represented as p + 2^n or if U is even.
                  : Implicit: output result of last expression

ดูเหมือนว่าจะให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับ 2 & 3; มันกลับมาแล้วfalseแต่พวกมันไม่ใช่หมายเลข Polignac
Shaggy

@Shaggy 3ได้รับการแก้ไขแล้ว แต่เราไม่จำเป็นต้องจัดการแม้แต่ในตอนแรก แก้ไข
ETHproductions

@Shaggy แก้ไขแล้ว
ETHproductions

ฉันกำลังจะบอกว่ามันเป็นสิ่งที่ดีการแก้ไข3ไม่ได้มีค่าไบต์ใด ๆ จากนั้นฉันเห็นการแก้ไขสำหรับ2- อุ๊ย!
Shaggy

: O +1 สำหรับโปรแกรมการแข่งขันที่ดูเหมือนข้อผิดพลาดในการเข้ารหัส
Downgoat

8

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

บันทึกแล้ว 1 ไบต์ขอบคุณ @Dennis

Ḷ2*³_ÆPS<Ḃ

ลองออนไลน์!

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

Ḷ2*³_ÆPS<Ḃ   Main link. Argument: n (integer)
Ḷ            Lowered range; yield [0, 1, 2, ..., n-1].
 2*          Reversed exponentiation with 2; yield [1, 2, 4, ..., 2**(n-1)].
   ³_        Reversed subtraction with the input; yield [n-1, n-2, n-4, ..., n-2**(n-1)].
     ÆP      Replace each item with 1 if it is prime, 0 otherwise.
       S     Sum; yield a positive integer if any item was prime, 0 otherwise.
         Ḃ   Yield n % 2.
        <    Yield 1 if the sum is less than n % 2, 0 otherwise.
             This yields 1 if and only if the sum is 0 and n is odd.

Ḷ2*⁸_ÆPS<Ḃ บันทึกเป็นไบต์ tio.run/##ASQA2/9qZWxsef//4bi2Mirigbhfw4ZQUzzhuIL/…
Dennis

@Dennis ขอบคุณฉันรู้ว่ามีคนที่จะเป็นทางเลือกที่ 3 ¬;ḂẠไบต์ S<Ḃเป็นวิธีนอกกรอบอย่างน้อยสำหรับฉัน :-)
ETHproductions

8

JavaScript (ES6),  56 54  53 ไบต์

ผลตอบแทน0หรือ11

f=(n,p=1,x=y=n-p)=>n>p?y%--x?f(n,p,x):x!=1&f(n,p*2):n

ลองออนไลน์!

อย่างไร?

เราเริ่มต้นด้วยp=1 1 เราทดสอบว่าy=npเป็นคอมโพสิตหรือไม่และให้บูลีนตามลำดับ การทดสอบครั้งต่อไปจะดำเนินการด้วยp×2 2

ทันทีที่pมีค่ามากกว่าnเราหยุดการเรียกซ้ำและผลตอบแทนnn

ผลที่ได้จากการทำซ้ำทั้งหมดจะ AND'd กันบีบบังคับค่าบูลีนทั้ง0หรือ11

โดยมีเงื่อนไขว่าผลลัพธ์ระดับกลางทั้งหมดเป็นความจริงเราสิ้นสุดด้วยการทดสอบระดับบิตเช่น:

1 & 1 & 1 & n

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


3
เทคนิคที่ยอดเยี่ยม อาจเป็นคำตอบเดียวที่ถูกต้องซึ่งไม่ได้พูดอย่างชัดเจนn%2หรือคล้ายกัน: P
ETHproductions

สิ่งนี้มีค่าลบที่ผิดพลาดสำหรับหมายเลขเดอ Polignac ของแบบฟอร์ม 2 ^ M + 1 เช่น 262145 และ 2097153 (หมายเลขต่อมาคือ 4722366482869645213697, 3868562622766813359059763348685585648533649633933903376333333336335336335 มันไม่ใช่ความใหญ่โตของตัวเลขที่เป็นปัญหาเนื่องจากมันระบุ 262139, 262259, 2097131 และ 2097187 อย่างถูกต้อง แน่นอนว่าเนื่องจากการเรียกซ้ำฉันต้องขยายขนาดสแต็กเป็นสิ่งที่ใหญ่มากเพื่อทดสอบและทดสอบเฉพาะช่วงรอบสองหมายเลข 2 ^ M + 1 de Polignac ที่กล่าวไว้ข้างต้น
Deadcode

1
@Deadcode ขอบคุณที่รายงานสิ่งนี้ แก้ไขแล้ว
Arnauld

1
@Arnauld Ah, คุณพูดถูก :) แค่เพื่อให้แน่ใจว่าฉันทำอย่างนี้และแน่ใจว่ามันคงที่
Deadcode

1
@ รหัสเรียบร้อยเรียบร้อย! :)
Arnauld

7

Python 2 , 60 57 56 ไบต์

f=lambda n,k=1,p=-1:k/n or(n-k&n-k-p%k>0)&n&f(n,k+1,p*k)

ลองออนไลน์!


ว้าวนี่มันไม่มีประสิทธิภาพอย่างน่าประทับใจ ทดสอบนายกรัฐมนตรีผ่านทฤษฎีบทของวิลสัน ในด้านบวกมันทำงานอย่างถูกต้องสำหรับ 262145 และ 2097153 (สมมติว่าสแต็คไม่ จำกัด และขนาด Bignum); การส่งอื่น ๆ บางรายการไม่ มันคือนายกอัตราผลตอบแทนขั้นตอนวิธีการ "truthy" 4 เพราะ (-6)% 4 = 2 &n&แต่ปลายนี้ไม่เป็นปัญหาเพราะแม้ตัวเลขจะถูกปฏิเสธโดย หมายเลข 5 จะเป็นค่าลบปลอมถ้าเป็นหมายเลข de Polignac เนื่องจาก 1 + 4 = 5 แต่นี่ไม่ใช่ปัญหาเพราะ 2 + 3 = 5 อยู่ดี
Deadcode

7

เยลลี่ 10 ไบต์

อีกทางเลือกหนึ่งส่ง 10- วุ้นเยลลี่ที่โพสต์แล้ว

_ÆRBS€’×ḂẠ

ลิงก์ monadic ส่งคืน1สำหรับหมายเลข de Polignac และ0มิฉะนั้น

ลองออนไลน์! หรือดูที่อยู่ภายใต้ 1000

อย่างไร?

_ÆRBS€’×ḂẠ - Link: number, n  e.g.  1    3      5                  6                   127
 ÆR        - prime range            []   [2]    [2,3,5]            [2,3,5]             [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
_          - subtract from n        []   [1]    [3,2,0]            [4,3,1]             [125,124,122,120,116,114,110,108,104,98,96,90,86,84,80,74,68,66,60,56,54,48,44,38,30,26,24,20,18,14,0]
   B       - convert to binary      []   [[1]]  [[1,1],[1,0],[0]]  [[1,0,0],[1,1],[1]  [[1,1,1,1,1,0,1],[1,1,1,1,1,0,0],[1,1,1,1,0,1,0],[1,1,1,1,0,0,0],[1,1,1,0,1,0,0],[1,1,1,0,0,1,0],[1,1,0,1,1,1,0],[1,1,0,1,1,0,0],[1,1,0,1,0,0,0],[1,1,0,0,0,1,0],[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[1,0,1,0,1,1,0],[1,0,1,0,1,0,0],[1,0,1,0,0,0,0],[1,0,0,1,0,1,0],[1,0,0,0,1,0,0],[1,0,0,0,0,1,0],[1,1,1,1,0,0],[1,1,1,0,0,0],[1,1,0,1,1,0],[1,1,0,0,0,0],[1,0,1,1,0,0],[1,0,0,1,1,0],[1,1,1,1,0],[1,1,0,1,0],[1,1,0,0,0],[1,0,1,0,0],[1,0,0,1,0],[1,1,1,0],0]
    S€     - sum €ach               []   [1]    [2,1,0]            [1,2,1]             [6,5,5,4,4,4,5,4,3,3,2,4,4,3,2,3,2,2,4,3,4,2,3,3,4,3,2,2,2,3,0]
      ’    - decrement              []   [0]    [1,0,-1]           [0,1,0]             [5,4,4,3,3,3,4,3,2,2,1,3,3,2,1,2,1,1,3,2,3,1,2,2,3,2,1,1,1,2,-1]
        Ḃ  - n mod 2                1    1      1                  0                   1
       ×   - multiply               []   [0]    [1,0,-1]           [0,0,0]             [5,4,4,3,3,3,4,3,2,2,1,3,3,2,1,2,1,1,3,2,3,1,2,2,3,2,1,1,1,2,-1]
         Ạ - all truthy?            1    0      0                  0                   1

พาฉันไปประมาณ 10 นาทีเพื่อทำความเข้าใจวิธีการทำงาน ... เทคนิคที่ยอดเยี่ยมฉันไม่สามารถคิดวิธีที่ดีในการตรวจสอบว่าอาร์เรย์ไม่มีพลังของสอง :-)
ETHproductions

7

05AB1E , 9 8 ไบต์

-1 ไบต์ต้องขอบคุณ Emigna

Ýo-pZ¹È~

เอาต์พุต0สำหรับอินพุตที่เป็นความจริงและ1สำหรับอินพุตที่เป็นเท็จ

ลองออนไลน์!


Zอาจจะเป็น
Emigna

@Emigna Ah ฉันรู้ว่ามีทางเลือก 1 ไบต์กับสิ่งนั้น!
Okx

6

Python 2 , 99 ไบต์

lambda n:n&1-any(n-2**k>1and all((n-2**k)%j for j in range(2,n-2**k))for k in range(len(bin(n))-2))

ลองออนไลน์!

-4 ไบต์ขอบคุณ Leaky Nun

-2 ไบต์ต้องขอบคุณ Wondercricket

+8 ไบต์เพื่อแก้ไขข้อผิดพลาด

-1 ไบต์ขอบคุณ Mr. Xcoder

-3 ไบต์ขอบคุณ Einkorn Enchanter

+12 ไบต์เพื่อแก้ไขข้อผิดพลาด


ฉันคิดว่านี่เป็นคำตอบที่เข้ากันได้กับ Python 3 หรือไม่
Ari Cooper-Davis

สิ่งนี้มีค่าลบเท็จสำหรับ 1 และสำหรับหมายเลขเดอ Polignac ของแบบฟอร์ม 2 ^ M + 1 เช่น 262145 และ 2097153, เป็นต้นไป มันไม่ใช่ความใหญ่โตของตัวเลขที่เป็นปัญหาเนื่องจากมันระบุ 262139, 262259, 2097131 และ 2097187 อย่างถูกต้อง
Deadcode

1
@ รหัสตรวจสอบที่ชัดเจนเพื่อให้แน่ใจว่า "สำคัญ" ไม่ใช่ 1; ควรทำงานตอนนี้
HyperNeutrino

6

Regex (ECMAScript), 97 ไบต์

ปัญหานี้ทำให้เกิดกรณีที่น่าสนใจสำหรับการแก้ไขปัญหาการขาด lookahead ที่ไม่ใช่อะตอม และมันก็เป็นเพียงครั้งเดียวที่ฉันมีเหตุผลที่ดีที่จะทดสอบทั้ง 2 รุ่น((x+)(?=\2$))*x$และ(?!(x(xx)+)\1*$)ใน regex เดียวกันและในครั้งเดียวจนถึงตอนนี้ฉันจำเป็นต้องปกป้องการทดสอบที่สำคัญจากการจับคู่ 1 เช่น(?!(xx+)\1+$)xxเมื่อใช้ใน regex ขนาดใหญ่

^(?!(xx)*$|(x+)((?!(xx+)\4+$).*(?=\2$)((x+)(?=\6$))*x$|(?!(x(xx)+)\7*$).*(?=\2$)(?!(xx+)\9+$)xx))

ลองออนไลน์!

# For the purposes of these comments, the input number = N.
^
# Assert that N is not the sum of a prime number and a power of 2.
(?!
    (xx)*$                 # Assert that N is odd.
|
    # Since we must cycle through all values for a number X and a corresponding number
    # N-X, this cannot be in an atomic lookahead. The problem then becomes that it
    # consumes characters. Thus we must let X be the larger of the two and N-X be the
    # smaller, and do tests on X followed by tests on N-X. We can't just test X for
    # being prime and N-X for being a power of 2, nor vice versa, because either one
    # could be smaller or larger. Thus, we must test X for being either prime or a
    # power of 2, and if it matches as being one of those two, do the opposite test on
    # N-X.
    # Note that the prime test used below, of the form (?!(xx+)\2+$), has a false match
    # for 0 and 1 being prime. The 0 match is harmless for our purposes, because it
    # will only result in a match for N being a power of 2 itself, thus rejecting
    # powers of 2 as being de Polignac numbers, but since we already require that N is
    # odd, we're already rejecting powers of 2 implicitly. However, the 1 match would
    # break the robustness of this test. There can be de Polignac numbers of the form
    # 2^M+1, for example 262145 and 2097153. So we must discard the 1 match by changing
    # the prime test to "(?!(xx+)\2+$)xx". We only need to do this on the N-X test,
    # though, because as X is the larger number, it is already guaranteed not to be 1.
    (x+)           # \2 = N-X = Smaller number to test for being prime or a power of 2;
                   # tail = X = larger number to test for being prime or a power of 2.
    (
        (?!(xx+)\4+$)      # Test X for being prime.
        .*(?=\2$)          # tail = N-X
        ((x+)(?=\6$))*x$   # Test N-X for being a power of 2. Use the positive version
                           # since it's faster and doesn't have a false match of 0.
    |
        (?!(x(xx)+)\7*$)   # Test X for being a power of 2. Use the negative version
                           # because the testing of X has to be in a lookahead, and
                           # putting the positive version in a positive lookahead would
                           # be worse golf. It doesn't matter that this can have a false
                           # match of 0, because X is guaranteed never to be 0.
        .*(?=\2$)          # tail = N-X
        (?!(xx+)\9+$)xx    # Test N-X for being prime. We must prevent a false match of
                           # 1 for the reason described above.
    )
)

Regex (ECMAScript + lookahead โมเลกุล), 53 52 ไบต์

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

# For the purposes of these comments, the input number = N.
^
# Assert that N is not the sum of a prime number and a power of 2.
(?!
    (xx)*$                   # Assert that N is odd.
|
    (?*
        xx+                  # Force N - \2 to be > 1, because the prime test used
                             # below has a false match of 1, which would otherwise
                             # give us false negatives on de Polignac numbers of the
                             # form 2^M+1, such as 262145 and 2097153.
        (((x+)(?=\4$))*x$)   # Cycle through subtracting all possible powers of 2 from
                             # tail, so we can then test {N - {power of 2}} for being
                             # prime.
                             # \2 = the power of 2
    )
    \2                       # tail = N - \2
    (?!(xx+)\5+$)            # Test tail for being prime. If it matches, this will fail
                             # the outside negative lookahead, showing that N is not a
                             # de Polignac number.
)

รุ่นนี้ไม่เพียง แต่สะอาดกว่า แต่เร็วกว่ามากเพราะแทนที่จะต้องวนไปตามวิธีที่เป็นไปได้ทั้งหมดที่ N คือผลรวมของตัวเลขสองตัวมันสามารถวนรอบผ่านการลบกำลังทั้งหมด 2 จาก N และทดสอบความแตกต่างสำหรับการเป็นนายก .

โมเลกุล lookahead สามารถแปลงให้เป็นความยาวผันแปรได้อย่างง่ายดาย:

Regex (.NET หรือ ECMAScript 2018), 55 54 ไบต์

^(?!(xx)*$|xx+(((x+)(?=\4$))*x$)(?<=(?<!^\5+(x+x))\2))

ลองออนไลน์! (. NET)
ลองออนไลน์! (ECMAScript 2018)

# For the purposes of these comments, the input number = N.
^
# Assert that N is not the sum of a prime number and a power of 2.
(?!
    (xx)*$                 # Assert that N is odd.
|
    xx+                    # Force N - \2 to be > 1, because the prime test used
                           # below has a false match of 1, which would otherwise
                           # give us false negatives on de Polignac numbers of the
                           # form 2^M+1, such as 262145 and 2097153.
    (((x+)(?=\4$))*x$)     # Cycle through subtracting all possible powers of 2 from
                           # tail, so we can then test {N - {power of 2}} for being
                           # prime.
                           # \2 = the power of 2
    (?<=
        (?<!^\5+(x+x))     # Test tail for being prime. If it matches, this will fail
                           # the outside negative lookahead, showing that N is not a
                           # de Polignac number.
        \2                 # tail = N - \2
    )
)

regex ของคุณสามารถปรับให้เหมาะสมได้^(?!(x+)((?!(xx+)\3+$)x*(?!(x(xx)+)\4*$)|x(?!(x(xx)+)\6*$)x*(?!(xx+)\8+$)x)?\1$)โดยไม่ยากเกินไป จากนั้นด้วยความคิดที่รอบคอบสามารถเล่นกอล์ฟต่อไป^(?!(x+)((x?)(?!(x(x\3)+)\4+$)x*(?!(x(xx)+|\3\3+)\6+$)\3)?\1$)ได้ อาจจะสั้นกว่านี้
H.PWiz

สั้นที่สุดของฉันช้ามากแม้ว่า
H.PWiz

โอ้, (x(xx)+|\3\3+)->(x\3?(xx)+)
H.PWiz

4

Mathematica, 41 ไบต์

OddQ@#&&!Or@@PrimeQ[#-2^Range[0,Log2@#]]&

1
ไม่มี builtin สำหรับสิ่งนี้? ว้าวฉันแปลกใจ
HyperNeutrino

1
มันน่ารำคาญเพื่อให้ที่นี่ที่ Mathematica เห็นเฉพาะเชิงลบที่จะเป็นนายกรัฐมนตรีหรืออื่น ๆ คุณสามารถบันทึกไบต์โดยการแทนที่PrimeQ[#-2^Range[0,Log2@#]]ด้วยแล้วโดยPrimeQ[#-2^Range[0,#]] PrimeQ[#-2^Range@#/2]
Greg Martin



4

Brachylogขนาด15 13 ไบต์

/₂ℕ|>ṗ;?-₍ḃ+1

ลองออนไลน์!

แสดงผลตัวเลข Polignac ได้สูงสุด 1,000

ส่งคืนfalse.สำหรับหมายเลข de Polignac และtrue.อื่น ๆ

ขึ้นอยู่กับคำตอบที่ถูกลบของ @ LeakyNun พร้อมข้อบกพร่องเล็กน้อย (โพสต์เมื่อได้รับอนุญาต)

(-2 bytes โดยใช้วิธีการ @Jonathan Allan เพื่อตรวจสอบว่าตัวเลขเป็นกำลังสองหรือไม่)

หมายเลขที่ระบุไม่ใช่หมายเลข de Polignac หาก:

/₂ℕ              It's an even number
   |>ṗ           Or there exists a prime number less than the input
      ;?-₍       which when subtracted from the input
          ḃ      gives a result that has a binary form
           +     such that the sum of the bits 
            1    is 1

=h2จะสั้นลง 1 ไบต์ แต่ก็ใช้ไม่ได้3เช่นกัน
ทำให้เสียชีวิต

หมายเหตุถึงตัวเอง (ไม่ใช่มือถือ): 14 ไบต์ลองออนไลน์! . ได้รับแรงบันดาลใจจากคำตอบของ Jonathan Allan Jelly
sundar - Reinstate Monica


เตือนสำหรับบันทึกย่อของคุณฉันเดา?
Kroppeb

1
@Deadcode มันเคยทำงานเมื่อมีการโพสต์และดูเหมือนว่ามีการเปลี่ยนแปลงบางอย่างเกี่ยวกับการหารในเวลาเดียวกัน - เช่น ลองออนไลน์! ส่งกลับค่า false แทนที่จะเป็น 64 การเปลี่ยนแปลงน่าจะมาจากการกระทำนี้ต่อภาษา แต่ฉันไม่ได้ใช้งานที่นี่ในขณะที่ดังนั้นไม่ทราบว่าเป็นเจตนาหรือข้อผิดพลาด
sundar - Reinstate Monica

3

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

ÆRạl2=Ḟ$o/o‘Ḃ

ลองออนไลน์!

ÆRạl2=Ḟ$o/     Main link; argument is z
ÆR             Generate all primes in the range [2..z]
  ạ            Absolute difference with z for each prime
   l2          Logarithm Base 2
     =Ḟ$       For each one, check if it's equal to its floored value (i.e. if it is an integer)
        o/     Reduce by Logical OR to check if any prime plus a power of two equals the z
          o‘Ḃ  Or it's not an odd number. If it's not an odd number, then automatically return 1 (false).

เอาต์พุต1สำหรับ false และ0true


Ḷ2*ạfÆRṆจากนั้นตรวจสอบความเท่าเทียมกัน
Leun Nun

@LeakyNun Ḷ2*ạfÆRṆo‘Ḃส่งคืน1ทั้ง127และ22; ไม่ถูกต้อง ถ้าไม่ใช่นั่นคือสิ่งที่คุณแนะนำ
HyperNeutrino

คุณจำเป็นต้องใช้และไม่ใช่หรือ (หรือคุณสามารถลบการปฏิเสธครั้งสุดท้ายของฉันจากนั้นดำเนินการต่อใน 9/10 ไบต์)
Leun Nun

@LeakyNun ตัวอย่างข้อมูลของคุณมี0149 รายการ
ETHproductions

@ETHproductions ถูกต้อง การเปลี่ยนเป็นการ_@แก้ไข
Leun Nun

2

Perl 6 , 55 ไบต์

{so$_%2&&$_∉((1,2,4...*>$_) [X+] grep &is-prime,^$_)}

ลองออนไลน์!

  • (1, 2, 4 ... * > $_) เป็นลำดับของกำลังสองจนกระทั่งอาร์กิวเมนต์อินพุต (Perl infers ชุดเรขาคณิตจากองค์ประกอบที่มีให้)
  • grep &is-prime, ^$_ คือรายการของจำนวนเฉพาะจนถึงอาร์กิวเมนต์ของอินพุต
  • [X+] ประเมินผลรวมขององค์ประกอบทั้งหมดของผลิตภัณฑ์ไขว้ของทั้งสองซีรีส์

ฉันสามารถทำได้โดยไม่soน้อยกว่าสองไบต์ แต่จากนั้นก็คืนค่าเท็จสองค่า ( 0และFalse)


2

ความจริง 86 ไบต์

f(n:PI):Boolean==(~odd?(n)=>false;d:=1;repeat(n<=d or prime?(n-d)=>break;d:=d*2);n<=d)

การทดสอบและผลลัพธ์

(21) -> for i in 1..600 repeat if f(i) then output i
   1
   127
   149
   251
   331
   337
   373
   509
   599

2

Haskell, 104 102 ไบต์

p x=[x]==[i|i<-[2..x],x`mod`i<1]
h k|even k=1>2|2>1=notElem k$((+)<$>(2^)<$>[0..k])<*>filter(p)[1..k]

คำอธิบาย

  • p เป็นฟังก์ชันที่ค้นหาหมายเลขเฉพาะ (ไม่มีประสิทธิภาพมาก!)
  • การสร้างรายการที่(+)นำไปใช้กับฟังก์ชั่นบางส่วน 2 ^ ซึ่งจะนำไปใช้กับรายการ [0..input]
  • การนำไปใช้ข้างต้นกับรายการที่กรอง 1 ไปยังอินพุตสำหรับจำนวนเฉพาะ
  • ผลลัพธ์ผลิตภัณฑ์คาร์ทีเซียนทุกค่าที่เป็นไปได้ถูกค้นหาเพื่อให้แน่ใจว่าไม่มีอินพุทในผลิตภัณฑ์คาร์ทีเซียน
  • เตรียมพร้อมเพื่อให้แน่ใจว่าการป้อนข้อมูลแบบสม่ำเสมอเป็นเท็จโดยอัตโนมัติ

อัปเดต: ส่งเสียงไปยัง Einkorn Enchanter เพื่อเล่นกอล์ฟสองไบท์!


1
p x=[x]==[i|i<-[2..x],x`mod`i<1]เป็นการทดสอบแบบดั้งเดิมที่สั้นกว่า
ข้าวสาลีตัวช่วยสร้าง

@EinkornEnchanter เยี่ยมมาก! คุณตีกอล์ฟฉันสองไบต์!
maple_shaft

1
คุณสามารถทำได้filter p[1..k]แทนfilter(p)[1..k]
Wheat Wizard

1

เสียงกระเพื่อมสามัญ, 134 ไบต์

(lambda(x)(flet((p(x)(loop for i from 2 below x always(>(mod x i)0))))(or(evenp x)(do((j 1(* j 2))(m()(p(- x j))))((or(>= j x)m)m)))))

ส่งคืนNILเมื่ออาร์กิวเมนต์เป็นหมายเลข Polignac Tมิฉะนั้น

ลองออนไลน์!

Ungolfed:

(lambda (n)
  (flet ((prime? (x)                 ; x is prime
           loop for i from 2 below x ; if for i in [2..n-1]
           always (> (mod x i) 0)))  ; is x is not divisible by i
    (or (evenp n)                    ; if n is even is not a Polignac number
        (do ((j 1( * j 2))           ; loop with j = 2^i, i = 0, 1,... 
             (m () (prime? (- n j)))); m = n - 2^i is prime?
            ((or (>= j n)            ; terminate if 2^i ≥ n
                 m)                  ; or if n - 2^i is prime
             m)))))                  ; not a polignac if n - 2^i is prime

1

APL (ขยาย Dyalog)ขนาด 12 ไบต์

2∘|⍲0⍭⊢-2*…

ลองออนไลน์!

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ ส่งคืน 1 สำหรับความจริง, 0 สำหรับความเท็จ

ส่วนมากมาจากETHProductions' คำตอบ

ขอบคุณ @ Adámที่ช่วยเล่นกอล์ฟคำตอบดั้งเดิมของฉันและทำให้ Dyalog Extended สำหรับเรื่องนั้น

วิธี:

2∘|⍲0⍭⊢-2*…    Tacit prefix function; input will be called 
                Inclusive Range [0..⍵]
         2*      2 to the power of each number in the range
       ⊢-        Subtract each from 
     0          Non-primality check on each resulting number
                Logical NAND
 2∘|             Mod 2
                Not any (bitwise OR reduction, then negated)




0

APL (NARS) 80 ตัวอักษร 160 ไบต์

∇r←f w;n
r←¯1⋄→0×⍳(w≤0)∨w≥9E9⋄r←0⋄→0×⍳0=2∣w⋄n←r←1
→0×⍳w≤n⋄→3×⍳0πw-n⋄n×←2⋄→2
r←0
∇

ฟังก์ชั่น 0 that เป็นฟังก์ชั่นที่คืนค่าอาร์กิวเมนต์นั้นดีหรือไม่ สำหรับฉันแล้วฟังก์ชั่นนี้ไม่ได้วนซ้ำดังนั้นมันจึงยาวกว่านิดหน่อย ... ทดสอบ:

  {1=f ⍵:⍵⋄⍬}¨1..1000
1  127  149  251  331  337  373  509  599  701  757  809  877  905  907  959  977  997 

สำหรับอินพุต <= 0 หรืออินพุต> = 9E9 จะส่งคืน¯1 (ข้อผิดพลาด)

  f¨0 ¯1 ¯2 900000000001
¯1 ¯1 ¯1 ¯1 

0

C # (Visual C # Interactive Compiler) , 107 ไบต์

x=>{var r=Enumerable.Range(2,x);return x%2>0&r.All(p=>r.Any(d=>d<p&p%d<1)|r.All(n=>x!=p+Math.Pow(2,n-2)));}

ลองออนไลน์!

ไม่ใช่โค้ดที่มีประสิทธิภาพที่สุด แต่ทำงานได้ดี โซลูชันดั้งเดิมของฉันกรองเฉพาะช่วงก่อนทดสอบในสูตรและทำงานได้ดีขึ้นมาก เวอร์ชันปัจจุบันสั้นลง 11 ไบต์

// input x is an integer
x=>{
  // we need to generate several
  // ranges. since this is verbose,
  // generate 1 and keep a reference
  var r=Enumerable.Range(2,x);
  // this is the main condition
  return
     // input must be odd
     x%2>0&
     // generate all possible p's
     // over our range and ensure that
     // they satisfy the following
     r.All(p=>
       // either p is not prime
       r.Any(d=>d<p&p%d<1)
       |
       // or there is no n that satisfies
       // the formula: x=p+2^n
       r.All(n=>x!=p+Math.Pow(2,n-2))
     );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.