Diberi nomor N , menggambar meninggalkan selaras N x N dewan angka, meninggalkan 1 kosong (sebagai ruang) (saya akan menunjukkan diagram dengan N = 5)
2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Tugas Anda adalah membuat Saringan Eratosthenes, langkah demi langkah. Pertama, mulailah dengan 2. Ini prima, jadi biarkan saja di sana, dan ganti semua angka lain yang dapat habis dibagi 2 dengan jumlah ruang yang tepat.
2 3 5
7 9
11 13 15
17 19
21 23 25
Selanjutnya, buka nomor yang belum dicetak berikutnya ( 3
dalam hal ini) dan lakukan hal yang sama.
2 3 5
7
11 13
17 19
23 25
Dan seterusnya, sampai Anda mencapai N .
Anda harus terlebih dahulu mencetak kisi lengkap, dan setiap kali Anda pergi ke nomor baru, cetak papan dengan kelipatan dihapus. Pastikan Anda mencetak garis kosong di antaranya!
Contohnya
Teks dalam tanda kurung ()
hanya untuk referensi, Anda tidak perlu mencetaknya
N = 2:
2 (complete grid)
3 4
2 (remove multiples of 2)
3
N = 3:
2 3 (complete grid)
4 5 6
7 8 9
2 3 (remove multiples of 2)
5
7 9
2 3 (remove multiples of 3)
5
7
Ingat, ini adalah kode-golf , jadi kode dengan jumlah byte terkecil menang.
N=10
,100
tidak prima, sehingga akan dihapus di beberapa titik. Haruskah semua angka diisi dengan 3 karakter karena100
memiliki 3 digit?Jawaban:
Jelly , 34 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Perl,
250243231202157 byteUji golf online saat ini! (pastikan dijalankan sebagai
perl -M5.010 main.pl
)Dua baris baru literal masing-masing menyimpan 1 byte sebagai pengganti \ n.
Output sampel (input 7):
Saya yakin saya tidak bermain golf dengan baik, jadi ketika saya pulang saya akan melihat lagi untuk melihat seberapa banyak saya bisa mencukur.
Edit 1: -7 byte (mengubah "print sprintf" menjadi "printf" yang jelas)
Sunting 2: Disimpan 12 byte dengan menggunakan $ d secara eksplisit di satu tempat ia dipanggil alih-alih membuat variabel terpisah, dengan menggabungkan beberapa deklarasi, dan dengan menghilangkan salah satu syarat saya untuk
next
pernyataan di dalamforeach
loop pertama dengan menambahkan spasi di tempat lain . 29 byte tambahan di-golf-kan dengan mengolah kembali dua untuk loop menjadi satu loop, menghilangkan dua deklarasi variabel, dan mengubahunless
pernyataan menjadi pernyataan if-not. Mendeklarasikanmy$e=$n*$n;
kemudian mengganti tiga instance dari $ n * $ n dengan $ e (memungkinkan saya untuk melepaskan paren untuk salah satu dari mereka) ternyata menghasilkan ± 0 byte, tetapi saya tetap menyimpannya.Sunting 3: Berkat @Dada, 40 byte lainnya di-golf-kan (deklarasi variabel, 'foreach' menjadi 'untuk', $ _ implisit di beberapa lokasi, dan mengurangi ukuran pernyataan printf). Tambahan 1 byte dicukur dengan mengubahnya
if!($c%$p||$c==$p||$p==1)
menjadiif!($p~~[(1,$_)]||$_%$p)
. Sayangnya, [] di sekitar array diperlukan, karena operator smartmatch ~~ masih eksperimental dan tampaknya tidak berfungsi dengan baik pada array aktual, tetapi malah bekerja pada referensi untuk array tersebut. 4 byte lagi dihapus dengan menghapus dua titik koma dan satu set tanda kutip kosong setelah yang terakhirsay
.sumber
my
). Gunakan-p
bendera untuk memilikiN
di dalam$_
daripada menggunakan$n=<>
. Tulisfor
alih-alihforeach
(instruksi ini setara). Letakkan tanda kurung di sekitar kondisiif
yang ada di posisi pengubah pernyataan (misalnyaif!$c%$n
alih-alihif(!$c%$n)
. Tidak perlu tanda kurung untuk menginisialisasi@a
:.@a=0..$e
Anda dapat turun kefor
variabel dan$_
akan digunakan sebagai gantinya. Tulisprintf"%*s",1+length$e,$a[$c]
(dokumen `sprintf` untuk detail tentang itu*
)$"
sebagai ganti" "
.say""
alih-alihprint"\n"
(Anda memiliki baris baru litteral dalam kode Anda, tetapi saya tidak dapat menuliskannya dalam komentar) (Anda akan menambahkan untuk menambah-M5.010
baris perintah, tetapi itu tidak dihitung dalam jumlah byte). Anda mungkin dapat menggunakan0..$e=$n*$n
untuk menyimpan satu byte pada inisialisasi dari$e
. Lihatlah tips perl golf , ini berisi banyak tips berguna. Tapi senang melihat pegolf perl baru, selamat datang! :) (dan maafkan kesalahan pengejaan saya, saya mungkin terlalu cepat menulis komentar saya sebelumnya)if!$c%$n
,! operator memiliki prioritas di atas operator%, jadi secara teknis ini akan menjadiif((!$c)%$n)
false untuk apa pun selain $ c = 0 (yang saya tidak mau). Adapun tips Anda yang lain, saya akan melihat apa yang bisa saya lakukan! Terima kasih banyak!!
, saya tidak di komputer saya untuk memeriksanya. Anda harus bisa mendapatkan hingga 160 karakter, saya pikir.PHP, 155 Bytes
@Crypto -3 Bytes Terima Kasih @Titus -6 Bytes Terima kasih
Cobalah
Pertama kali saya menggunakan print dalam kondisi after loop
Kerusakan
Versi Sebelumnya 174 Bytes
sumber
!($d<2||$a[$d]>0)
=>$d>1&&$a[$d]<1
$l=strlen($m)+1
ke$l=log10($m)+2
$i=$d*$x=$d>1
alih-alih$i=$d<2?0:$d
dan$x
untuk dua kejadian lainnya$d>1
$n*$n>=$i+=$d
alih-alih($i+=$d)<=$m=$n**2
dan$n*$n
untuk kejadian lainnya$m
Groovy,
201195191 BytesIni adalah kluster absolut ... Garis-kiri membunuh jumlah byte saya. Tapi hei, itu berhasil. Inilah output untuk 4:
Tidak Disatukan:
sumber
Perl,
115114113112 byteTermasuk +1 untuk
-a
Jalankan dengan nomor input pada STDIN:
sieving.pl
:Membutuhkan perl yang cukup baru sehingga
-a
menyiratkan-n
. Jika perl Anda terlalu lama, tambahkan-n
opsi.Mencetak baris baru yang diizinkan.
sumber
Python 2,
199 202201 byte+3 byte (saya tidak berhenti lebih awal)
-1 byte berkat @Oliver (melewatkan spasi)
repl.it
sumber
1
danfor
JavaScript (ES6),
190189 byteLangsung mencetak ke konsol.
Demo
Tampilkan cuplikan kode
sumber
Batch, 464 byte
Ini agak melelahkan. Penjelasan: Mulai dengan mengkuadratkan
n
sehingga dapat menghitung lebar kolom yang diinginkanc
, dan jumlah padding yang sesuaip
, menggunakan loop:l
. Loop luar dari1
ken
kemudian berjalan sekali untuk setiap grid, memanggil subrutin:i
. Pertama nilainya diperiksa untuk melihat apakah nilainya 1 atau prima; jika tidak maka grid dilewati. Loop batin dari1
ken*n
kemudian menangani baris dan kolom dari grid, memanggil subrutin:j
. Setiap nilai diperiksa untuk melihat apakah itu adalah salah satu bilangan prima yang ditemukan sejauh ini, atau jika tidak ada bilangan prima yang ditemukan sejauh ini membaginya. Jika demikian maka nilainya disatukan dengan buffer output, yang kemudian diisi dengan lebar kolom yang diinginkan. Buffer dicetak dan dihapus setiapn
baris, dan baris kosong tambahan ditambahkan di ujung kisi. The:f
label menunjukkan subroutine faktor-memeriksa; f (x, y) menambahkan 1 kef
untuk setiap bilangan bulat antara 2 danx
yang membagiy
, tidak termasuky
itu sendiri.sumber
R,
195191185204 byteTerima kasih kepada @Billywob untuk 6 byte tambahan yang disimpan!
Diindentasi, dengan baris baru:
Pemakaian:
sumber
^
adalah satu-satunya yang tidak vektor saat membuat urutan menggunakan:
yang berarti Anda dapat menggunakan misalnya1:2^2
untuk mendapatkan1 2 3 4
. Kedua, jika Anda mendefinisikan,a=b=1:n^2
Anda nantinya dapat menggunakanfor(j in b)
alih-alih mendefinisikan vektor lain untuk mengulang. Harus menghemat beberapa byte.J, 125 byte
Ini eksplisit, bukan J diam-diam, tetapi harus ada cara untuk golf itu diam-diam.
Pemakaian
sumber
Mathematica, 133 byte
sumber
PHP,
155150147145142140 bytekerusakan
sumber
$a[$i]="";
bukannyaunset($a[$i]);
harus menyimpan 4 Bytes$i%$k<1
alih-alih!($i%$k)
menyimpan satu Byte