Vous devez écrire un programme ou une fonction qui reçoit une chaîne représentant un art ASCII en entrée et génère ou renvoie le nombre de points de terminaison dans l'entrée.
L'entrée sera constituée des caractères space - | +
(avec 0, 2, 2 et 4 points de terminaison respectivement) et des sauts de ligne. Par exemple:
-|++-
+
Deux personnages adjacents sont connectés et perdent donc 1 point d'extrémité chacun dans les cas suivants:
-- -+ +- | | + + ++
| + | +
Le premier exemple a
2+2+2+2+1+
3 = 12
points finaux.
Contribution
- Entrée sera une chaîne composée de l'espace de caractères,
-
,|
,+
et retour à la ligne. - La longueur d'entrée peut être 0 et toute entrée correspondant à la description ci-dessus est valide (en entrée regex est
[ -+|\n]*
). - Le retour à la ligne est facultatif.
Production
- Un seul entier non négatif, le nombre de points de terminaison.
Exemples
Les sorties se trouvent après la dernière ligne de leurs entrées.
+
4
-|++-
+
12
+--+
| |
+--+
8
| |
+--+-- |||
12
--++
|||--
10
<empty input>
0
|
|
2
--
++--
++
--+
+++ ||
----
30
C'est le golf de code, donc l'entrée la plus courte gagne.
["",...s.split("\n"),""]
plus longtemps @ETHproductionsPython 2, 123
Une méthode en un seul passage. Prend en entrée une chaîne avec des sauts de ligne.
Pour les horizontales, l'idée est de compter le nombre de segments horizontaux, chacun ayant deux extrémités. Un segment démarre chaque fois qu'un caractère fait partie de
+-
(booléenh
) mais pas le précédent (booléenp
).Pour les verticales, nous aimerions faire la même chose sur l'entrée transposée, en regardant les séquences de
+|
. Malheureusement, la transposition de Python est vraiment maladroite. Cela nécessite quelque chose commemap(None,*s.split('\n'))
de remplir les blancsNone
, qui sont eux-mêmes à gérer.Au lieu de cela, nous effectuons le comptage vertical tout en itérant horizontalement. Nous gardons une liste
l
des colonnes où les index sont toujours "en cours d'exécution", c'est-à-dire où le caractère précédent de cette colonne se connecte. Ensuite, nous faisons la même chose qu'avec l'horizontale, en comptant les segments verticaux nouvellement démarrés. Lorsque nous atteignons une nouvelle ligne, nous coupons la liste à droite de l'endroit où nous nous trouvons, car tous les segments à droite ont été cassés, et nous réinitialisons l'index actuel0
.la source
CJam,
666261 octetsEssayez-le en ligne dans l' interpréteur CJam .
Idée
Nous pouvons calculer les points de terminaison comme suit:
-
s,|
s et+
s dans l'entrée.--
s,-+
s,+-
s et++
s dans les rangées.||
s.|+
s,+|
s et++
s dans les colonnes.Code
la source