Dua bilangan prima didefinisikan sebagai bilangan prima kembar jika keduanya berbeda dua. Sebagai contoh, 3 dan 5 adalah bilangan prima kembar seperti 29 dan 31.
Tulis sebuah program yang menemukan pasangan ke-2 dari bilangan prima kembar (di mana n berasal dari STDIN) dan mencetaknya pada STDOUT, dipisahkan dengan koma dan spasi. Ini kode-golf, jadi kode terpendek menang.
Input sampel:
3
Output sampel:
11, 13
Jawaban:
Haskell 118
Brute-paksa semua bilangan prima kembar dan cetak pasangan ke- n .
sumber
interact
alih-alih,putStrLn
Anda dapat melangkah lebih jauh dan menurunkannya ke 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
CJam,
2926 byteCobalah online.
Contohnya
Bagaimana itu bekerja
sumber
Perl,
1018787 karakter, membangun komentar aschepler
101 karakter, jawaban sebelumnya
Pemakaian:
Penjelasan
Cara kerja regex non-primitif dijelaskan dalam pertanyaan SO ini .
sumber
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
C: 113
Contoh dijalankan:
Terima kasih atas bantuan dari Dennis, bebe, dan Alchymist.
sumber
scanf
alih-alih argumen baris perintah. Juga,o=0
tidak perlu, karenao
bersifat global.main
dapat menyimpan variabel int default, menambahc
dani
di antara penugasan dan pernyataan dapat mempersingkat kode, penugasanl
dapat diambil kembali ke yang pertama untuk blok ketiga loop sehingga Anda tidak perlu kawat gigi dan hanya menggunakan satu karakter pemisah di printf pasti bisa membuatnya lebih kompak.c<=i-1
, yang hanya konyol.i
dalaml
penugasan ekspresi, karena nilai (baru) darii
digunakan untuk pengurangann
. Ada tips?CJam - 26
Ini berfungsi untuk bilangan prima yang lebih kecil dari 10.000; Anda dapat mengganti
4
dengan eksponen yang lebih tinggi untuk angka yang lebih besar (berpotensi hingga 10 20 ), tetapi program akan semakin lambat dan akan menggunakan lebih banyak memori.Cobalah di http://cjam.aditsu.net/
Penjelasan:
1e4,
menciptakan larik [0 1 2 ... 9999]{mp},
memilih hanya bilangan prima yang_2f-
menyalin larik dan mengurangi 2 dari setiap item yang&
memotong dua larik, sehingga menemukan bilangan prima yang lebih rendah dari setiap pasangan bilangan kembar utamaqi
membaca input dan mengkonversi ke integer(=
menyesuaikan b mengindeks dan mendapatkan kembar prima yang sesuai (lebih rendah) dari array_2+
menyalin prima dan menambahkan 2", "\
menempatkan koma dan ruang antara dua bilangan primasumber
Mathematica - 63 karakter
Catatan
Ini sebenarnya implementasi yang agak mudah. Pemendekan menghasilkan hampir tidak ada kebingungan.
NextPrime
adalah builtin yang menemukan prime berikutnya setelah angka.NestWhile[NextPrime,#,#2-#1!=2&,2]&
adalah fungsi anonim yang menemukan prime lebih besar dari pasangan prime kembar berikutnya setelah angka.Nest
berlakun
kali fungsi anonim ini .Print[#-2,", ",#]&
adalah fungsi anonim yang mencetak ke stdout sesuai dengan spesifikasi. Sayangnya ini saja membutuhkan 18 karakter dari solusi 63 karakter.Contoh
Pembaruan: Dua karakter dapat disimpan dengan menerapkan kembali solusi CJam ini . Namun, algoritma ini membatasi nilai maksimum
n
. Cukup gantiNest...
bagian denganIntersection[#,#-2][[5]]&@Prime@Range[999]
sumber
Javascript (E6) 92
96Lebih pendek dan sesuai - gunakan shell spidermonkey untuk membaca stdin / tulis stdout (dengan koma dan spasi). Ia menemukan pasangan 10000 1260989, 1260991 dalam waktu kurang dari satu menit di PC saya
Bisa lebih pendek menggunakan
p[n]=o=n
bukanp.push(o=n)
, sehingga p array jarang. Tapi itu cukup lambat, dan saya tidak akan menang untuk panjang kode.Untuk mencoba di konsol firefox:
Tidak disatukan
Fungsi yang menemukan semua m kembar pertama (mengembalikan nilai terbesar):
Contoh:
console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
Yang terakhir:
Kemudian, ambil 2 baris itu dan tambahkan IO
sumber
J -
49 60 5551 byteSaya memutuskan untuk pergi dengan pendekatan sederhana. Function
t
menemukan prime kembar berikutnya yang diberi bilangan prima sebagai input (sekarang ini termasuk dalamf
fungsi). Functionf
menemukan prime twin ke-n. Ini juga merupakan program aktual pertama yang saya tulis di J.Contoh:
Hanya untuk beberapa alis mata, dapatkan versi tanpa ungolfed.
Penjelasan:
sumber
C #, 265
sumber
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
bukanProgram
dana
bukannya parameterargs
.)
setelah.Count(...)<3
. Anda juga dapat menyimpan sedikit dengan mengubahvar i=int.Parse(args[0]);int f=0,c=0;
keint i=int.Parse(args[0]),f=0,c=0;
. Anda selanjutnya dapat menyimpan beberapa dengan mengekstraksi penginisialisasi dari loop, jadic=0;for(int j=1;
=>c=0,j=1;for(;
.for
lingkaran, ditambah menggunakan nama yang memenuhi syarat ketimbangusing System
:using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}
, 238 chars.Ruby 94
Tes online: http://ideone.com/B2wxnG
sumber
Perl,
10095Tidak Disatukan:
sumber
T-SQL (2008+): 344
Brute paksa sebuah CTE untuk menemukan bilangan prima, fungsi jendela untuk menghitung n, diikuti oleh gabungan untuk menemukan kembarannya. Bekerja dalam hitungan detik untuk keluaran <1.000, tepat di bawah satu menit untuk keluaran <10.000.
Golf (SQLFiddle di sini ):
Terbaca:
sumber
GolfScript 46
Tes online: tautan
Kode beranotasi:
sumber
PHP 5.4, 223
Bukan yang lebih kecil, Tapi satu coba dari php.
sumber
C 309
Terus mendapatkan bilangan prima berikutnya dan menyimpan istilah ganjil dan genap kemudian memeriksa apakah perbedaannya adalah dua.
sumber
for (int i=2;i*i<=k;i++)
R, 91 karakter
Tidak ada yang benar-benar mewah:
Pemakaian:
sumber
Japt,
2319 byte-4 byte terima kasih kepada Shaggy
Jalankan secara online
sumber
JavaScript (Node.js), 162 karakter
Membaca dari stdin, output ke stdout, keluar "awal" untuk input
<= 0
.Penggunaan (skrip di atas disimpan sebagai
ntp.js
):sumber
AWK - 129
File
fsoe-pairs.awk
:Menjalankannya:
(Baris 1 setelah perintah dimasukkan, baris 2 adalah output)
Ini didasarkan pada algoritma generator utama sendiri yang saya sebut "saringan mengambang erastosthenes" (sampai saya menemukannya dijelaskan di sini) yang hanya menyimpan bagian yang diperlukan dari saringan dan bilangan prima yang sudah dihitung.
sumber
Python 2 (75)
Jadi apa yang terjadi di sini?
Pertama, mari kita lihat ekspresi
all(n%i&~2for i in range(2,n-2))
, yang memeriksa apakah(n-2,n)
sepasang bilangan prima kembar.Ekspresi yang lebih sederhana
all(n%i for i in range(2,n))
hanya memeriksa apakahn
prima dengan mencoba setiap pembagii
dalam rentang2<=i<=n-1
, dan melihat apakah semua yang tersisa adalah nol. Iniall
memeriksa persis ini, karena Python memperlakukan0
sebagaiFalse
dan semua nomor lainnya sebagaiTrue
.Sekarang, amati bahwa
(n-2)%i==0
tepat ketikan%i==2
untuk pembagii>2
. Jadi, kita bisa melakukan pemeriksaan awaln
dann-2
sekaligus dengan memeriksa sisanya untuk keduanya0
dan2
. Ini bisa dilakukan sebagaiall(n%i not in [0,2] for i in range(2,n-2))
. Kami hanya mencoba pembagi dalam rentang2<=i<=n-3
demin-2
, tetapi ini sudah cukup untukn
sejak itun-1
dann-2
tidak dapat menjadi pembagi kecualin<=4
. Kami hanya akan mencoba yang anehn
mulai dari5
untuk menghindari komplikasi dan pembagi inii=2
.Kami memasukkan ekspresi
n%i not in [0,2]
ke dalamn%i&~2
, mengingat itu0
False dan angka lainnyaTrue
. Prioritas operator(n%i)&(~2)
itulah yang dibutuhkan. Bit-komplemen~2
adalah...11111101
, jadi bitwise-nyaand
dengan angka nol-keluar2
nilai tempat biner. Ini memberi0
(yaitu,False
) hanya untuk0
dan2
, persis apa yang kita inginkan.Fiuh! Sekarang kita memiliki ekspresi
all(n%i&~2for i in range(2,n-2))
memeriksa apakahn
nomor atas dari pasangan perdana kembar. Yang tersisa adalah beralih pada mereka sampai kita melihatc
mereka, di manac
nomor yang dimasukkan. Kami mulai dengan5
dan terus menghitung2
untuk menghindari masalah pembagi. Kami mengurangic
setiap kali kami menemukann
yang berfungsi, berhenti ketikac=0
. Akhirnya, kami mencetak pasangan kembar utama yang kami akhiri.sumber
T-SQL (2012 +), 255 karakter
Pencari utama kembar T-SQL yang lebih ringkas yang juga sedikit mempercepat.
Format yang dapat dibaca manusia ::
Inti dasarnya adalah kita menggunakan tabel angka bawaan (master..spt_values type = 'p') dan alias dengan CTE sebagai sesuatu yang pendek. Kami menambahkan 2 untuk menghilangkan kekhawatiran menarik 0 atau 1 kesalahan sepele untuk set kami, jadi sekarang kami memiliki kandidat 2,2050.
Z, kueri paling dalam mendapatkan semua bilangan prima dari 2 hingga 2050, dengan memfilter nomor apa pun yang dapat dibagi dengan angka kurang dari n. Kami kemudian menggunakan fungsi windowing T-SQL 2012 yang bagus
lag
yang memungkinkan kami menarik hasil sebelumnya, jadi sekarang hasil Z a dan b adalah bilangan primaP[n]
danP[n-1]
masing - masing. Kueri R membuat string keluaran, dan memfilter bilangan prima non-kembar dan juga membuat nomor urut untuk keluaran yang kita sebut K. Akhirnya kueri R terakhir memungkinkan kita untuk memfilter dan mendapatkan bilangan kembar Kth dengan mengubah variabelnya.sumber
Mathematica - 71 byte
sumber