Võng mạc , 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>
Mỗi dòng đi trong một tệp riêng biệt, vì vậy tôi đã thêm 13 vào số byte. Ngoài ra, bạn có thể đặt tất cả trong một tệp như cũ và sử dụng -s
cờ. Giá <empty>
đỡ cho các tập tin hoặc dòng thực sự trống.
Thật không may, tôi cần 187 byte chỉ để chuyển đổi kết quả từ đơn nguyên sang thập phân. Tôi đoán tôi thực sự nên thực hiện điều này một thời gian sớm .
Giải trình
Retina là một ngôn ngữ dựa trên regex (mà tôi đã viết chính xác để có thể làm những thứ như thế này với regex). Mỗi cặp tệp / dòng xác định một giai đoạn thay thế, với dòng đầu tiên là mẫu và dòng thứ hai là chuỗi thay thế. Các mẫu có thể được đi trước bởi một `
chuỗi cấu hình được phân tách, có thể chứa các bộ sửa đổi biểu thức chính quy thông thường, cũng như một số tùy chọn dành riêng cho Retina. Đối với chương trình trên, các tùy chọn có liên quan là;
, triệt tiêu đầu ra của giai đoạn đó và+
đó và áp dụng thay thế trong một vòng lặp cho đến khi kết quả dừng thay đổi.
Ý tưởng của giải pháp là đếm từng dòng riêng biệt, bởi vì chúng ta luôn có thể quyết định bởi các ký tự đã gặp dù chúng ta ở trong hay ngoài đa giác. Điều này cũng có nghĩa là tôi có thể nối toàn bộ mọi thứ thành một dòng duy nhất, bởi vì việc bắt đầu và kết thúc một dòng luôn nằm ngoài đa giác. Chúng ta cũng có thể lưu ý rằng _
và không gian hoàn toàn giống nhau cho thuật toán quét dòng, cũng như \
và /
. Vì vậy, như một bước đầu tiên tôi thay thế tất cả dòng mới và không gian bằng _
và tất cả\
bằng cách /
để đơn giản hóa một số mã sau này.
Tôi đang theo dõi trạng thái bên trong / bên ngoài hiện tại với các ký tự i
và o
, đồng thời sử dụng i
s để kiểm đếm khu vực. Để làm như vậy tôi bắt đầu bằng cách đăng ký trướco
dòng vào đường nối để đánh dấu rằng chúng ta nằm ngoài đa giác. Tôi cũng đang thêm một iio
phần cuối của đầu vào, mà tôi sẽ sử dụng như một tra cứu để tạo các ký tự mới.
Sau đó, sự thay thế lớn đầu tiên chỉ đơn giản là thay thế một i
hoặc o
theo sau bằng một trong /V_L
các ký tự tiếp theo, do đó làm ngập và kiểm soát toàn bộ sự việc. Bảng thay thế trông như sau, trong đó các cột tương ứng với ký tự cuối cùng trong dòng đó và các hàng cho ký tự tiếp theo (nơi S
dành cho không gian và <>
cho một chuỗi trống). Tôi đã bao gồm tất cả các ký tự của đầu vào để hiển thị các tương đương mà tôi đã sử dụng:
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
Lưu ý rằng ký tự cuối cùng sau đó luôn cho biết sau ký tự chúng ta ở bên trong hay bên ngoài đa giác, trong khi số i
s tương ứng với khu vực cần thêm vào đa giác. Như một ví dụ ở đây là kết quả của bốn lần lặp đầu tiên trên đầu vào ví dụ cuối cùng (điều này được tạo bởi một phiên bản cũ thực sự tràn ngập từng dòng riêng biệt, nhưng nguyên tắc vẫn giống nhau):
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
Cuối cùng, tôi loại bỏ tất cả các o
s và ngắt dòng bằng cách loại bỏ mọi thứ phù hợp [^i]
và phần còn lại là chuyển đổi thập phân sang đơn nhất, khá nhàm chán.