Ziel dieser Aufgabe ist es, alle Gesichter in einem bestimmten „Bild“ zu identifizieren, zu bereinigen und zu markieren.
Was steckt in einem Gesicht?
Eine Fläche ist ein ZxZ-Quadrat, wobei Z eine ungerade Ganzzahl größer als 1 ist. Die obere linke und rechte Ecke und die Mitte sind 'O'-Zeichen, und die untere Zeile ist ein' \ 'und ein' / ', die genug umgeben '_' Zeichen, um den Rest der Zeile auszufüllen. Beispiele:
ein 3x3 Gesicht:
O O
O
\_/
ein 5x5 Gesicht:
O O
O
\___/
ein 7x7 Gesicht:
O O
O
\_____/
usw.
Eingang
Die Eingabe erfolgt über STDIN und besteht aus einer Reihe von Zeichenfolgen gleicher Länge.
Ausgabe
Die Ausgabe sollte die Eingabe sein, bei der alle erkennbaren Gesichter gelöscht sind (dh alle Zeichen mit Ausnahme von Augen, Nase und Mund müssen innerhalb der Gesichtsgrenzen entfernt werden) und umrahmt (umgeben von den Zeichen +, - und |). Wenn sich zwei oder mehr Gesichter überlappen, sollten beide gelöscht und eingerahmt werden, aber das größere Gesicht sollte Vorrang haben (es sollte oben platziert werden). Wenn beide Flächen gleich groß sind, liegt die Priorität im Ermessen des Implementierers. Wenn die Eingabe keine Flächen enthält, sollte die Ausgabe mit der Eingabe identisch sein.
Einige Beispiele
Eingang:
*******
*******
**O*O**
***O***
**\_/**
*******
*******
Ausgabe:
*******
*+---+*
*|O O|*
*| O |*
*|\_/|*
*+---+*
*******
Eingabe (unvollständiges Gesicht):
*******
*******
**O*O**
*******
**\_/**
*******
*******
Ausgabe:
*******
*******
**O*O**
*******
**\_/**
*******
*******
Eingabe (verschachtelte Gesichter):
*******
*O***O*
**O*O**
***O***
**\_/**
*\___/*
*******
Ausgabe:
+-----+
|O O|
| |
| O |
| |
|\___/|
+-----+
Eingabe (mehrere Gesichter):
~{$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&^
Ausgabe:
+---+*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&^
Eingabe (nahe Grenze):
~{$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&^
Ausgabe:
---+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&^
Eingabe (überlappende Flächen):
~{$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&^
Ausgabe:
~{$FJ*TBNFU*YBVEXGY%
FX+---+-------+Z<>}+
X$|O |O O|JJKY%
@:| | |>?VKH
SD| O| |(UR$W
XV| | O |*(&P:
>?|\__| |:}~{&
~@+---| |}P>OU
:@<L::|\_____/|%^*BI
@{PO{_+-------+*&G&^
Antworten:
Ruby,
304298295 ZeichenDie Überlappung unten rechts wird bevorzugt, wenn die Flächen die gleiche Größe haben. ZB für die Eingabe
es erkennt alle vier Gesichter und gibt nach
Edit 1: Wie von Lowjacker vorgeschlagen, können wir das
index
durch ein Regex-Match (-3 Zeichen) ersetzen . Darüber hinaus+1
kann dies durch ein zusätzliches Dummy-Zeichen vor dem Matching ausgeglichen werden, wodurch ein weiteres Zeichen gespeichert wird (-2 für das+1
, +3 für Dummy-Zeichen, -2, da keine Klammern mehr erforderlich sind). Zwei mehr, da wir den Bereich auch ohne Klammern schreiben können.Bearbeiten 2: Zwei weitere Zeichen werden gespeichert, indem beide durch ersetzt
if
werden&&
und ein weiteres Zeichen den Bereich vollständig entfernt.quelle
(O=~/$/)
stattO.index($/)
in der dritten Zeile verwenden (spart 3 Zeichen).if
Anweisungen durch ersetzen&&
.Python -
1199941Ich fand das Problem ziemlich interessant und löste es in Python. Hier ist der komprimierte Code.
Hier ist der besser lesbare Code:
quelle