Tantangan
Terapkan saringan Sundaram untuk menemukan bilangan prima di bawah ini n
. Ambil integer input n
,, dan output bilangan prima di bawah ini n
. Anda dapat mengasumsikan bahwa n
akan selalu kurang dari atau sama dengan satu juta.
Saringan
Mulai dengan daftar bilangan bulat dari
1
hinggan
.Hapus semua angka yang ada di formulir di
i + j + 2ij
mana:i
danj
kurang darin
.j
selalu lebih besar atau sama dengani
, yang lebih besar dari atau sama dengan1
.i + j + 2ij
kurang dari atau sama dengann
Lipat gandakan angka yang tersisa dengan
2
, dan tambahkan1
.
Ini akan menghasilkan semua bilangan prima (kecuali 2
, yang harus dimasukkan dalam output Anda) kurang dari 2n + 2
.
Berikut ini adalah animasi dari saringan yang digunakan untuk menemukan bilangan prima di bawah ini 202
.
Keluaran
Output Anda harus setiap bilangan bulat utama ≤ n
(dalam urutan menaik) diikuti oleh baris baru:
2
3
5
Dimana n
adalah 5
.
Contohnya
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Input dilambangkan dengan >
.
n=30
29 tidak ada dalam output.(i,j)
dengani<=j
, tetapi hasilnya tidak berubah jika kami mengabaikan persyaratan ini. Bisakah kita melakukannya untuk menghemat byte?i <= j
. Itu hanya bagian dari cara kerja ayakan. Jadi ya, Anda dapat meninggalkani <= j
kode Anda. @xnor2n+1
) yang bukan dari bentuk2(i + j + 2ij)+1
- dapatkah kita menguji properti ini langsung pada bilangan potensial atau apakah kode kita harus melakukan kali 2 ditambah 1 pada beberapa titik ?n
ada di semuanya. Dalam deskripsi metode, dikatakan bahwa itu akan menghasilkan semua bilangan prima hingga2 * n + 2
. Tetapi dalam uraian input / output, dikatakan bahwa inputnya adalahn
, dan outputnya semuanya siapn
. Jadi apakah kita harus menerapkan metode untuk menghasilkan semua bilangan prima hingga2 * n + 2
, dan kemudian drop yang lebih besar daripadan
untuk output? Atau haruskah kita menghitungn
deskripsi metode dalam dari inputn
?Jawaban:
Pyth, 23 byte
Demonstrasi
Benar-benar hanya mengimplementasikan algoritma seperti yang diberikan.
sumber
Haskell,
9390 byteCara kerjanya:
[i+j+2*i*j|j<-r,i<-r]
semuai+j+2ij
yang dihapus (\\
) dari[1..n]
. Scale to2x+1
dan mengubahnya menjadi string (show
). Bergabung dengan NL (unlines
).sumber
Scala,
115 124 122 115114 byteFungsi anonim; mengambil n sebagai argumen dan mencetak hasilnya ke stdout.
sumber
JavaScript (ES7),
107105 bytePemahaman array sangat bagus! Tapi saya ingin tahu mengapa JS tidak memiliki sintaks rentang (mis.
[1..n]
) ...Ini berhasil diuji di Firefox 40. Kerusakan:
Alternatif, solusi ramah ES6 (111 byte):
Saran diterima!
sumber
MATLAB, 98
Dan dalam bentuk yang mudah dibaca
sumber
Java8:
168165 byteUntuk tipe data angka yang lebih besar dengan jangkauan luas dapat digunakan. Kita tidak perlu mengulangi karena seluruh
N
indeksN/2
sudah cukup.Untuk memahami dengan benar mengikuti adalah metode yang setara.
sumber
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 byte
Cobalah online
Ini tampaknya agak panjang relatif terhadap solusi Pyth isaacg, tapi itu ... apa yang saya miliki.
Penjelasan:
sumber
Perl 6 , 96 byte
Jika saya benar-benar mengikuti deskripsi yang terpendek saya berhasil dapatkan adalah 96 byte.
Jika saya bisa melakukan
2n + 1
inisialisasi array, pre-inserting2
, dan membatasi itu hanya untuk nilai yang kurang dari atau sama dengann
; itu dapat dikurangi menjadi 84 byte.Jika saya juga mengabaikan yang
j
seharusnya setidaknyai
, saya bisa menguranginya menjadi 82 byte.Contoh penggunaan:
sumber
PHP, 126 Bytes
Versi Online
sumber
Julia 0,6 , 65 byte
Cobalah online!
Bukan tantangan besar dalam hal bermain golf, tetapi saya hanya harus melakukannya untuk namanya. :)
sumber