Celem tego zadania jest identyfikacja, oczyszczenie i zaznaczenie wszystkich twarzy na danym „obrazie”.
Co masz na twarzy?
Twarz będzie kwadratem ZxZ, gdzie Z jest nieparzystą liczbą całkowitą większą niż 1. Górny lewy i prawy róg, a środek będą znakami „O”, a dolny wiersz będzie wystarczająco otaczającym „\” i „/” Znaki „_” wypełniają resztę wiersza. Przykłady:
twarz 3x3:
O O
O
\_/
twarz 5x5:
O O
O
\___/
twarz 7x7:
O O
O
\_____/
itp.
Wejście
Dane wejściowe będą na STDIN i będą składać się z szeregu ciągów znaków o jednakowej długości.
Wynik
Dane wyjściowe powinny być danymi wejściowymi z wyczyszczonymi wszystkimi rozpoznawalnymi twarzami (tj. Wszystkie postacie oprócz oczu, nosa i ust powinny być usunięte z granic twarzy) i umieszczone w ramkach (otoczone znakami +, - i |). Tam, gdzie dwie lub więcej twarzy zachodzą na siebie, obie powinny zostać wyczyszczone i zapakowane w pudełka, ale pierwszeństwo należy przyznać większej twarzy (należy ją umieścić na górze); jeśli obie twarze są tego samego rozmiaru, priorytet pozostawia się osobie wdrażającej. Jeśli wejście nie ma twarzy, wyjście powinno być takie samo jak wejście.
Kilka przykładów
Wejście:
*******
*******
**O*O**
***O***
**\_/**
*******
*******
Wynik:
*******
*+---+*
*|O O|*
*| O |*
*|\_/|*
*+---+*
*******
Dane wejściowe (niekompletna twarz):
*******
*******
**O*O**
*******
**\_/**
*******
*******
Wynik:
*******
*******
**O*O**
*******
**\_/**
*******
*******
Dane wejściowe (zagnieżdżone twarze):
*******
*O***O*
**O*O**
***O***
**\_/**
*\___/*
*******
Wynik:
+-----+
|O O|
| |
| O |
| |
|\___/|
+-----+
Dane wejściowe (wiele twarzy):
~{$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&^
Wynik:
+---+*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&^
Dane wejściowe (w pobliżu granicy):
~{$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&^
Wynik:
---+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&^
Dane wejściowe (nakładające się twarze):
~{$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&^
Wynik:
~{$FJ*TBNFU*YBVEXGY%
FX+---+-------+Z<>}+
X$|O |O O|JJKY%
@:| | |>?VKH
SD| O| |(UR$W
XV| | O |*(&P:
>?|\__| |:}~{&
~@+---| |}P>OU
:@<L::|\_____/|%^*BI
@{PO{_+-------+*&G&^
Odpowiedzi:
Ruby,
304298295 znakówDolny prawy jest preferowany na zakładce, jeśli twarze są identyczne. Np. Dla wejścia
rozpoznaje wszystkie cztery twarze i daje
Edycja 1: Zgodnie z propozycją Lowjackera możemy zamienić na
index
wyrażenie regularne (-3 znaki). Ponadto+1
można to zrekompensować dodatkowym smoczkiem przed dopasowaniem, co oszczędza inny znak (-2 dla+1
, +3 dla smoczego, -2, ponieważ nawiasy nie są już potrzebne). Jeszcze dwa, ponieważ możemy napisać zakres również bez nawiasów.Edit 2: Kolejne dwa znaki zapisane przez zastąpienie zarówno
if
z&&
, a drugi całkowicie usuwając zakres.źródło
(O=~/$/)
zamiastO.index($/)
w trzeciej linii (zapisuje 3 znaki).if
wyciągi&&
.Python -
1199941Znalazłem problem dość interesujący, więc rozwiązałem go w Pythonie. Oto skompresowany kod.
Oto bardziej czytelny kod:
źródło