El objetivo de esta tarea es identificar, limpiar y marcar todas las caras en cualquier 'imagen' dada.
¿Qué hay en una cara?
Una cara será un cuadrado ZxZ donde Z es un número entero impar mayor que 1. Las esquinas superior izquierda y derecha y el centro serán caracteres 'O', y la línea inferior será una '\' y una '/' rodeando lo suficiente '_' caracteres para llenar el resto de la línea. Ejemplos:
una cara 3x3:
O O
O
\_/
una cara 5x5:
O O
O
\___/
una cara 7x7:
O O
O
\_____/
etc.
Entrada
La entrada estará en STDIN y consistirá en un número de cadenas de caracteres de igual longitud.
Salida
La salida debe ser la entrada con todas las caras reconocibles despejadas (es decir, todos los caracteres, excepto los ojos, la nariz y la boca deben eliminarse de los límites de la cara) y encuadrados (rodeados por caracteres +, - y |). Cuando se superponen dos o más caras, ambas deben borrarse y encuadrarse, pero se debe dar prioridad a la cara más grande (debe colocarse en la parte superior); Si ambas caras son del mismo tamaño, la prioridad queda a discreción del implementador. Si la entrada no tiene caras, la salida debe ser la misma que la entrada.
Algunos ejemplos
Entrada:
*******
*******
**O*O**
***O***
**\_/**
*******
*******
Salida:
*******
*+---+*
*|O O|*
*| O |*
*|\_/|*
*+---+*
*******
Entrada (cara incompleta):
*******
*******
**O*O**
*******
**\_/**
*******
*******
Salida:
*******
*******
**O*O**
*******
**\_/**
*******
*******
Entrada (caras anidadas):
*******
*O***O*
**O*O**
***O***
**\_/**
*\___/*
*******
Salida:
+-----+
|O O|
| |
| O |
| |
|\___/|
+-----+
Entrada (caras múltiples):
~{$FJ*TBNFU*YBVEXGY%
FOCO$&N|>ZX}X_PZ<>}+
X$OOPN ^%£)LBU{JJKY%
@\_/$£!SXJ*)KM>>?VKH
SDY%£ILO(+{O:HO(UR$W
XVBFTER^&INLNLO*(&P:
>?LKPO)UJO$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@\___/GER%^*BI
@{PO{_):<>KNUYT*&G&^
Salida:
+---+*TBNFU*YBVEXGY%
|O O|&N|>ZX}X_PZ<>}+
| O |N ^%£)LBU{JJKY%
|\_/|£+-----+M>>?VKH
+---+I|O O|HO(UR$W
XVBFTE| |LO*(&P:
>?LKPO| O |&L:}~{&
~@?}{)| |@~}P>OU
:@<L::|\___/|ER%^*BI
@{PO{_+-----+YT*&G&^
Entrada (cerca del límite):
~{$FJ*TBNFU*YBVEXGY%
OCO$&N|>ZX}X_PZ<>}+^
$OOPN ^%£)LBU{JJKY%{
\_/$£!SXJ*)KM>>?VKHU
SDY%£ILO(+{8:HO(UR$W
XVBFTER^&INLNLO*(&P:
>?LKPO)UJ^$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@BJYT*GER%^*BI
@{PO{_):<>KNUYT*&G&^
Salida:
---+J*TBNFU*YBVEXGY%
O O|&N|>ZX}X_PZ<>}+^
O |N ^%£)LBU{JJKY%{
\_/|£!SXJ*)KM>>?VKHU
---+£ILO(+{8:HO(UR$W
XVBFTER^&INLNLO*(&P:
>?LKPO)UJ^$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@BJYT*GER%^*BI
@{PO{_):<>KNUYT*&G&^
Entrada (caras superpuestas):
~{$FJ*TBNFU*YBVEXGY%
FXC£$&N|>ZX}X_PZ<>}+
X$*OPN O%£)LBO{JJKY%
@:U%$£!SXJ*)KM>>?VKH
SDY%£OLO(+{P:HO(UR$W
XVBFTER^&IOLNLO*(&P:
>?L\___/JR$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@\_____/R%^*BI
@{PO{_):<>KNUYT*&G&^
Salida:
~{$FJ*TBNFU*YBVEXGY%
FX+---+-------+Z<>}+
X$|O |O O|JJKY%
@:| | |>?VKH
SD| O| |(UR$W
XV| | O |*(&P:
>?|\__| |:}~{&
~@+---| |}P>OU
:@<L::|\_____/|%^*BI
@{PO{_+-------+*&G&^
Respuestas:
Ruby,
304298295 caracteresSe prefiere la esquina inferior derecha en la superposición si las caras son del mismo tamaño. Por ejemplo, para la entrada
reconoce las cuatro caras y rinde
Edición 1: como Lowjacker propuso, podemos reemplazarlo
index
con una coincidencia de expresiones regulares (-3 caracteres). Además,+1
se puede compensar con un carácter ficticio adicional antes de la coincidencia, lo que ahorra otro carácter (-2 para el carácter+1
, +3 para el carácter ficticio, -2 porque los corchetes ya no son necesarios). Dos más ya que podemos escribir el rango también sin corchetes.Edición 2: Otros dos caracteres guardados reemplazando ambos
if
con&&
y otro eliminando completamente el rango.fuente
(O=~/$/)
lugar deO.index($/)
en la tercera línea (guarda 3 caracteres).if
declaraciones con&&
.Python -
1199941El problema me pareció bastante interesante, así que lo resolví en Python. Aquí está el código comprimido.
Aquí está el código más legible:
fuente