Menemukan bilangan prima adalah ritus pemrograman bagian dan sangat sering program serius pertama seseorang (biasanya dengan divisi percobaan).
Tapi bilangan prima saja sudah usang. Hal berikutnya yang jauh lebih menarik adalah untuk mendapatkan kesenjangan utama: jarak yang paling jauh antara bilangan prima berturut-turut. Ini sangat langka dan "berharga". Beberapa pasangan pertama dan perbedaannya adalah:
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...
Ayah saya biasa menghitung ini dengan tangan untuk kesenangan hingga 10rb. Mari kita lihat seberapa pendek kode yang bisa Anda dapatkan.
Aturan:
- tidak ada fungsi bawaan untuk pengujian prima, generasi prima, atau kesenjangan utama
- no retrieving http://oeis.org/A002386 atau serupa (saya dapat mencium Anda curang dari jauh :))
- tidak ada array yang dikomputasi
- terus mencetak sampai jenis integer internal Anda gagal pada Anda
Hitungan karakter terendah menang. +10 karakter jika Anda hanya mencetak celah tanpa bilangan prima.
Anda juga dapat memamerkan versi dengan fungsi bawaan jika menarik. Jadilah kreatif.
Klarifikasi: Anda melewati bilangan prima dan Anda melaporkan setiap kali Anda melihat celah yang lebih besar dari celah yang Anda lihat sebelumnya. Misalnya, antara 3 dan 5, ada selisih 2 unit lebar. Kesenjangan antara 5 dan 7 juga 2, tapi itu berita lama, kami tidak peduli lagi. Hanya ketika Anda melihat celah terbesar baru, Anda melaporkannya. Ini mencerminkan bagaimana bilangan prima semakin jarang, seiring dengan jurang pemisah yang semakin lebar.
EDIT : Sebagian besar jawabannya brilian dan pantas mendapat pengakuan lebih. Namun, sejauh ini, entri GolfScript dengan 48 karakter adalah yang terpendek.
Jawaban:
GolfScript
6659574948Meskipun saya mengalami kesulitan menjalankannya di sini http://golfscript.apphb.com/ (mungkin situs itu tidak suka loop tak terbatas?) Tetapi berfungsi dengan baik ketika saya menjalankannya di komputer saya dengan golfscript.rb. Saya cukup baru di GolfScript jadi ini mungkin bisa diturunkan lebih jauh lagi. UPDATE: Saya tidak berpikir ini bisa diturunkan jauh lebih banyak tanpa mengubah algoritma.
Beberapa baris pertama yang dicetak (Jika Anda tidak suka "" yang dicetak, Anda dapat menambahkan; di awal skrip, tetapi itu menabraknya hingga 49 karakter):
Gagasan umum yang dapat dibaca manusia tentang cara kerjanya (beberapa hal sedikit berbeda karena saya tidak menggunakan tumpukan dalam versi ini):
sumber
Python,
121110109108104103 karakterPertama kali saya mencoba menjawab di sini, saya harap saya melakukannya dengan benar ... tidak yakin saya menghitung karakter dengan benar.
Hmmm, saya bisa menyimpan karakter lain di cetakan dengan menurunkan versi ke Python 2.x ...
sumber
#
, kamu serius tidak menghitung chars dengan tangan kan? javascriptkit.com/script/script2/charcount.shtmlif all(n%x>0for x in p):
sedikit lebih pendek. Anda juga dapat menyimpan beberapa karakter dengan memindahkan pernyataan ke baris yang sama (misalnyaa=1;b=2;f()
).JavaScript,
90857874 karakterKode Pendek (Google Closure Compiler - Pengoptimalan Lanjutan; beberapa pengeditan manual; pengeditan lebih lanjut oleh @ MT0 )
Kode Panjang
Keluaran
Tes yang cukup tidak efisien untuk bilangan prima, tetapi dengan cara itu menggunakan lebih sedikit karakter.
Posting pertama di sini, jadi mohon maaf jika ada kesalahan.
sumber
for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
Mathematica,
114108Memungkinkan keluaran tanpa batas, meskipun setelah titik tertentu dalam urutan, kipas berputar dan Anda mulai curiga bahwa CPU Anda memainkan Freecell sambil melakukan yang terbaik agar terlihat sibuk.
Sampel keluaran (Ini adalah yang diambil pada ~ 30-an pertama):
Kode tidak dikunci:
sumber
≠
?Haskell -
122116114112110(Tidak efisien) ekspresi daftar utama dicuri dari Will Ness .
-edit- Saya tidak pernah tahu
x|y=z|w=q
akan valid.sumber
MATLAB
10489Hanya menerapkan metode dasar dengan memeriksa setiap divisi yang mungkin.
Keluaran:
sumber
octave
daninf
hal ini tidak berhasil (dan hasil cetak ditunda sampai loop berakhir). Apakah matlab memiliki evaluasi rentang malas?76 karakter, dogelang
Dikonversi dari versi Python saya :
Keluaran:
sumber
Golfscript,
595150 karakterMan setiap karakter sangat sulit untuk kehilangan:
Keluaran :
Penjelasan :
Tumpukan diatur sehingga setiap iterasi dimulai dengan tumpukan seperti ini, bagian atas berada di kanan. The
[
menunjukkan array penanda saat ini, yang berarti ketika penafsir bertemu dengan]
, segala sesuatu di tumpukan dari tanda ke atas dimasukkan ke dalam sebuah array.g
adalah jarak maksimum sejauh ini. Dari atas ke bawah:Di dalam lingkaran:
Bagaimana cara menempatkan semua pembagi dalam daftar? Mari kita lakukan langkah demi langkah
Apa yang dilakukan jika pembagi kosong?
Dua jalur: ya dan tidak. Jika ya (perhatikan bahwa
if
mengkonsumsi nilai teratas pada tumpukan):Jika tidak:
Perhatikan dalam kedua kasus tersebut, tumpukan kami sekarang dalam formulir
... | g [ c | c | c
.Sekarang
do
muncul nilai teratas dari stack - selaluc
- dan loop jika itu positif. Karenac
selalu meningkat, ini selalu benar, jadi kami mengulang selamanya.Setelah muncul, bagian atas tumpukan adalah
g [ c | c
, artinya yang terakhir telah diperbaruic
, tanda array berada di tempat yang sama, dang
masih di tempat yang kita harapkan.Ini adalah operasi berbelit-belit dari GolfScript. Saya harap Anda menikmati mengikuti!
sumber
Ruby, 110
Hanya untuk Ruby 2.0 karena
lazy
metode:Keluaran:
sumber
Perl, 105 byte
Tidak Disatukan:
Algoritma ini sederhana,
$p
mengingat bilangan prima sebelumnya. Kemudian$i
beralih dari3
hingga, ketika tipe $ i "gagal pada saya" atau menjadi negatif karena melimpah.$i
diuji secara kasar dengan memeriksa semua pembagi dari 2 hingga$i-1
. Garis dicetak, jika perbedaan saat ini lebih besar dari perbedaan yang dicetak sebelumnya$d
.Dengan beberapa byte lagi run-time dapat ditingkatkan:
The Hasil dimulai dengan:
sumber
Python,
9391 karakterPemeriksaan perdana naif (periksa apakah dapat dibagi oleh apa saja mulai dari 2 hingga
n
(kurang darin/2
)):Indentasi tingkat kedua adalah karakter satu tab.
Keluaran:
sumber
n
hanya untuk pemeriksaan hinggan-1
Bash dan beberapa Perl untuk prime regex (
167 157 143112 byte)beberapa output:
sumber
test
memprotes cukup banyak, dan itu tidak berhasil untuk saya. Anda juga dapat menggunakan beberapalet n++
danlet f=c-p
dan menggantinyatest
dengan[
. Atau mungkin menguji di(())
mana Anda tidak perlu$
atau spasi.test -n $d
dikembalikan true untuk string kosong.test -n "$d"
baik-baik saja tetapi lebih lama. Namun, halaman manual mengatakan -n adalah opsional, dan ternyatatest $d
itu ok. Dan karena itu[ $d ]
juga. Dan g = 0 harus diinisialisasi.Perl
9590 byteversi lama bukan golf:
Ini mirip dengan kiriman saya yang lain, sans bash.
sumber
for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
C (100)
Kontribusi saya sendiri, tidak ada algoritma khusus, hanya golf:
sumber
r
danp
Anda akan memiliki lebih sedikit karakter dan skor bonus :)Haskell, 134C
Golf:
Tidak Disatukan:
sumber
C:
493302272246Saya menggunakan rekursi bukan loop biasa
for
atauwhile
.Keluaran:
sumber
leaking
di atas, karena Anda tidak menguji isPrime (n2), Anda membiarkan bilangan prima antara n1 dan n2. Dan ini tidak bisa diperbaiki, karena Anda tidak dapat meningkatkan n2 tanpa bertemu bilangan prima.return
di main. Lewati yang terakhirelse
. Ganti&&
->&
dannum%i==0
dengannum%i<1
. Dan dengan standar c kuno (akan ada peringatan), Anda tidak perlu menentukan nilai kembali untuk fungsi void dan int (argumennya juga default ke int).int
) dan fungsi pengujian utama yang jauh berkurang:e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
Oracle SQL,
216202196172 + 10 = 182Hanya perhatikan ini dalam pertanyaan:
Karena ini adalah SQL dan kata kunci sangat panjang, sebenarnya lebih baik untuk mengambil penalti, memberikan yang berikut. Itu ide yang sama seperti aslinya.
yang prettifies ke:
Jawaban lama (196)
dan dalam format yang dapat dibaca:
Ini menciptakan generator angka
c
, sub-pilih terdalam menciptakan bilangan prima menggunakan Saringan Eratosthenes, bagian luar menghitung perdana sebelumnya dan akhirnya pilih terakhir mengurangi satu dari yang lain.Ini tidak akan mengembalikan apa pun karena melakukan kueri rekursif 1 x 10 124 ... Jadi, jika Anda ingin itu berfungsi, kurangi angka ini menjadi sesuatu yang masuk akal.
sumber
D - 153 + 10 = 163
Saya bersedia mengambil penalti +10 di sini, karena jumlah char masih lebih rendah daripada jika saya mencetak bilangan prima juga.
Golf :
Versi yang dapat dibaca :
sumber
JAVASCRIPT 174 char
versi pendek:
sumber
Javascript 138
Salin kode ini ke konsol browser Anda. Ini akan seperti selamanya karena jumlah maks ada di sekitar
1.79*10^308
.Tidak Disatukan:
sumber
C #
162161 karakter151 karakter + 10 karakter penalti = 161 karakter
Versi pendek:
Versi panjang:
Sebenarnya lebih baik mengambil penalti 10 chars, karena tulisannya lebih pendek
g
(11 chars dengan penalti) daripadap+" "+i+" "+g
(13 chars tanpa penalti).sumber
Ruby
90868483 karakterBeberapa hubung singkat boolean, penyalahgunaan evaluasi ekspresi, dll.
sumber
C 248
Kode membandingkan bilangan prima berturut-turut a, b dan kemudian memeriksa apakah celah lebih besar dari g kemudian menemukan pasangan bilangan prima berikutnya.
sumber
Haskell,
154 144 137123p
Bilangan prima dihasilkan dengan menggunakan saringan erasthotenes#
, dan kemudian disaring dan dicetak menggunakan%
.Outputnya seperti
yang saya harap tidak apa-apa.
sumber
Bahasa Game Maker, 85
Dengan asumsi semua variabel tidak diinisialisasi sebagai
0
(ini adalah default dengan beberapa versi Game Maker).sumber
Bahasa Game Maker, 74 + 55 = 129
Dengan asumsi semua variabel tidak diinisialisasi sebagai
0
(ini adalah default dengan beberapa versi Game Maker).Script di
p
bawah ini:sumber
Perl, 87 byte ( menggunakan modul )
Saya menulis modul, tetapi kami harus menambahkan 565.000 karakter tambahan ke penghitungan. Sebagian besar posting untuk bersenang-senang, tetapi juga untuk memberikan alternatif kinerja karena saya tidak melihat sejauh ini menggunakan builtin. 4,6s untuk jeda hingga 1e9, 36s untuk jeda hingga 1e10, 6,5 menit untuk 1e11.
Pari / GP 2.8 pada dasarnya dapat dilakukan dengan cara yang sama, meskipun lebih dari 2x lebih lambat:
sumber
Perl 153
Kode pendek:
mudah dibaca:
sumber