Debe escribir un programa o función que reciba una cadena que represente un arte ASCII como entrada y salidas o devuelva el número de puntos finales en la entrada.
La entrada consistirá en los caracteres space - | +
(con 0, 2, 2 y 4 puntos finales respectivamente) y saltos de línea. P.ej:
-|++-
+
Dos caracteres adyacentes están conectados y, por lo tanto, pierden 1 punto final cada uno en los siguientes casos:
-- -+ +- | | + + ++
| + | +
El primer ejemplo tiene
2+2+2+2+1+
3 = 12
puntos finales
Entrada
- De entrada será una cadena formada por los caracteres espacio,
-
,|
,+
y la nueva línea. - La longitud de entrada puede ser de 0 y cualquier entrada que coincida con la descripción anterior es válida (en regex, la entrada es
[ -+|\n]*
). - La nueva línea final es opcional.
Salida
- Un solo entero no negativo, el número de puntos finales.
Ejemplos
Las salidas son posteriores a la última fila de sus entradas.
+
4
-|++-
+
12
+--+
| |
+--+
8
| |
+--+-- |||
12
--++
|||--
10
<empty input>
0
|
|
2
--
++--
++
--+
+++ ||
----
30
Este es el código de golf, por lo que gana la entrada más corta.
["",...s.split("\n"),""]
más tiempo @ETHproductionsPitón 2, 123
Un método de una pasada. Toma como entrada una cadena con saltos de línea.
Para las horizontales, la idea es contar el número de segmentos horizontales, cada uno de los cuales tiene dos puntos finales. Un segmento comienza cada vez que un personaje es uno de
+-
(booleanoh
) pero el anterior no lo es (booleanop
).Para las verticales, nos gustaría hacer lo mismo en la entrada transpuesta, mirando las ejecuciones de
+|
. Desafortunadamente, la transposición de Python es realmente torpe. Requiere algo comomap(None,*s.split('\n'))
llenar los espacios en blancoNone
, que también son ellos mismos para tratar.En cambio, hacemos el recuento vertical mientras iteramos horizontalmente. Mantenemos una lista
l
de los índices de las columnas que todavía están "ejecutándose", es decir, dónde se conecta el carácter anterior en esa columna. Luego, hacemos lo mismo que con la horizontal, contando los segmentos verticales recién comenzados. Cuando tocamos una nueva línea, cortamos la lista a la derecha de donde estamos, ya que todos los segmentos a la derecha estaban rotos, y restablecemos el índice actual a0
.fuente
CJam,
666261 bytesPruébelo en línea en el intérprete de CJam .
Idea
Podemos calcular los puntos finales de la siguiente manera:
-
s,|
s y+
s en la entrada.--
s,-+
s,+-
s y++
S en las filas.||
s.|+
s,+|
sys++
en las columnas.Código
fuente