Сітківка , 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. Для вищевказаної програми є відповідними параметрами ;
, які пригнічують вихід цього етапу, і +
який застосовує заміну в циклі, поки результат не перестане змінюватися.
Ідея рішення полягає в тому, щоб рахувати кожен рядок окремо, тому що ми завжди можемо визначитись із вже зустрічаються символами, знаходимось ми всередині або поза полігоном. Це також означає, що я можу об'єднати всю річ в одну лінію, тому що перехід початку та кінця рядка завжди знаходиться поза полігоном. Можна також відзначити, що _
і простір повністю ідентичний для алгоритму розгортання ліній, а також \
і та /
. Тому в якості першого кроку я замінюю всі нові рядки та пробіли на _
все \
, /
щоб згодом спростити деякий код.
Я відстеженням поточного внутрішнього / зовнішнього стану з символами 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
розривів s та рядків, видаляючи все, що відповідає [^i]
, а решта - перетворення від десятків до одинарних, яке досить нудне.