Un serpente elastico assomiglia a questo:
<||=|||:)~
Ogni sequenza separata di barre verticali ( |
) in un serpente elastico, noto come una porzione elastica , è estendibile individualmente a due volte la sua larghezza e viene disegnata con barre alternate ( /
, \
) una volta estese.
Il particolare serpente sopra ha due di queste porzioni elastiche, dandogli quattro possibili pose:
<||=|||:)~
</\/\=|||:)~
<||=/\/\/\:)~
</\/\=/\/\/\:)~
La forma generale di un serpente elastico nella sua posa meno allungata è definita da questa regex :
<(\|+=)*\|+:\)~
Che può essere dichiarato in parole come:
<
, Seguito da un numero di sequenze di|
's unito con=
segni, seguita da:)~
.
Così <|:)~
e <||:)~
e <|=|:)~
e <|=|=||=|||||=||:)~
sono serpenti elastici, ma <=:)~
e <=|:)~
e <||=:)~
e <|==||:)~
non lo sono.
I serpenti elastici possono anche essere rivolti a sinistra anziché a destra, ad es ~(:|||=||>
. Le forme sono le stesse, solo speculari.
Sfida
Scrivi un programma che includa una stringa a riga singola di due serpenti elastici uno di fronte all'altro, con un numero di spazi in mezzo. Entrambi i serpenti saranno nella loro posizione meno allungata (tutte le barre verticali, senza barre). La stringa inizierà con la coda del serpente rivolto a destra e terminerà con la coda del serpente rivolto a sinistra (si può facoltativamente supporre che ci sia anche una nuova riga finale).
Ad esempio, ecco un possibile input con cinque spazi tra i serpenti:
<|=||:)~.....~(:||||>
Sto usando punti ( .
) invece di caratteri spaziali reali per chiarezza.
Anche lo spazio zero tra i serpenti è un input valido:
<|=||:)~~(:||||>
Diciamo che i serpenti si baciano quando le loro lingue si toccano in questo modo.
Il tuo programma deve estendere una combinazione delle porzioni elastiche di entrambi i serpenti in modo tale che i serpenti abbiano il minor numero possibile di spazi tra loro (senza sovrapposizioni), ovvero tali che i serpenti siano il più vicino possibile ai baci .
Entrambe le code dei serpenti sono fisse ma le loro teste e i loro corpi possono muoversi - a destra per il serpente rivolto a destra, a sinistra per il serpente rivolto a sinistra - in base a quali porzioni elastiche sono state estese.
L'output del tuo programma è la stringa a riga singola (più la nuova riga finale opzionale) che mostra i serpenti il più vicino possibile al bacio, con barre alternate disegnate al posto di barre verticali per porzioni elastiche che sono state estese.
Ad esempio, l'output per <|=||:)~.....~(:||||>
(dall'alto) sarebbe:
</\=||:)~~(:/\/\/\/\>
Questa è l' unica soluzione qui perché con qualsiasi altra combinazione delle porzioni elastiche estese, i serpenti si sovrapporrebbero o sarebbero più lontani dai baci.
Se sono possibili più soluzioni, l'output può essere una qualsiasi.
Ad esempio, se l'input fosse
<|=||:)~.....~(:|||=|>
l'output potrebbe essere
<|=/\/\:)~~(:/\/\/\=|>
o
</\=||:)~~(:/\/\/\=/\>
Ricorda che non sarà sempre possibile baciare i serpenti, ma devi comunque avvicinarli il più possibile.
Ad esempio, se l'input fosse
<||=||||:)~...~(:||>
l'output potrebbe essere
</\/\=||||:)~.~(:||>
o
<||=||||:)~.~(:/\/\>
Se i serpenti si stanno già baciando, l'output sarà lo stesso dell'input. per esempio
<|=||:)~~(:||||>
In generale, l'output sarà lo stesso dell'input se l'estensione di qualsiasi porzione elastica fa sovrapporre i serpenti. per esempio
<|||=|||:)~..~(:||||=|||||=||||||>
Appunti
- Prende l'input da stdin o dalla riga di comando come al solito, oppure scrive una funzione che accetta una stringa. Stampa o ritorna l'output.
- Se preferisci, puoi usare i punti (
.
) nell'input e output al posto degli spazi ().
- È importante solo che le barre si alternino all'interno della sequenza di barre verticali che hanno sostituito. Il loro ordine nel serpente in generale o se viene prima una barra in avanti o indietro non importa.
- Le porzioni elastiche non possono estendersi a metà - è esattamente doppia o nessuna estensione.
punteggio
Questo è code-golf . Vince l'invio più breve in byte. Tiebreaker è la risposta precedente.
>
non sarebbe <
nemmeno lo stesso, lo stesso per (
e )
), ma dice anche "È importante solo che le barre si alternino all'interno della sequenza di barre verticali che hanno sostituito. serpente in senso lato o se viene prima una barra in avanti o all'indietro, non importa.