Polygram reguler


16

Mengingat jumlah simpul n ≥ 3dan "ukuran langkah" 1 ≤ m < n/2 (menunjukkan jarak antara dua simpul yang terhubung), output representasi grafis dari poligon reguler yang sesuai . Jika polygram terdiri dari beberapa loop tertutup, setiap loop harus dirender dalam warna garis yang berbeda. (Jika ini kedengarannya membingungkan, contoh-contoh di bawah ini semoga dapat menjelaskan semuanya.)

Aturan

Setiap solusi yang masuk akal untuk masalah ini kemungkinan akan memenuhi aturan-aturan ini secara otomatis - mereka hanya ada di sana untuk meletakkan beberapa batasan pada parameter output untuk mencegah jawaban seperti "Blok hitam ini benar-benar sebuah polygram, tetapi Anda tidak dapat melihatnya karena Saya mengatur lebar garis menjadi lebih dari 9000. "

  • Anda dapat membuat polygram ke file (yang dapat ditulis ke disk atau ke aliran output standar) atau menampilkannya di layar.
  • Anda dapat menggunakan grafik vektor atau raster. Jika output Anda dirasterisasi, gambar Anda harus memiliki dimensi 400x400 piksel atau lebih, dan jari - jari polygram (jarak dari pusat ke setiap titik) harus antara 35% dan 50% dari panjang sisi.
  • Rasio aspek dari polygram harus 1 (sehingga simpulnya terletak pada lingkaran yang tepat) - kanvas gambar mungkin persegi panjang.
  • Garis-garis polygram harus tidak lebih tebal dari 5% dari jari-jari (dan tentu saja, mereka harus memiliki ketebalan non-nol agar dapat terlihat).
  • Anda dapat membuat kapak atau bingkai sebagai tambahan dari polygram, tetapi tidak ada yang lain.
  • Anda dapat memilih warna latar belakang (solid).
  • Untuk polygram yang terdiri dari beberapa loop tertutup, Anda harus mendukung setidaknya 6 warna yang berbeda secara visual , yang semuanya harus berbeda dari latar belakang. (Skala abu-abu baik-baik saja, asalkan warna cukup menyebar melalui spektrum.) Kode Anda masih harus bekerja selama lebih dari 6 loop, tetapi warna tidak harus dapat dibedakan untuk loop tambahan apa pun (yaitu Anda juga dapat menggunakan kembali warna dari loop sebelumnya pada saat itu).

Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.

Contohnya

Berikut adalah semua output hingga n = 16(di mana kolom sesuai dengan ndan baris ke m):

masukkan deskripsi gambar di sini Klik untuk versi yang lebih besar.

Sebagai contoh untuk yang lebih besar n, berikut adalah (n, m) = (29, 11)dan (30, 12):

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini


Bagaimana dengan anti aliasing dan lainnya? (Karena kita berhadapan dengan garis miring)
Pengoptimal

1
@Optimizer Saya tidak akan meresepkan algoritma anti-aliasing. Garis-garis tersebut mungkin alias atau anti-alias selama mereka terlihat jelas. Gunakan penilaian terbaik Anda.
Martin Ender

Jawaban:


5

MATLAB, 85 81

Fungsi ini menampilkan plot di layar.

function f(n,m)
hold all
axis equal
for k=1:gcd(m,n)
plot(i.^(4*(k:m:n^2)/n))
end

Hasil untuk n = 30, m = 12: f (30,12)


Saya tidak yakin ini berhasil; jika saya sudah melakukannya dengan benar, itu akan menampilkan gambar ini selama 30, 12. Lihat: bit.ly/1GFZni7
durron597

@ durron597 Ini benar-benar berfungsi di Matlab, tetapi fungsinya tidak segera dapat digunakan kembali, karena hold allmengarah ke plot berikutnya digambar di atas yang pertama ... Saya tidak tahu apakah kita memiliki konsensus tentang penggunaan kembali fungsi yang akan jujur.
Martin Ender

@ MartinBüttner Seharusnya hold onmenyimpan byte juga; jika Anda menambahkan empat byte itu menjadi dapat digunakan kembali ( clf\n)
durron597

Ternyata kami memiliki konsensus dan saya bahkan memposting pertanyaan dan menjawab sendiri beberapa bulan yang lalu. OO Jadi dengan meta post itu, ini tidak valid tanpa ada sesuatu untuk melepaskan hold.
Martin Ender

@ MartinBüttner Jika Anda berubah hold allke clf\nhold onapakah itu memperbaiki masalah?
durron597

3

CJam, 114

"P2"N400:ASAN6N0aA*aA*q~:M;:K{:CK,f{M*+K%P*2*K/_[mc)\ms)]199f*}_+2ew{~1$.-Af/A,\ff*\f.+{:mo~_3$=@C6%)tt}/}/}/Sf*N*

Ini menghasilkan gambar dalam format ASCII PGM.

Anda dapat mencobanya secara online , tetapi hasilnya cukup panjang. Anda dapat mengubah 400dan 199ke nomor yang lebih kecil untuk mengurangi ukuran gambar.

CJam tidak memiliki konsep gambar, gambar, garis atau bentuk, jadi saya membuat gambar dalam matriks persegi, piksel demi piksel (satu angka mewakili warna abu-abu untuk setiap piksel).

Seperti inilah hasilnya untuk 30 12:

polygram


1

Mathematica, 70 byte

ListPolarPlot[Table[{2Pi(i+j#2)/#,1},{i,GCD@##},{j,#+1}],Joined->1>0]&

Yah ... ini adalah implementasi referensi saya yang mengalahkan kedua kiriman sejauh ini. Saya tidak bermaksud memenangkan tantangan saya sendiri, jadi saya berharap seseorang akan mengalahkan ini.

Outputnya seperti plot dalam tantangan itu sendiri, kecuali saya tidak menghapus sumbu di sini:

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.