Retina , 293 + 15 = 308 314 385 byte
;`\s
_
;`\\
/
;`.+
o$0iio
;+`(o(?=/.*(i)|L.*(ii)|V.*(io)|_)|i(?=/.*(io)|L.*(o)|_.*(ii)|V.*(i))).
$1$2$3$4$5$6$7$8
;`o
<empty>
;`ii$
#:0123456789
;+`^(?=i)(i*)\1{9}(?=#.*(0)|i#.*(1)|ii#.*(2)|iii#.*(3)|iiii#.*(4)|iiiii#.*(5)|iiiiii#.*(6)|iiiiiii#.*(7)|iiiiiiii#.*(8)|iiiiiiiii#.*(9))
$1#$2$3$4$5$6$7$8$9$10$11
:.*|\D
<empty>
Setiap baris masuk dalam file yang terpisah, jadi saya telah menambahkan 13 ke jumlah byte. Atau, Anda dapat meletakkan semua itu dalam satu file apa adanya dan menggunakan -s
bendera. The <empty>
berdiri untuk file benar-benar kosong atau baris.
Sayangnya, saya perlu 187 byte hanya untuk mengubah hasil dari unary ke desimal. Saya kira saya benar-benar harus menerapkan ini dalam waktu dekat .
Penjelasan
Retina adalah bahasa berbasis regex (yang saya tulis persis karena bisa melakukan hal-hal seperti ini dengan regex). Setiap pasangan file / baris menentukan tahap penggantian, dengan baris pertama menjadi pola dan baris kedua sebagai string pengganti. Pola dapat didahului oleh `
string konfigurasi -dimited, yang mungkin berisi pengubah regex biasa, serta beberapa opsi khusus Retina. Untuk program di atas, opsi yang relevan adalah ;
, yang menekan output dari tahap itu dan +
, yang menerapkan penggantian dalam satu lingkaran sampai hasilnya berhenti berubah.
Gagasan solusinya adalah menghitung setiap baris secara terpisah, karena kita selalu dapat memutuskan oleh karakter yang sudah kita temui apakah kita di dalam atau di luar poligon. Ini juga berarti saya dapat menggabungkan semuanya menjadi satu baris, karena awal dan akhir baris selalu di luar poligon. Kami juga dapat mencatat bahwa _
dan ruang benar-benar identik untuk algoritme garis, serta \
dan /
. Jadi sebagai langkah pertama saya mengganti semua baris baru dan spasi dengan _
dan semua \
dengan /
menyederhanakan beberapa kode nanti.
Saya melacak keadaan dalam / luar saat ini dengan karakter i
dan o
, sementara juga menggunakan i
s untuk menghitung daerah. Untuk melakukannya, saya mulai dengan menambahkan sebuah o
ke baris yang bergabung untuk menandai bahwa kita berada di luar poligon. Saya juga menambahkan iio
hingga akhir input, yang akan saya gunakan sebagai pencarian untuk menghasilkan karakter baru.
Kemudian, penggantian besar pertama hanya mengganti i
atau o
diikuti oleh salah satu dari /V_L
set karakter berikutnya, sehingga membanjiri dan menghitung seluruh hal. Tabel penggantian terlihat sebagai berikut, di mana kolom terkait dengan karakter terakhir di baris itu dan baris ke karakter berikutnya (di mana S
adalah untuk ruang dan <>
untuk string kosong). Saya telah memasukkan semua karakter input untuk menunjukkan persamaan yang telah saya manfaatkan:
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
Perhatikan bahwa karakter terakhir kemudian selalu menunjukkan apakah setelah karakter kita berada di dalam atau di luar poligon, sementara jumlah i
s sesuai dengan area yang perlu ditambahkan ke poligon. Sebagai contoh di sini adalah hasil dari empat iterasi pertama pada input contoh terakhir (ini dihasilkan oleh versi lama yang sebenarnya membanjiri setiap baris secara terpisah, tetapi prinsipnya masih sama):
o /V\
o / \___
o L _/
o/\/ /V
oL__ _/
o V
o /V\
o / \___
o L _/
oi\/ /V
oii__ _/
o V
o /V\
o/ \___
oL _/
oiio/ /V
oiiii_ _/
o V
o/V\
oi \___
oii _/
oiioi /V
oiiiiii _/
oV
oiV\
oiii \___
oiiii _/
oiioiii /V
oiiiiiiii_/
oio
Terakhir, saya menyingkirkan semua o
s dan garis terputus dengan menghapus semua yang cocok [^i]
, dan sisanya adalah konversi desimal ke unary yang agak membosankan.