Retina , 293 + 15 = 308 314 385 bytes
;`\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>
Cada línea va en un archivo separado, así que agregué 13 al conteo de bytes. Alternativamente, puede poner todo eso en un solo archivo tal como está y usar la -s
bandera. El <empty>
soporte para archivos o líneas realmente vacías.
Desafortunadamente, necesito 187 bytes solo para convertir el resultado de unario a decimal. Creo que realmente debería implementar esto pronto .
Explicación
La retina es un lenguaje basado en expresiones regulares (que escribí exactamente para poder hacer cosas como esta con expresiones regulares). Cada par de archivos / líneas define una etapa de reemplazo, siendo la primera línea el patrón y la segunda línea la cadena de reemplazo. Los patrones pueden estar precedidos por una `
cadena de configuración delimitada, que puede contener los modificadores de expresiones regulares habituales, así como algunas opciones específicas de Retina. Para el programa anterior, las opciones relevantes son ;
, que suprime la salida de esa etapa y +
, que aplica el reemplazo en un bucle hasta que el resultado deja de cambiar.
La idea de la solución es contar cada línea por separado, porque siempre podemos decidir por los caracteres ya encontrados si estamos dentro o fuera del polígono. Esto también significa que puedo unir todo en una sola línea, porque ir al principio y al final de una línea siempre está fuera del polígono. También podemos observar que _
y el espacio son completamente idénticos para un algoritmo de barrido de línea, así como \
y /
. Por lo tanto, como primer paso sustituyo todos los saltos de línea y espacios por _
y todo \
por /
simplificar algo de código más adelante.
Estoy realizando un seguimiento del estado actual interno / externo con los caracteres i
y o
, al mismo tiempo, uso el i
s para registrar el área. Para hacerlo, empiezo anteponiendo una o
a la línea unida para marcar que estamos fuera del polígono. También estoy agregando un iio
al final de la entrada, que usaré como una búsqueda para generar nuevos caracteres.
Luego, el primer reemplazo grande simplemente reemplaza uno i
o o
seguido por uno de /V_L
los siguientes caracteres, inundando y contando todo. La tabla de reemplazo se ve de la siguiente manera, donde las columnas corresponden al último carácter en esa línea y las filas al siguiente carácter (donde S
es para el espacio y <>
para una cadena vacía). He incluido todos los caracteres de la entrada para mostrar las equivalencias que ya utilicé:
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
Tenga en cuenta que el carácter final siempre indica si después del carácter estamos dentro o fuera del polígono, mientras que el número de i
s corresponde al área que debe agregarse al polígono. Como ejemplo, aquí están los resultados de las primeras cuatro iteraciones en la última entrada de ejemplo (esto fue generado por una versión anterior que en realidad inundó cada línea por separado, pero el principio sigue siendo el mismo):
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
Por último, me deshago de todos los o
s y los saltos de línea eliminando todo lo que coincide [^i]
, y el resto es la conversión de decimal a unario, que es bastante aburrida.