Kurva aljabar adalah "subset 1D" tertentu dari "bidang-2D" yang dapat digambarkan sebagai seperangkat nol {(x,y) in R^2 : f(x,y)=0 }
dari polinomial f
. Di sini kita menganggap bidang 2D sebagai bidang nyata R^2
sehingga kita dapat dengan mudah membayangkan seperti apa bentuk kurva itu, pada dasarnya benda yang bisa Anda gambar dengan pensil.
Contoh:
0 = x^2 + y^2 -1
lingkaran jari-jari 10 = x^2 + 2y^2 -1
sebuah elips0 = xy
sebuah salib bentuk, pada dasarnya persatuan sumbu x dan sumbu y0 = y^2 - x
sebuah parabola0 = y^2 - (x^3 - x + 1)
sebuah kurva eliptik0 = x^3 + y^3 - 3xy
folium dari Descartes0 = x^4 - (x^2 - y^2)
sebuah lemniscate0 = (x^2 + y^2)^2 - (x^3 - 3xy^2)
sebuah trifolium0 = (x^2 + y^2 - 1)^3 + 27x^2y^2
astroid
Tugas
Diberikan polinomial f
(seperti yang didefinisikan di bawah), dan rentang x / y, menghasilkan gambar hitam dan putih minimal 100x100 piksel yang menunjukkan kurva sebagai garis hitam pada latar belakang putih.
Detail
Warna : Anda dapat menggunakan dua warna lain pilihan Anda, seharusnya mudah membedakannya.
Plot : Alih-alih gambar piksel Anda juga dapat menampilkan gambar ini sebagai ascii-art, di mana latar belakang "piksel" harus spasi / garis bawah atau karakter lain yang "terlihat kosong" dan garis dapat dibuat dari karakter yang terlihat " penuh "suka M
atau X
atau #
.
Anda tidak perlu khawatir tentang aliasing.
Anda hanya perlu memplot garis di mana tanda perubahan polinomial dari satu sisi garis ke yang lain (itu berarti Anda bisa misalnya menggunakan algoritma marching square), Anda tidak perlu memplot dengan benar "kasus patologis seperti di 0 = x^2
mana tanda tidak tidak berubah ketika pergi dari satu sisi garis ke yang lain. Tapi garis harus kontinu dan memisahkan wilayah dari tanda - tanda yang berbeda f(x,y)
.
Polinomial : Polinomial diberikan sebagai (m+1) x (n+1)
matriks / daftar daftar koefisien (nyata), dalam contoh di bawah ini syarat-syarat koefisien diberikan dalam posisi mereka:
[ 1 * 1, 1 * x, 1 * x^2, 1 * x^3, ... , 1 * x^n ]
[ y * 1, y * x, y * x^2, y * x^4, ... , y * x^n ]
[ ... , ... , ... , ... , ... , ... ]
[ y^m * 1, y^m * x, y^m * x^2, y^m * x^3 , ..., y^m * x^n]
Jika Anda suka, Anda dapat mengasumsikan matriks menjadi kuadrat (yang selalu dapat dilakukan dengan zero-padding yang diperlukan), dan jika Anda mau, Anda juga dapat mengasumsikan bahwa ukuran matriks diberikan sebagai input tambahan.
Berikut ini, contoh-contoh dari atas direpresentasikan sebagai matriks yang didefinisikan seperti ini:
Circle: Ellipse: Parabola: Cross: Elliptic Curve: e.t.c
[-1, 0, 1] [-1, 0, 1] [ 0,-1] [ 0, 0] [-1, 1, 0,-1]
[ 0, 0, 0] [ 0, 0, 0] [ 0, 0] [ 0, 1] [ 0, 0, 0, 0]
[ 1, 0, 0] [ 2, 0, 0] [ 1, 0] [ 1, 0, 0, 0]
Uji kasus dengan kisaran x / rentang y:
(Dalam format yang tidak begitu mudah dibaca tetapi lebih baik salin-tempel tersedia di sini di pastebin .)
Circle:
[-1, 0, 1] [-2,2] [-2,2]
[ 0, 0, 0]
[ 1, 0, 0]
Ellipse:
[-1, 0, 1] [-2,2] [-1,1]
[ 0, 0, 0]
[ 2, 0, 0]
Cross:
[ 0, 0] [-1,2] [-2,1]
[ 0, 1]
Parabola:
[ 0,-1] [-1,3] [-2,2]
[ 0, 0]
[ 1, 0]
Elliptic Curve:
[-1, 1, 0,-1] [-2,2] [-3,3]
[ 0, 0, 0, 0]
[ 1, 0, 0, 0]
Folium of Descartes:
[ 0, 0, 0, 1] [-3,3] [-3,3]
[ 0, -3, 0, 0]
[ 0, 0, 0, 0]
[ 1, 0, 0, 0]
Lemniscate:
[ 0, 0, -1, 0, 1] [-2,2] [-1,1]
[ 0, 0, 0, 0, 0]
[ 1, 0, 0, 0, 0]
Trifolium:
[ 0, 0, 0,-1, 1] [-1,1] [-1,1]
[ 0, 0, 0, 0, 0]
[ 0, 3, 2, 0, 0]
[ 0, 0, 0, 0, 0]
[ 1, 0, 0, 0, 0]
Astroid:
[ -1, 0, 3, 0, -3, 0, 1] [-1,1] [-1,1]
[ 0, 0, 0, 0, 0, 0, 0]
[ 3, 0, 21, 0, 3, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0]
[ -3, 0, 3, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0]
[ 1, 0, 0, 0, 0, 0, 0]
Saya mendapatkan inspirasi untuk beberapa kurva dari pdf ini.
m
xn
, tetapi(m+1)
x(n+1)
. Apa yang kita ambil sebagai masukan:,m, n
ataum+1,n+1
? Atau bisakah kita memilih?Jawaban:
Haskell,
283275 byteFungsi
g
harus dipanggil dengan matriks dan dua rentang sebagai argumen. Matriks hanya daftar daftar, rentang masing-masing daftar elemen dua.Di sini keluaran untuk kasus-kasus yang lebih menarik: Perhatikan bahwa saya harus mengurangi ukuran dari 100x100 menjadi sekitar 40x40 sehingga masih pas di konsol (cukup ganti hardcoded 102 ke angka yang lebih kecil). Perhatikan juga bahwa sumbu y mengarah ke bawah.
sumber
$
untuk menyimpan byte. Kedua tempat di mana Andamap
dapat menggunakan(<$>)
, dan karena Anda hanya menggunakane
sekali Anda dapat menarik(0<)
di dalamnya definisi itu. Jugae
bisa dinamai(!)
untuk menyimpan 3 byte.z
memasukkan dalam definisiv
memungkinkan Anda untuk menyingkirkan 4 tanda kurung (sekitarz(&)
danf g
).#
menjadi satu karakter (mis.s
) Dan membuatnya sesuai dengan pola pada daftarg
. (mis.s[a,b]=[a,a+(b-a)/102..b];g m u i=unlines$v[m!y<$>s u|y<-s i]
)Matlab,
11410092 byteAlat yang tepat untuk pekerjaan itu? Saya menggunakan cara menarik Matlab
printf
untuk menghasilkan polinomial sebagai string. Polinomial ini dapat disediakan untukezplot
memplot kurva implisit pada domain yang ditentukan. Agar mudah dibaca, kode disajikan dengan baris baru setelah; yang tidak diperlukan dan tidak dihitung terhadap ukuran.Perkembangan golf sebagai cuplikan yang dapat diperluas.
Tampilkan cuplikan kode
Output dari kasus uji (klik untuk tampilan penuh):
sumber
sprintf/ezplot
!fix
alih-alihfloor
dapat membantu Anda mencapai hitungan byte dua digit :-)[h,w]=size(A);t=0:h*w-1;
untuk menyimpan tiga byte lagi!%.0f
. Itu berarti saya bisa menjatuhkan lantai sama sekali dan biarkanprintf
memperbaikinya!Python 2, 261 byte
Format input:
matrix,xbounds,ybounds
(misalnya[[-1,0,1],[0,0,0],[1,0,0]],[-2,2],[-2,2]
). Format output: PGM polos .Ini memperkirakan jarak dari setiap pusat piksel ke kurva menggunakan pendekatan orde pertama d ( x , y ) = | p ( x , y ) | / | ∇ p ( x , y ) |, di mana ∇ p adalah gradien dari polinomial p . (Ini adalah jarak dari ( x , y ) ke persimpangan bidang tangen pada ( x , y , p ( x , y )) dengan xy .) Kemudian piksel tempat d (x , y) kurang dari satu piksel lebar kurva secara proporsional ke d ( x , y ), menghasilkan garis antialias yang bagus (meskipun itu bukan keharusan).
Berikut adalah grafik yang sama dengan fungsi jarak dibagi 16 untuk membuatnya terlihat.
sumber
print
pernyataan untuk header gambar dan satuprint
pernyataan diwhile
loop untuk nilai setiap piksel.Python 3.5 + MatPlotLib + Numpy, 352 byte:
Fungsi bernama. Cukup lama, tapi hei, saya senang saya bisa menyelesaikan tugas. Mengambil 3 input, yaitu
m by n
matriks,x
-range, dany
-range, yang semuanya harus dalam array (misalnya,[[-1,0,1],[0,0,0],[1,0,0]],[-2,2],[-2,2]
). Menghasilkan grafik yang selesai di jendela baru, grafis, interaktif. Akankah golf ini turun lebih banyak waktu ketika saya bisa, tetapi untuk sekarang, saya senang dengan itu.Hasil Akhir untuk Kasus Uji:
sumber
MATL ,
6761 byteKode ini berjalan pada rilis 18.5.0 bahasa, yang mendahului tantangan. Input menggunakan opsional
m
,n
parameter. Matriks memiliki titik koma sebagai pemisah baris. Format input yang tepat (menggunakan parabola sebagai contoh) adalahKode menghasilkan gambar dengan ukuran 255 × 255. Hal ini dapat diuji dengan menggunakan @Suever 's MATL online compiler, yang antara fitur yang sangat menarik lainnya, termasuk output grafis. Lihat misalnya
Kompiler ini masih dalam tahap percobaan. Silakan laporkan masalah apa pun ke @Suever di obrolan MATL . Jika tombol "Jalankan" tidak berfungsi, coba segarkan halaman dan klik lagi.
Jika Anda lebih suka keluaran ASCII , kode perlu dimodifikasi sedikit (perubahan hanya mempengaruhi dua karakter pertama dan terakhir dari kode di atas):
Ini menghasilkan kisi ASCII 100 × 100 yang menggunakan karakter
*
untuk mewakili kurva. Anda juga dapat menguji ini dengan @Dennis ' Coba online! peron:Perhatikan bahwa rasio aspek keluaran ASCII diubah karena karakternya sedikit lebih tinggi daripada lebar.
Penjelasan
Kode pertama menghitung polinomial dua variabel pada kisi x - y . Ini membuat penggunaan penyiaran , komputasi array 4D menengah di mana masing-masing dimensi mewakili nilai x , nilai y , eksponen x , eksponen y masing-masing.
Dari fungsi itu, garis level nol dihitung. Karena tantangan menentukan bahwa hanya perubahan tanda yang perlu dideteksi, kode tersebut menerapkan konvolusi 2D dengan blok 2 × 2, dan menandai piksel sebagai bagian dari garis jika tidak keempat nilai blok memiliki tanda yang sama.
Semua uji kasus
Berikut adalah semua input dalam format yang sesuai, jika Anda ingin mencoba:
sumber