Angka adalah angka de Polignac jika dan hanya jika itu ganjil dan tidak dapat direpresentasikan dalam bentuk p + 2 n di mana n adalah bilangan bulat non-negatif dan p adalah bilangan bulat utama.
Tugas
Tulis beberapa kode yang mengambil bilangan bulat positif dan tentukan apakah itu nomor de Polignac. Anda dapat menampilkan dua nilai berbeda satu untuk true dan satu untuk false. Anda harus meminimalkan jumlah byte Anda.
Uji Kasus
Untuk kasus positif inilah 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, ...
Berikut ini beberapa kasus negatif:
22, 57
code-golf
number
number-theory
decision-problem
Wisaya Gandum
sumber
sumber
Jawaban:
Japt ,
91413 byteUji secara online! atau Temukan semua bilangan bulat de Polignac di bawah 1000 .
Keluaran
1
untuk input palsu dan0
untuk kebenaran.Penjelasan
sumber
false
tetapi mereka bukan nomor de Polignac.3
sudah diperbaiki, tetapi pada awalnya kami tidak harus menangani kasing . Pemasangan.3
tidak memerlukan biaya byte kemudian saya melihat perbaikan untuk2
- Aduh!Jelly ,
1110 byteDisimpan 1 byte berkat @Dennis
Cobalah online!
Bagaimana itu bekerja
sumber
Ḷ2*⁸_ÆPS<Ḃ
menghemat satu byte. tio.run/##ASQA2/9qZWxsef//4bi2Mirigbhfw4ZQUzzhuIL/…¬;ḂẠ
.S<Ḃ
jauh di luar kotak, setidaknya bagi saya :-)JavaScript (ES6),
56 5453 byteMengembalikan0 atau 1 .
Cobalah online!
Bagaimana?
Kita mulai denganp = 1 . Kami menguji apakah y= n - p adalah komposit dan menghasilkan boolean yang sesuai. Tes selanjutnya dilakukan dengan p × 2 .
Begituhal lebih besar dari n , kita menghentikan rekursi dan mengembalikan n .
Hasil dari semua iterasi adalah AND'd bersama-sama, memaksa nilai boolean menjadi0 atau 1 .
Asalkan semua hasil antara benar, kami berakhir dengan uji bitwise seperti:
1 & 1 & 1 & n
Ini memberikan1 jika dan hanya jika n ganjil, yang merupakan kondisi terakhir yang diperlukan untuk memvalidasi input sebagai nomor de Polignac.
sumber
n%2
atau serupa: PPython 2 ,
605756 byteCobalah online!
sumber
&n&
. Angka 5 akan menjadi negatif palsu jika itu adalah nomor de Polignac, karena 1 + 4 = 5, tetapi ini bukan masalah karena 2 + 3 = 5 tetap.Jelly , 10 byte
Alternatif pengiriman 10 byte Jelly ke yang sudah diposkan.
Tautan monadik yang mengembalikan 1 untuk nomor de Polignac dan 0 jika tidak.
Cobalah online! atau lihat yang di bawah 1000 .
Bagaimana?
sumber
05AB1E ,
98 byte-1 byte terima kasih kepada Emigna
Output
0
untuk input yang benar dan1
untuk input yang salah.Cobalah online!
sumber
1å
bisa jadiZ
.Python 2 , 99 byte
Cobalah online!
-4 bytes berkat Leaky Nun
-2 byte berkat Wondercricket
+8 byte untuk memperbaiki kesalahan
-1 byte terima kasih kepada Tn. Xcoder
-3 byte terima kasih kepada Einkorn Enchanter
+12 byte untuk memperbaiki kesalahan
sumber
Regex (ECMAScript), 97 byte
Masalah ini menimbulkan kasus menarik untuk mengatasi masalah kurangnya pencarian non-atom. Dan ini satu-satunya waktu sejauh ini sehingga saya memiliki alasan yang bagus untuk menempatkan kedua versi uji 2,
((x+)(?=\2$))*x$
dan(?!(x(xx)+)\1*$)
, di regex yang sama, dan satu-satunya waktu sejauh ini yang saya perlukan untuk melindungi uji utama terhadap pencocokan 1, seperti(?!(xx+)\1+$)xx
, ketika digunakan dalam regex yang lebih besar.^(?!(xx)*$|(x+)((?!(xx+)\4+$).*(?=\2$)((x+)(?=\6$))*x$|(?!(x(xx)+)\7*$).*(?=\2$)(?!(xx+)\9+$)xx))
Cobalah online!
Regex (ECMAScript + molekul lookahead),
5352 byte^(?!(xx)*$|(?*xx+(((x+)(?=\4$))*x$))\2(?!(xx+)\5+$))
Versi ini tidak hanya jauh lebih bersih, tetapi jauh lebih cepat, karena alih-alih harus memutar melalui semua cara yang mungkin bahwa N adalah jumlah dari dua angka, itu hanya dapat siklus melalui pengurangan setiap kekuatan 2 dari N dan menguji perbedaan untuk menjadi prima .
Tampilan molekul dapat dengan mudah dikonversi ke tampilan panjang variabel di belakang:
Regex (.NET atau ECMAScript 2018),
5554 byte^(?!(xx)*$|xx+(((x+)(?=\4$))*x$)(?<=(?<!^\5+(x+x))\2))
Cobalah online! (.NET)
Cobalah secara online! (ECMAScript 2018)
sumber
^(?!(x+)((?!(xx+)\3+$)x*(?!(x(xx)+)\4*$)|x(?!(x(xx)+)\6*$)x*(?!(xx+)\8+$)x)?\1$)
tanpa terlalu banyak kesulitan. Kemudian, dengan pemikiran yang cermat, bisa bermain golf lebih jauh^(?!(x+)((x?)(?!(x(x\3)+)\4+$)x*(?!(x(xx)+|\3\3+)\6+$)\3)?\1$)
. Lebih pendek mungkin dilakukan(x(xx)+|\3\3+)
->(x\3?(xx)+)
Mathematica, 41 byte
sumber
PrimeQ[#-2^Range[0,Log2@#]]
denganPrimeQ[#-2^Range[0,#]]
dan kemudian denganPrimeQ[#-2^Range@#/2]
.PHP , 75 bytes
mencetak 1 untuk truey dan 0 untuk falsy
Cobalah online!
Cobalah online! Integer Polignac di bawah 10.000
sumber
Pari / GP , 34 byte
Cobalah online!
sumber
Brachylog ,
1513 byteCobalah online!
Output nomor Polignac hingga 1000.
Pengembalian
false.
untuk nomor de Polignac dantrue.
lainnya.Berdasarkan jawaban yang dihapus @ LeakyNun, dengan beberapa perbaikan bug (diposkan dengan izin mereka).
(-2 byte dengan menggunakan metode @Jonathan Allan untuk memeriksa apakah angka tersebut adalah kekuatan dua.)
Nomor yang diberikan bukan nomor de Polignac jika:
sumber
=h2
akan lebih pendek 1 byte tetapi tidak berhasil untuk3
keduanya.Jelly , 13 byte
Cobalah online!
Output
1
untuk false dan0
true.sumber
Ḷ2*ạfÆRṆ
kemudian periksa paritasnyaḶ2*ạfÆRṆo‘Ḃ
kembali1
untuk keduanya127
dan22
; itu tidak benar. Kecuali kalau bukan itu yang Anda sarankan.0
149.ạ
untuk_@
memperbaikinya.Perl 6 , 55 byte
Cobalah online!
(1, 2, 4 ... * > $_)
adalah urutan kekuatan dua hingga argumen input (Perl menyimpulkan deret geometri dari elemen yang disediakan).grep &is-prime, ^$_
adalah daftar bilangan prima hingga argumen input.[X+]
mengevaluasi jumlah semua elemen produk silang dari dua seri.Saya bisa melakukannya tanpa kurang dari
so
dua byte, tetapi kemudian mengembalikan dua nilai falsy yang berbeda (0
danFalse
).sumber
Aksioma, 86 byte
tes dan hasil
sumber
Haskell,
104102 bytePenjelasan
(+)
fungsi 2 parsial yang diterapkan ke daftar [0..input]PEMBARUAN: Berteriaklah kepada Einkorn Enchanter karena bermain golf dua byte!
sumber
p x=[x]==[i|i<-[2..x],x`mod`i<1]
adalah tes primality yang lebih pendek.filter p[1..k]
sebagai penggantifilter(p)[1..k]
Common Lisp, 134 byte
Kembali
NIL
ketika argumennya adalah nomor Polignac,T
jika tidak.Cobalah online!
Tidak Disatukan:
sumber
APL (Dyalog Extended) , 12 byte
Cobalah online!
Fungsi tacit awalan anonim. Mengembalikan 1 untuk truey, 0 untuk falsy.
Sebagian besar didasarkan pada jawaban Japt ETHProductions ' .
Terima kasih kepada @ Adám karena telah membantu golf jawaban asli saya, dan untuk membuat Dyalog Extended dalam hal ini.
Bagaimana:
sumber
Python 2 , 98 byte
Cobalah online!
sumber
Pyth , 14 byte
Cobalah!
sumber
Julia 0,4 , 31 byte
Cobalah online!
sumber
APL (NARS) 80 karakter, 160 byte
Fungsi 0π adalah fungsi yang mengembalikan argumennya prima atau tidak. Bagi saya fungsi ini belum rekursif sehingga sedikit lebih panjang ... Uji:
untuk input <= 0 atau input> = 9E9 itu mengembalikan ¯1 (kesalahan)
sumber
C # (Visual C # Interactive Compiler) , 107 byte
Cobalah online!
Bukan kode yang paling efisien, tetapi tampaknya berhasil. Solusi asli saya memfilter bilangan prima sebelum mengujinya dalam rumus dan kinerjanya jauh lebih baik. Versi saat ini lebih pendek 11 byte.
sumber