Mari kita buat kisi N × N spasi dan garis bawah yang dapat digunakan untuk menentukan secara visual apakah suatu bilangan prima. (N dapat berupa bilangan bulat positif.)
Grid ini memiliki tiga aturan sederhana:
- Kolom ke-n berisi pola berulang garis bawah n-1 diikuti oleh satu spasi. Pola ini dimulai pada baris pertama dan dihentikan, mungkin pola menengah, di baris N. (Baris dan kolom diindeks 1).
- Kolom pertama diganti dengan semua garis bawah, bukan semua spasi.
- Jika spasi terjadi di suatu tempat indeks baris sama dengan indeks kolom itu diganti dengan garis bawah.
Contoh: N = 10
1
1234567890 <-- column indices
1__________
2__________
3__________
4_ ________
5__________
6_ _______
7__________
8_ _ ______
9__ _______
10_ __ _____
^ row indices
Indeks hanya untuk kejelasan. Grid polos itu sendiri (apa yang harus dihasilkan oleh program Anda) adalah:
__________
__________
__________
_ ________
__________
_ _______
__________
_ _ ______
__ _______
_ __ _____
Perhatikan itu:
- Kolom pertama adalah semua garis bawah.
- Kolom kedua adalah spasi garis bawah, ruang garis bawah, dll., Kecuali untuk garis bawah pada baris 2.
- Kolom ketiga bertuliskan garis bawah garis bawah, garis bawah garis bawah, dll., Kecuali garis bawah pada baris 3.
- dll.
Perhatikan juga bahwa selain 1, hanya baris bernomor prima yang memiliki garis bawah di setiap kolom.
Karena garis bawah membentang di seluruh lebar font, setiap baris bilangan prima membentuk garis solid kontinu. Jadi memeriksa apakah suatu bilangan prima atau tidak cukup mudah secara visual; cukup periksa apakah garisnya padat di semua kolom. (Kenyataannya melihat ke akar kuadrat dari indeks baris sudah cukup tetapi menghasilkan kisi itu tampak kurang elegan.)
Program
Tulis program yang akan menggambar kisi-kisi ini dengan N melalui stdin (atau alternatif terdekat). Output menuju ke stdout (atau alternatif terdekat) dan seharusnya hanya berisi spasi, garis bawah, dan baris baru, dengan baris tambahan tambahan baru.
Kode terpendek menang.
n
baris th, buatk
karakter th spasi jikak
merupakan pembagi darim
yang bukan 1 ataum
.Jawaban:
CJam,
332827 byteCobalah online.
Bagaimana itu bekerja
Contoh dijalankan
sumber
Ruby,
7773 karakterBeberapa trik yang saya gunakan:
The
..
operator memiliki hampir prioritas terendah dari semua operator di Ruby, sehingga(1..n=gets.to_i)
hanya bekerja.Alih-alih menambahkan
a!=1
kondisi tambahan saat memeriksa untuk melihat apakah karakter harus berupa spasi alih-alih garis bawah (karena baris pertama adalah semua garis bawah), saya hanya memulai rentang dari2
dan menambahkan tambahan?_
.Jalur A dapat menjadi jalur B:
karena saya harus memiliki ruang ekstra di antara
b
dan?
di baris A, tapi itu tidak diperlukan antara0
dan?
di baris B.b?
adalah metode Ruby yang valid, tetapi0?
tidak.puts
akan secara otomatis bergabung dengan array dengan baris baru untuk Anda, menghilangkan kebutuhan akan tambahan*"\n"
.Output untuk
n=100
:Sekarang termasuk Extra-Special ™ Mega-Colorful Red © Highlight-Magic ™ ® Extended Edition ©: (klik thumbnail untuk memperbesar)
Ruby dengan warna, 110 karakter
sumber
' '
. Ini mungkin mengacaukan stabilo sintaks Anda, tetapi masih berfungsi dengan baik. Juga,a%b<1
*''
akan bekerja sama dengan bergabung, dan Anda dapat memeriksaa<b
alih - aliha!=b
karena tidak ada faktor a yang lebih besar dari a. Mungkin juga ada penghematan dari mengiris string dua karakter dengan hasil dari beberapa matematika pada a dan b daripada menggunakan ternary.J - 28 char
Dijelaskan oleh ledakan:
Seperti apa rupanya:
sumber
Python 2,
7671Tidak yakin apakah itu bisa mendapatkan lebih pendek dari ini ... Kata kunci ini:
range
,input
danprint
biaya cukup banyak.sumber
i>j>1and i%j<1
dengani>j>1>i%j
i%j<1<j<i
:-P. Jadi mungkin itu benar-benar tidak menjadi lebih pendek.i%j<1
. Ini menyiratkani>=j
.i>j
,i>=j
untuk tidak menghindari kekosongan pada diagonal.APL (28)
Penjelasan:
⍳2⍴⎕
: membaca angka N dan membuat matriks koordinat N-by-N(
...)/¨
: untuk setiap pasangan koordinat, terapkan fungsi berikut:0=|⍨
: ymod
x = 0, dan≠
: x tidak sama dengan y, dan1≠⊢
: x tidak1
.1+
: Tambahkan1
ke matriks bit yang dihasilkan karena array APL mulai dari 1.'_ '[
...]
: ganti masing1
- masing dengan garis bawah dan2
spasi.sumber
Perl,
6961Versi terbaru (terima kasih, Dennis !)
Versi asli:
sumber
join
atau2..$n
kebutuhan kurung. 2. Dengan-n
sakelar, Anda dapat menggunakan$_
sebagai ganti$n
. 3._
adalah kata pengantar yang valid, jadi tidak perlu penawaran. 4. Anda bisa menggunakannya$"
sebagai ganti" "
. 5. Anda bisa menggunakannya|
sebagai gantinya||
.-n
hal itu karena saya ingin menjadikannya program yang mandiri dan tidak harus mengatakannya$^N=1
. Penggunaan_
sebagai kata pengantar bekerja dalam kasus$i==_
tetapi tidak bekerja dalam kasus$i%_
karena parser pikir%_
adalah hash.#!/bin/perl -n
biasanya dihitung sebagai 1 byte), tetapi itu jelas terserah Anda. Saya tidak tahu apa yang$^N=1
dilakukan ... 2.$i==_
tidak akan berfungsi dengan baik; itu akan menguji apakah$i == "_"
. Apa yang saya maksudkan adalah menggunakan_
alih-alih"_"
, yaitu,say _
dan$i==$_?_:$"
._
="_"
sekarang. Sayangnya, ia berfungsi dalam kasus yang terakhir tetapi memberi saya kesalahan di sebelahsay
karena tampaknya berpikir itu adalah filehandle.CJam, 27 byte
Cobalah online.
Pendekatan ini mencapai jumlah byte yang sama dengan jawaban saya yang lain, tetapi saya pikir itu layak untuk dikirim. Alih-alih menandai kelipatan yang tepat di setiap baris, ia melakukan persis seperti yang dikatakan spesifikasi.
Bagaimana itu bekerja
Contoh dijalankan
sumber
C, 143
C jelas bukan pilihan bahasa yang tepat untuk ini. Tetapi untuk kelengkapan, inilah salah satu cara yang mungkin untuk melakukannya dalam C. Bekerja untuk nilai n hingga 1048575. Membaca n dari input standar.
Ini sangat cepat.
Runtime untuk n = 1.000.000 (yang menghasilkan kisi elemen 1.000.000.000.000) adalah sekitar 55 menit pada sistem saya.
Runtime untuk n = 1000 (yang menghasilkan grid 1.000.000 elemen) kurang dari 1/100 detik.
sumber
int
, sehingga Anda dapat menggunakanchar x[1<<20];n,i,j;main...
. 3.for(scanf("%d",&n);i++<n;)
menghemat dua byte lebihscanf("%d",&n);for(;++i<=n;)
.