Tantangan
Tulis sebuah program yang, diberi boolean array 2 dimensi (ekuivalen, bitmap monokromatik), menghasilkan serangkaian poligon yang menggambarkan garis besar wilayah yang “benar” (1).
Input diberikan sebagai urutan karakter '#'
(hash), ' '
(spasi) dan \n
(baris baru). Garis mungkin berbeda panjangnya, dalam hal ini bagian yang hilang diasumsikan spasi. Keluaran harus berupa daftar (terpisah baris) poligon, setiap poligon diwakili oleh daftar koordinat (dipisahkan koma).
Contoh & Persyaratan
Koordinat harus terdaftar dalam urutan searah jarum jam. Memasukkan:
#
Output yang dapat diterima meliputi:
(0,0), (1,0), (1,1), (0,1) (1,0), (1,1), (0,1), (0,0) (1,1), (0,1), (0,0), (1,0) (0,1), (0,0), (1,0), (1,1)
Wilayah yang terpisah harus mengembalikan banyak poligon. Memasukkan:
# #
Contoh output (output aktual harus terdiri dari dua baris):
(0,0), (1,0), (1,1), (0,1) (2,0), (3,0), (3,1), (2,1)
Lubang-lubang dalam poligon harus terdaftar sebagai poligon terpisah, tetapi dalam urutan anti-jarum jam. Memasukkan:
### # # ###
Contoh output:
(0,0), (3,0), (3,3), (0,3) (1,1), (1,2), (2,2), (2,1)
Anda bebas memilih apakah simpul yang berdekatan secara diagonal bergabung atau tidak. Memasukkan:
# #
Contoh output:
(0,0), (1,0), (1,1), (0,1) (1,1), (2,1), (2,2), (1,2)
atau
(0,0), (1,0), (1,1), (2,1), (2,2), (1,2), (1,1), (0, 1)
Daftar koordinat tidak harus pendek secara optimal. Sebagai contoh:
##
Output yang dapat diterima:
(0,0), (2,0), (2,1), (0,1) // Redundant coordinates along a straight line are acceptable (0,0), (1,0), (2,0), (2,1), (1,1), (0,1) // Duplicate start- and end-point are acceptable (0,0), (2,0), (2,1), (0,1), (0,0)
Seperti biasa, program terpendek "menang".
Jawaban:
Perl,
345311265 karakterKeterbatasan
Asumsikan bahwa input tidak lebih lebar dari 64 karakter (tetapi tingginya pada prinsipnya tidak terbatas). Ini dapat diperluas ke 512 atau 8192 atau kekuatan dua lainnya dengan mengubah konstanta yang relevan, membuat kode hanya sedikit lebih lama.
Versi yang sedikit lebih mudah dibaca
Beberapa kredit masuk ke mob karena baris pertama adalah saya menggunakan kembali idenya dalam laser . Selebihnya adalah pekerjaan saya sepenuhnya.
Suntingan
$x
ketika mengambil belokan karena iterasi berikutnya sudah akan melakukannya1
= turun,2
= kiri ke1
= kiri,2
= turun dan perbarui$d
melalui XOR alih-alih secara langsungsumber
Python, 607 karakter
Kode berfungsi dengan menyimpan daftar batas yang ditemukan sejauh memproses simbol # dalam urutan input. Batas disimpan dalam tabel E yang memetakan tepi (4-tupel dari x_start, y_start, x_end, y_end) ke daftar tepi yang membentuk batas poligon. Saat kami memproses setiap # baru, ia dapat dihubungkan ke poligon di atas (p) atau ke kiri (q). Kode menemukan p dan q menggunakan E dan kemudian menggabungkan batas dari arus # (r) dengan p dan q, jika ada. Kasus di mana p == q menghasilkan lubang.
sumber