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.