Marching Squares adalah algoritma dari grafik komputer, yang digunakan untuk memulihkan isocontour 2D dari grid sampel (lihat juga, kakaknya Marching Cubes untuk pengaturan 3D). Idenya adalah untuk memproses setiap sel dari grid secara independen, dan menentukan kontur melewati sel berdasarkan nilai-nilai di sudut-sudutnya.
Langkah pertama dalam proses ini adalah untuk menentukan tepi mana yang dihubungkan oleh kontur, berdasarkan pada apakah sudut di atas atau di bawah nilai kontur. Untuk kesederhanaan, kami hanya akan mempertimbangkan kontur sepanjang nilainya 0
, sehingga kami tertarik pada apakah sudutnya positif atau negatif. Ada beberapa kasus yang harus dibedakan:24 = 16
Sumber Gambar: Wikipedia
Identifikasi putih dan hitam tidak terlalu penting di sini, tetapi untuk kepastian mengatakan bahwa putih adalah positif dan hitam adalah negatif. Kami akan mengabaikan kasus di mana salah satu sudutnya persis 0
.
Poin sadel (kasus 5 dan 10) memberikan sedikit kesulitan ekstra: tidak jelas diagonal mana yang harus digunakan dengan hanya melihat sudut-sudutnya. Ini dapat diatasi dengan menemukan rata-rata empat sudut (yaitu perkiraan nilai tengah), dan memilih diagonal sedemikian rupa sehingga kontur memisahkan pusat dari sudut dengan tanda yang berlawanan. Jika rata-rata tepat 0
, kedua kasus dapat dipilih.
Biasanya, 16 kasus ini hanya disimpan dalam tabel pencarian. Ini bagus untuk efisiensi, tetapi tentu saja, kami lebih suka kodenya pendek di sini. Jadi tugas Anda adalah melakukan langkah pencarian ini dan mencetak representasi ASCII dari case dalam kode sesedikit mungkin.
Tantangan
Anda diberi nilai empat sudut (bilangan bulat tidak nol) dalam urutan pilihan Anda yang tetap. Anda kemudian harus menghasilkan tata letak kontur yang benar, menyelesaikan kasus sadel dengan benar.
Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter fungsi (keluar).
Input dapat diambil dalam format string atau daftar yang nyaman.
Ke 16 kasus akan diwakili dalam seni ASCII menggunakan salah satu dari blok 5x5 berikut:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Anda tidak boleh mencetak spasi putih depan atau belakang, tetapi Anda dapat mencetak satu baris opsional tunggal.
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Uji Kasus
Tes kasus berasumsi masukan yang diberikan dalam rangka top-kiri , kanan atas , kiri bawah , kanan bawah . Kasus uji disajikan dalam 9 kelompok, satu sesuai dengan masing-masing dari 9 representasi yang diberikan di atas (dalam urutan yang sama, mulai dari sel kosong, berakhir dengan dua titik sadel).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Selain itu, kasus uji berikut dapat mengembalikan salah satu dari poin pelana (pilihan Anda):
[1, -4, -2, 5]
[-1, 4, 2, -5]