Le but de cette tâche est d'identifier, de nettoyer et de marquer tous les visages dans une "image" donnée.
Qu'y a-t-il dans un visage?
Une face sera un carré ZxZ où Z est un entier impair supérieur à 1. Les coins supérieurs gauche et droit et le centre sont composés de caractères "O", et la ligne du bas sera constituée d'un "\" et d'un "/" entourant suffisamment '_' caractères pour remplir le reste de la ligne. Exemples:
une face 3x3:
O O
O
\_/
une face 5x5:
O O
O
\___/
une face 7x7:
O O
O
\_____/
etc.
Contribution
L’entrée sera sur STDIN et consistera en un nombre de chaînes de caractères de longueur égale.
Sortie
La sortie doit être l'entrée avec tous les visages reconnaissables effacés (c'est-à-dire que tous les caractères sauf les yeux, le nez et la bouche doivent être retirés des limites du visage) et encadrés (entourés de +, - et | caractères). Lorsque deux ou plusieurs faces se chevauchent, les deux doivent être nettoyées et encadrées, mais la priorité doit être donnée à la plus grande face (elle doit être placée sur le dessus). si les deux faces ont la même taille, la priorité est laissée à la discrétion de l'implémenteur. Si l'entrée n'a pas de faces, la sortie doit être identique à l'entrée.
Quelques exemples
Contribution:
*******
*******
**O*O**
***O***
**\_/**
*******
*******
Sortie:
*******
*+---+*
*|O O|*
*| O |*
*|\_/|*
*+---+*
*******
Entrée (visage incomplet):
*******
*******
**O*O**
*******
**\_/**
*******
*******
Sortie:
*******
*******
**O*O**
*******
**\_/**
*******
*******
Entrée (faces imbriquées):
*******
*O***O*
**O*O**
***O***
**\_/**
*\___/*
*******
Sortie:
+-----+
|O O|
| |
| O |
| |
|\___/|
+-----+
Entrée (plusieurs 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&^
Sortie:
+---+*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&^
Entrée (limite proche):
~{$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&^
Sortie:
---+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&^
Entrée (faces qui se chevauchent):
~{$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&^
Sortie:
~{$FJ*TBNFU*YBVEXGY%
FX+---+-------+Z<>}+
X$|O |O O|JJKY%
@:| | |>?VKH
SD| O| |(UR$W
XV| | O |*(&P:
>?|\__| |:}~{&
~@+---| |}P>OU
:@<L::|\_____/|%^*BI
@{PO{_+-------+*&G&^
Réponses:
Ruby,
304298295 caractèresEn bas à droite est préférable sur le chevauchement si les faces sont de taille identique. Par exemple pour l'entrée
il reconnaît les quatre faces et les rendements
Edit 1: Comme Lowjacker l’a proposé, nous pouvons remplacer le
index
par une expression rationnelle (-3 caractères). De plus, le+1
peut être compensé par un caractère factice supplémentaire avant la correspondance, ce qui enregistre un autre caractère (-2 pour le caractère+1
, +3 pour le caractère factice, -2 car les crochets ne sont plus nécessaires). Deux autres puisque nous pouvons écrire la plage aussi sans crochets.Edit 2: Deux autres caractères sont enregistrés en remplaçant les deux
if
par&&
et un autre en supprimant complètement la plage.la source
(O=~/$/)
place deO.index($/)
la troisième ligne (enregistre 3 caractères).if
instructions par&&
.Python -
1199941J'ai trouvé le problème assez intéressant, alors j'ai résolu en Python. Voici le code compressé.
Voici le code le plus lisible:
la source