Una serpiente elástica se ve así:
<||=|||:)~
Cada secuencia separada de barras verticales ( |
) en una serpiente elástica, conocida como una porción elástica , es extensible individualmente al doble de su ancho, y se dibuja con barras alternas ( /
, \
) una vez extendidas.
La serpiente particular de arriba tiene dos porciones elásticas, que le dan cuatro poses posibles:
<||=|||:)~
</\/\=|||:)~
<||=/\/\/\:)~
</\/\=/\/\/\:)~
La forma general de una serpiente elástica en su pose menos estirada se define por esta expresión regular :
<(\|+=)*\|+:\)~
Que puede expresarse en palabras como:
<
, seguido de cualquier número de secuencias de|
's unidas con=
signos, seguido de:)~
.
So <|:)~
y <||:)~
y <|=|:)~
y <|=|=||=|||||=||:)~
son serpientes elásticas, pero <=:)~
y <=|:)~
y <||=:)~
y <|==||:)~
no lo son.
Las serpientes elásticas también pueden mirar hacia la izquierda en lugar de hacia la derecha, por ejemplo ~(:|||=||>
. Las formas son las mismas, solo reflejadas.
Desafío
Escriba un programa que tome una cadena de una sola línea de dos serpientes elásticas una frente a la otra, con cierto número de espacios en el medio. Ambas serpientes estarán en su postura menos estirada (todas las barras verticales, sin barras). La cadena comenzará con la cola de la serpiente que mira hacia la derecha y terminará con la cola de la serpiente que mira hacia la izquierda (opcionalmente, puede suponer que también hay una nueva línea final).
Por ejemplo, aquí hay una posible entrada con cinco espacios entre las serpientes:
<|=||:)~.....~(:||||>
Estoy usando puntos ( .
) en lugar de caracteres espaciales reales para mayor claridad.
Cero espacios entre serpientes también es una entrada válida:
<|=||:)~~(:||||>
Decimos que las serpientes se besan cuando sus lenguas se tocan así.
Su programa necesita extender alguna combinación de las partes elásticas de ambas serpientes para que las serpientes tengan la menor cantidad de espacios posibles entre ellas (sin superponerse), es decir, para que las serpientes estén tan cerca de besarse como sea posible .
Ambas colas de las serpientes están fijas, pero sus cabezas y cuerpos pueden moverse, derecha para la serpiente que mira hacia la derecha, izquierda para la serpiente que mira hacia la izquierda, de acuerdo con las porciones elásticas que se han extendido.
La salida de su programa es la cadena de una sola línea (más la nueva línea final opcional) que muestra a las serpientes lo más cerca posible de besarse, con barras diagonales alternadas en lugar de barras verticales para las porciones elásticas que se han extendido.
Por ejemplo, la salida para <|=||:)~.....~(:||||>
(desde arriba) sería:
</\=||:)~~(:/\/\/\/\>
Esta es la única solución aquí porque con cualquier otra combinación de las porciones elásticas extendidas, las serpientes se superpondrían o estarían más lejos de besarse.
Si hay varias soluciones posibles, la salida puede ser cualquiera de ellas.
Por ejemplo, si la entrada fuera
<|=||:)~.....~(:|||=|>
la salida podría ser
<|=/\/\:)~~(:/\/\/\=|>
o
</\=||:)~~(:/\/\/\=/\>
Recuerda que no siempre será posible besar a las serpientes, pero aún así necesitas acercarlas lo más posible.
Por ejemplo, si la entrada fuera
<||=||||:)~...~(:||>
la salida podría ser
</\/\=||||:)~.~(:||>
o
<||=||||:)~.~(:/\/\>
Si las serpientes ya se están besando, la salida será la misma que la entrada. p.ej
<|=||:)~~(:||||>
En general, la salida será la misma que la entrada si la extensión de cualquier parte elástica haría que las serpientes se superpongan. p.ej
<|||=|||:)~..~(:||||=|||||=||||||>
Notas
- Toma la entrada de stdin o la línea de comando como de costumbre, o escribe una función que toma una cadena. Imprime o devuelve la salida.
- Puede usar puntos (
.
) en la entrada y salida en lugar de espacios () si lo prefiere.
- Solo es importante que las barras se alternen dentro de la secuencia de barras verticales que reemplazaron. Su orden en la serpiente en general o si un corte hacia adelante o hacia atrás es lo primero no importa.
- Las partes elásticas no pueden extenderse hasta la mitad: es exactamente el doble o ninguna extensión.
Puntuación
Este es el código de golf . La presentación más corta en bytes gana. Tiebreaker es la respuesta anterior.
>
no se convertiría <
tampoco, lo mismo para (
y )
), pero también dice "Es importante que las barras se alternen dentro de la secuencia de barras verticales que reemplazaron. serpiente en general o si una barra diagonal hacia adelante o hacia atrás es lo primero "