Retina , 293 + 15 = 308 314 385ไบต์
;`\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>
แต่ละบรรทัดมีไฟล์แยกกันดังนั้นฉันจึงเพิ่ม 13 เข้าไปในจำนวนไบต์ หรือคุณสามารถใส่ไฟล์ทั้งหมดไว้ในไฟล์เดียวได้และใช้-s
แฟล็ก <empty>
ยืนสำหรับไฟล์ที่ว่างเปล่าจริงหรือเส้น
น่าเสียดายที่ฉันต้องการ 187 ไบต์เพียงเพื่อแปลงผลลัพธ์จากนารี่เป็นทศนิยม ฉันคิดว่าฉันควรจริง ๆดำเนินการนี้บางเวลาเร็ว ๆ นี้
คำอธิบาย
Retina เป็นภาษาที่ใช้ regex (ซึ่งฉันเขียนไว้อย่างชัดเจนว่าสามารถทำสิ่งนี้ได้ด้วย regex) แต่ละคู่ของไฟล์ / บรรทัดกำหนดขั้นตอนการเปลี่ยนโดยบรรทัดแรกเป็นรูปแบบและบรรทัดที่สองคือสตริงการแทนที่ รูปแบบสามารถนำหน้าด้วย`
สตริงการกำหนดค่า -delimited ซึ่งอาจมีตัวดัดแปลง regex ปกติรวมถึงตัวเลือกเฉพาะสำหรับ Retina บางตัว สำหรับโปรแกรมข้างต้นตัวเลือกที่เกี่ยวข้องคือ;
ซึ่งจะหยุดการแสดงผลของขั้นตอนนั้นและ+
ใช้การแทนที่ในลูปจนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง
แนวคิดของการแก้ปัญหาคือการนับแต่ละบรรทัดแยกกันเพราะเราสามารถตัดสินใจโดยตัวละครที่พบอยู่แล้วไม่ว่าเราจะอยู่ภายในหรือภายนอกรูปหลายเหลี่ยม นี่ก็หมายความว่าฉันสามารถรวมสิ่งทั้งหมดเข้าด้วยกันเป็นเส้นเดียวเพราะการเริ่มต้นและจุดสิ้นสุดของเส้นนั้นอยู่นอกรูปหลายเหลี่ยมเสมอ นอกจากนี้เรายังสามารถทราบว่า_
และพื้นที่จะสมบูรณ์เหมือนกันสำหรับขั้นตอนวิธีเส้นกวาดเช่นเดียวกับและ\
/
ดังนั้นในขั้นตอนแรกฉันจะแทนที่บรรทัดใหม่และช่องว่าง_
ทั้งหมดและทั้งหมด\
โดย/
การลดความซับซ้อนโค้ดบางส่วนในภายหลัง
ฉันกำลังติดตามสถานะภายใน / ภายนอกปัจจุบันด้วยตัวละครi
และo
ในขณะเดียวกันก็ใช้i
s เพื่อนับพื้นที่ ในการทำเช่นนั้นฉันเริ่มต้นด้วยการเติมo
เพิ่มบรรทัดที่เข้าร่วมเพื่อทำเครื่องหมายว่าเราอยู่นอกรูปหลายเหลี่ยม ฉันยังเพิ่มiio
ส่วนท้ายของอินพุตซึ่งฉันจะใช้เป็นเครื่องมือค้นหาเพื่อสร้างตัวละครใหม่
จากนั้นการแทนที่ครั้งใหญ่ครั้งแรกจะแทนที่i
หรือo
ตามด้วยหนึ่ง/V_L
ในชุดอักขระถัดไปซึ่งจะทำให้น้ำท่วมและรับทราบเรื่องราวทั้งหมด ตารางการแทนที่มีลักษณะดังต่อไปนี้โดยที่คอลัมน์สอดคล้องกับอักขระตัวสุดท้ายในบรรทัดนั้นและแถวไปยังอักขระถัดไป (โดยที่S
สำหรับช่องว่างและ<>
สำหรับสตริงว่าง) ฉันได้รวมอักขระทั้งหมดของอินพุตเพื่อแสดงความเท่าเทียมที่ฉันได้ใช้ไปแล้ว:
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
โปรดทราบว่าอักขระสุดท้ายจะระบุเสมอว่าหลังจากอักขระที่เราอยู่ภายในหรือภายนอกรูปหลายเหลี่ยมในขณะที่จำนวนi
s สอดคล้องกับพื้นที่ที่จำเป็นต้องเพิ่มลงในรูปหลายเหลี่ยม ดังตัวอย่างต่อไปนี้เป็นผลลัพธ์ของการวนซ้ำสี่ครั้งแรกในอินพุตตัวอย่างล่าสุด (นี่สร้างโดยเวอร์ชันเก่าที่แยกแต่ละบรรทัดจริง ๆ แต่หลักการยังคงเหมือนเดิม):
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
สุดท้ายนี้ฉันจะกำจัดตัวแบ่งทั้งหมดo
และตัวแบ่งบรรทัดโดยการลบทุกอย่างที่ตรงกัน[^i]
และส่วนที่เหลือคือการแปลงแบบทศนิยมเป็น unary ซึ่งค่อนข้างน่าเบื่อ