Ogni programmatore sa che i rettangoli □
sono davvero divertenti. Per esasperare questo divertimento, questi diagrammi carini e sfocati possono essere trasformati in gruppi di parentesi intrecciate.
Questa sfida è l'inverso del mio precedente .
Supponiamo che tu abbia un gruppo di rettangoli a incastro in questo modo:
+------------+
| |
+--+-+ +----+-+
| | | | | |
| | | +---+--+ | |
| | | | | | | |
+--+-+ | +-+--+-+-+-+
| | | | | | | |
| | | | | | | |
| | | | | | | | +-+
| +-+-+--+ | | | | |
| | | | | | +-+-+-+
+-----+-+----+ | | | | | |
| | | | | +-+ |
| +------+ | | |
| | | |
+----------+ +-----+
Note aggiuntive:
- Non ci
+
saranno mai due secondi adiacenti - Nessun due rettangoli condivideranno mai un bordo o un angolo
- Ci sarà sempre e solo un bordo verticale in ogni colonna
Il primo passo è guardare il bordo più a sinistra di qualsiasi rettangolo. Assegnalo a uno dei quattro tipi di parentesi ({[<
. Io scelgo [
.
+------------+
| |
[--+-] +----+-+
[ | ] | | |
[ | ] +---+--+ | |
[ | ] | | | | |
[--+-] | +-+--+-+-+-+
| | | | | | | |
| | | | | | | |
| | | | | | | | +-+
| +-+-+--+ | | | | |
| | | | | | +-+-+-+
+-----+-+----+ | | | | | |
| | | | | +-+ |
| +------+ | | |
| | | |
+----------+ +-----+
Ora guarda il secondo rettangolo più a sinistra. Poiché si sovrappone a un [
rettangolo, deve essere di tipo diverso. Io scelgo (
.
(------------)
( )
[--(-] +----)-+
[ ( ] | ) |
[ ( ] +---+--+ ) |
[ ( ] | | | ) |
[--(-] | +-+--+-)-+-+
( | | | | ) | |
( | | | | ) | |
( | | | | ) | | +-+
( +-+-+--+ ) | | | |
( | | ) | | +-+-+-+
(-----+-+----) | | | | | |
| | | | | +-+ |
| +------+ | | |
| | | |
+----------+ +-----+
Il rettangolo più a sinistra successivo non si interseca con nessun rettangolo precedente, ma si annida all'interno del precedente. Ho scelto di assegnarlo di (
nuovo. Normalmente è una buona ipotesi assegnare un rettangolo dello stesso tipo di quello che sta annidando se possibile, ma a volte è necessario il backtracking.
(------------)
( )
[--(-] +----)-+
[ ( ] | ) |
[ ( ] (---+--) ) |
[ ( ] ( | ) ) |
[--(-] ( +-+--)-)-+-+
( ( | | ) ) | |
( ( | | ) ) | |
( ( | | ) ) | | +-+
( (-+-+--) ) | | | |
( | | ) | | +-+-+-+
(-----+-+----) | | | | | |
| | | | | +-+ |
| +------+ | | |
| | | |
+----------+ +-----+
Il prossimo rettangolo può essere assegnato di [
nuovo.
(------------)
( )
[--(-] +----)-+
[ ( ] | ) |
[ ( ] (---+--) ) |
[ ( ] ( | ) ) |
[--(-] ( [-+--)-)-+-]
( ( [ | ) ) | ]
( ( [ | ) ) | ]
( ( [ | ) ) | ] +-+
( (-[-+--) ) | ] | |
( [ | ) | ] +-+-+-+
(-----[-+----) | ] | | | |
[ | | ] | +-+ |
[ +------+ ] | |
[ ] | |
[----------] +-----+
Il prossimo rettangolo è piuttosto divertente. Si interseca con a (
e un [
rettangolo, quindi potrei chiamarlo un {
rettangolo (o <
ma a nessuno piace quelli).
(------------)
( )
[--(-] {----)-}
[ ( ] { ) }
[ ( ] (---{--) ) }
[ ( ] ( { ) ) }
[--(-] ( [-{--)-)-}-]
( ( [ { ) ) } ]
( ( [ { ) ) } ]
( ( [ { ) ) } ] +-+
( (-[-{--) ) } ] | |
( [ { ) } ] +-+-+-+
(-----[-{----) } ] | | | |
[ { } ] | +-+ |
[ {------} ] | |
[ ] | |
[----------] +-----+
Gli ultimi due rettangoli non sono poi così male. Possono essere di due tipi diversi.
(------------)
( )
[--(-] {----)-}
[ ( ] { ) }
[ ( ] (---{--) ) }
[ ( ] ( { ) ) }
[--(-] ( [-{--)-)-}-]
( ( [ { ) ) } ]
( ( [ { ) ) } ]
( ( [ { ) ) } ] {-}
( (-[-{--) ) } ] { }
( [ { ) } ] <-{-}->
(-----[-{----) } ] < { } >
[ { } ] < {-} >
[ {------} ] < >
[ ] < >
[----------] <----->
Leggendo i rettangoli, ho capito [(]([{))}]<{}>
. Questo sarebbe un possibile output per l'ingresso sopra. Ecco un elenco di molte opzioni possibili, non esaustive:
[(]([{))}]<{}>
<(>(<{))}>{()}
{<}[{(]>)}[<>]
any of the 4! permutations of ([{<, you get the idea...
Ingresso
Rettangoli di arte ASCII, partendo dal presupposto che non sono ambigui (vedi note sopra) e possono essere correttamente convertiti in una stringa di parentesi. Si può presumere che non ci siano spazi finali o riempiti con un rettangolo, con newline finale opzionale. Non ci saranno spazi bianchi iniziali.
Produzione
Una qualsiasi delle stringhe di parentesi valide che obbedisce alle restrizioni di intersezione dei rettangoli. A parte una nuova riga finale facoltativa, non ci dovrebbero essere altri caratteri oltre le parentesi. La regola principale è che se due quadrati si intersecano, allora dovrebbero essere assegnati diversi tipi di parentesi.
Obbiettivo
Questo è code-golf, (mancanza di) quantità sulla qualità.
+
per l'angolo in alto a sinistra, e quindi (immediatamente sotto) +
per per l'angolo in basso a sinistra?