Uma cobra elástica se parece com isso:
<||=|||:)~
Cada sequência separada de barras verticais ( |
) em uma cobra elástica, conhecida como porção elástica , é extensível individualmente até o dobro de sua largura e é desenhada com barras alternadas ( /
, \
) uma vez estendidas.
A cobra em particular acima tem duas partes elásticas, dando-lhe quatro poses possíveis:
<||=|||:)~
</\/\=|||:)~
<||=/\/\/\:)~
</\/\=/\/\/\:)~
A forma geral de uma cobra elástica em sua pose menos esticada é definida por este regex :
<(\|+=)*\|+:\)~
O que pode ser declarado em palavras como:
<
, seguido por qualquer número de sequências de|
's unidas com=
sinais, seguidas por:)~
.
Então, <|:)~
e <||:)~
e <|=|:)~
e <|=|=||=|||||=||:)~
são cobras elásticas, mas <=:)~
e <=|:)~
e <||=:)~
e e <|==||:)~
não são.
Cobras elásticas também podem ficar voltadas para a esquerda, e não para a direita, por exemplo ~(:|||=||>
. Os formulários são os mesmos, apenas espelhados.
Desafio
Escreva um programa que inclua uma única linha de duas cobras elásticas de frente uma para a outra, com alguns espaços entre eles. Ambas as cobras estarão em sua posição menos esticada (todas as barras verticais, sem barras). A sequência começará com a cauda da cobra voltada para a direita e terminará com a cauda da serpente voltada para a esquerda (você pode opcionalmente assumir que há também uma nova linha à direita).
Por exemplo, aqui está uma entrada possível com cinco espaços entre as cobras:
<|=||:)~.....~(:||||>
Estou usando pontos ( .
) em vez de caracteres de espaço reais para maior clareza.
Zero espaços entre cobras também é uma entrada válida:
<|=||:)~~(:||||>
Dizemos que as cobras estão se beijando quando suas línguas estão se tocando assim.
Seu programa precisa estender uma combinação das partes elásticas de ambas as cobras, de modo que as cobras tenham o menor número possível de espaços entre elas (sem sobreposição), ou seja , de modo que as cobras estejam o mais próximo possível do beijo .
As caudas de ambas as cobras são fixas, mas suas cabeças e corpos podem se mover - direito para a serpente voltada para a direita, deixado para a serpente voltada para a esquerda - de acordo com o que as porções elásticas foram estendidas.
A saída do seu programa é a string de linha única (mais a nova linha de rastreamento opcional) que mostra as cobras o mais próximo possível do beijo, com barras alternadas desenhadas no lugar de barras verticais para partes extensas que foram estendidas.
Por exemplo, a saída para <|=||:)~.....~(:||||>
(de cima) seria:
</\=||:)~~(:/\/\/\/\>
Esta é a única solução aqui, porque, com qualquer outra combinação de porções esticadas, as cobras se sobrepõem ou ficam mais afastadas do beijo.
Se houver várias soluções possíveis, a saída pode ser qualquer uma delas.
Por exemplo, se a entrada fosse
<|=||:)~.....~(:|||=|>
a saída pode ser
<|=/\/\:)~~(:/\/\/\=|>
ou
</\=||:)~~(:/\/\/\=/\>
Lembre-se de que nem sempre será possível fazer as cobras se beijarem, mas você ainda precisa aproximá-las o mais possível.
Por exemplo, se a entrada fosse
<||=||||:)~...~(:||>
a saída pode ser
</\/\=||||:)~.~(:||>
ou
<||=||||:)~.~(:/\/\>
Se as cobras já estiverem se beijando, a saída será a mesma que a entrada. por exemplo
<|=||:)~~(:||||>
Em geral, a saída será igual à entrada se a extensão de qualquer parte elástica fizer com que as cobras se sobreponham. por exemplo
<|||=|||:)~..~(:||||=|||||=||||||>
Notas
- Recebe a entrada do stdin ou da linha de comando, como de costume, ou escreve uma função que usa uma string. Imprima ou retorne a saída.
- Você pode usar pontos (
.
) na entrada e saída no lugar de espaços (), se preferir.
- É importante que as barras se alternem na sequência de barras verticais substituídas. Sua ordem na cobra em geral ou se uma barra para frente ou para trás vem primeiro, não importa.
- Partes elásticas não podem se estender parcialmente - é exatamente o dobro ou nenhuma extensão.
Pontuação
Isso é código-golfe . O menor envio em bytes vence. O desempatador é a resposta anterior.
>
, não se tornaria <
o mesmo para (
e )
), mas ele também diz "É importante que as barras se alternem na sequência de barras verticais que eles substituíram. cobra em geral ou se uma barra para frente ou para trás vem primeiro, não importa. "