O objetivo desta tarefa é identificar, limpar e marcar todos os rostos em qualquer "imagem".
O que há em um rosto?
Uma face será um quadrado ZxZ onde Z é um número inteiro ímpar maior que 1. Os cantos superiores esquerdo e direito e o centro serão caracteres 'O', e a linha inferior será um '\' e um '/' circundando o suficiente caracteres '_' para preencher o restante da linha. Exemplos:
uma face 3x3:
O O
O
\_/
uma face 5x5:
O O
O
\___/
uma face 7x7:
O O
O
\_____/
etc.
Entrada
A entrada estará em STDIN e consistirá em um número de seqüências de caracteres de comprimento igual.
Resultado
A saída deve ser a entrada com todos os rostos reconhecíveis limpos (ou seja, todos os caracteres, exceto os olhos, nariz e boca, devem ser removidos dentro dos limites do rosto) e encaixotados (cercados por caracteres +, - e |). Onde duas ou mais faces se sobrepõem, ambas devem ser limpas e encaixotadas, mas deve ser dada prioridade à face maior (ela deve ser colocada em cima); se as duas faces tiverem o mesmo tamanho, a prioridade será deixada ao critério do implementador. Se a entrada não tiver faces, a saída deve ser a mesma que a entrada.
Alguns exemplos
Entrada:
*******
*******
**O*O**
***O***
**\_/**
*******
*******
Resultado:
*******
*+---+*
*|O O|*
*| O |*
*|\_/|*
*+---+*
*******
Entrada (face incompleta):
*******
*******
**O*O**
*******
**\_/**
*******
*******
Resultado:
*******
*******
**O*O**
*******
**\_/**
*******
*******
Entrada (faces aninhadas):
*******
*O***O*
**O*O**
***O***
**\_/**
*\___/*
*******
Resultado:
+-----+
|O O|
| |
| O |
| |
|\___/|
+-----+
Entrada (várias faces):
~{$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&^
Resultado:
+---+*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 (perto do limite):
~{$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&^
Resultado:
---+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 (faces sobrepostas):
~{$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&^
Resultado:
~{$FJ*TBNFU*YBVEXGY%
FX+---+-------+Z<>}+
X$|O |O O|JJKY%
@:| | |>?VKH
SD| O| |(UR$W
XV| | O |*(&P:
>?|\__| |:}~{&
~@+---| |}P>OU
:@<L::|\_____/|%^*BI
@{PO{_+-------+*&G&^
Respostas:
Ruby,
304298295 caracteresO canto inferior direito é preferido na sobreposição se as faces tiverem o mesmo tamanho. Por exemplo, para a entrada
reconhece todas as quatro faces e produz
Edit 1: Como Lowjacker propôs, podemos substituir o
index
por uma correspondência de regex (-3 caracteres). Além disso, ele+1
pode ser compensado por um caractere adicional antes da correspondência, o que salva outro caractere (-2 para o caractere+1
+3 para caractere simulado, -2 porque colchetes não são mais necessários). Mais dois, já que podemos escrever o intervalo também sem colchetes.Editar 2: Outros dois caracteres salvos substituindo ambos
if
por&&
e outro removendo completamente o intervalo.fonte
(O=~/$/)
vez deO.index($/)
na terceira linha (salva 3 caracteres).if
instruções por&&
.Python -
1199941Achei o problema bastante interessante, então resolvi em Python. Aqui está o código compactado.
Aqui está o código mais legível:
fonte