Attiva / disattiva la scatola!


9

Data una stringa che è potenzialmente inscatolata, attiva o disattiva la casella. Ciò diventa più chiaro nei casi di test e nella spiegazione.

Input Output

Formato di input

L'input sarà una singola stringa separata da CR, LF o CRLF o un elenco di stringhe. Decidi tu il formato di input.

Formato di output

Il formato di output deve essere nello stesso formato dell'input.

Spiegazione + Esempio

Prendiamo una stringa inscatolata come esempio:

+-------------+
|Hello, World!|
+-------------+

Per attivare / disattivare la casella, rimuoviamo la prima e l'ultima riga e la prima e l'ultima colonna. Si può presumere che non ci saranno spazi vuoti finali dopo l'ultima riga (con una nuova riga finale facoltativa alla fine dell'ultima riga) e nessun spazio vuoto finale su qualsiasi riga, senza contare ovviamente la nuova riga.

Questo sarebbe diventato:

Hello, World!

L'altro modo

Se la stringa non si trova in una casella, aggiungere una casella ad essa. Questo è abbastanza semplice; anteporre +---...---+sulla propria riga con ktrattini in cui si ktrova la lunghezza della linea più lunga, quindi per ogni riga, riempirlo con uno spazio bianco finale per abbinare la lunghezza della linea più lunga, quindi anteporre e aggiungere un carattere pipe ( "|"). Infine, aggiungi una riga contenente la stessa +---...---+configurazione della prima riga.

Per esempio:

Hello, World!

diventa:

+-------------+
|Hello, World!|
+-------------+

Si può presumere che nessuna delle righe nell'input avrà spazi vuoti finali.

Un altro esempio di stringa che dovrebbe contenere una casella:

Hello,
    World!

diventa

+----------+
|Hello,    |
|    World!|
+----------+

Un esempio di qualcosa che dovrebbe essere ancora inscatolato:

+--------+
|        |
 --------+

diventa:

+----------+
|+--------+|
||        ||
| --------+|
+----------+

Regole + specifiche

  • Si applicano scappatoie standard
  • Nessuna riga di input avrà spazi bianchi iniziali o finali sia in generale che in ciascuna riga, indipendentemente dal fatto che sia stata o meno inscatolata
  • Le scatole avranno solo +come angoli e |per i bordi verticali e -per i lati orizzontali.
  • Una scatola deve avere i suoi vantaggi in atto per essere considerata una scatola; se ha l'altezza o la larghezza 2 (ovvero, nessun contenuto), dovrebbe comunque essere deselezionato, il che comporterebbe un sacco di nuove righe, a seconda dell'altezza della casella.
  • Se l'input ha una casella ma un testo esterno alla casella, l'intera cosa dovrebbe essere inscatolata.
  • Il tuo programma deve controllare l'intero perimetro della stringa. Se un singolo personaggio lungo l'esterno non è corretto (mancante o diverso da quello che dovrebbe essere), allora dovrebbe essere inscatolato, non deselezionato.
  • La stessa stringa senza scatola può contenere + | -. Se la stringa unboxed stessa contiene una casella attorno, restituisce la stringa con la casella; dovrebbe essere decompresso solo una volta.

Custodie per bordi

1: piccole scatole

Ingresso:

++
++

L'output è vuoto o newline

Ingresso:

+----+
+----+

L'output è vuoto o una nuova riga

Ingresso:

++
||
||
++

L'output è di 2 righe o 3 righe

2: scatola parziale

Ingresso:

+-------+
| Hello |
+ ------+

Produzione:

+---------+
|+-------+|
|| Hello ||
|+ ------+|
+---------+

3: testo esterno alla casella

Ingresso:

 +-------+
a| Hello |
 +-------+

Produzione:

+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+

1
"Nessuna riga di input avrà spazi bianchi iniziali o finali sia generali che in ciascuna riga, indipendentemente dal fatto che sia stata o meno inscatolata." Molti dei tuoi casi di test hanno spazi principali. Un input rettangolare sarebbe troppo da chiedere?
Neil,

@Neil Probabilmente non intendeva uno spazio bianco iniziale coerente , cioè ogni riga che inizia con 3 spazi non sarebbe un caso, ma le linee che iniziano con 1, 2, 0, 3 spazi, poiché quelle non sono coerenti.
Erik the Outgolfer,

E ' questa una scatola o no?
user41805,

@Cowsquack Dalle specifiche sembra che non lo sia.
Erik the Outgolfer,

@Neil Spiacente, intendo dire che qualsiasi spazio all'inizio lo renderebbe come una casella.
HyperNeutrino,

Risposte:


6

JavaScript (ES2017), 199 byte

s=>/^\+-*\+\n(\|.*\|\n)*\+-*\+$/.test(s,s=s.split`
`,s.map(z=>z[y]?y=z.length:0,y=0))?s.slice(1,-1).join`
`.replace(/.(.*)./g,"$1"):(x=`+${'-'.repeat(y)}+`)+`
|${s.map(z=>z.padEnd(y)).join`|
|`}|
`+x

La soluzione ingenua. Che sia o no il migliore, vedremo ...


"Può essere o non essere il migliore, vedremo ..." è comunque bello vedere un linguaggio non golfistico come JS risolverlo in <200 byte ... vedi cosa ho fatto lì? ;)
Erik the Outgolfer,

Haha, sembra una pubblicità per qualcosa "ora sotto i 2 dollari!" quando costa 1,99: P
ETHproductions

Si chiama rapina industriale lol.
Erik the Outgolfer,

Questo funziona per i casi di test, ma non credo che funziona per qualcosa di simile: '+--+\n|hi|\n|world|\n+----------+'. Rimuove le linee, anche se non è rettangolare.
Rick Hitchcock,

3

SOGL V0.12 , 72 byte

2-┌* +1Ο;2-⁴┌@ŗΖ+|ŗ∙⁴++B
▓Aa1w⁄;lGB╬8a⁰I{_=}¹χ?ajk{jk}⁰←a1w⁄;l2+G2+B00╬5

Provalo qui!

+7 byte ( ⁰I{_=}¹χ) perché elementally equivale a non implementato
+1 byte ( ) perché l'input non è garantito per essere
+1 byte quadrato ( A) per me essere pigro e non implementare input digitati (quindi questo si aspetta input in pila. facilità d'uso, il collegamento online include → in modo che la casella di input possa essere utilizzata)


⁰I{_=}¹χè +8 byte non +7.
Erik the Outgolfer,

@EriktheOutgolfer dovrebbe essere la sostituzione =, ma poiché non funziona, cambia la lunghezza di -1 + 8 = +7
dzaima


2

Retina , 197 195 byte

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 
%`^|$
|
^.(.*).
+$.1$*-+¶$&
.(.*).$
$&¶+$.1$*-+
^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶
..(.*)..(?=(.|¶)*¶$)
$1
^¶-*¶-*¶|(\G|¶)-*¶-*¶$

Provalo online! Spiegazione:

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 

Questo stadio è piuttosto complicato in sé, quindi lo abbatterò un po '. +significa che lo stage si ripete fino a quando non si trovano più sostituzioni. m`^significa che lo stage corrisponde all'inizio di qualsiasi riga. ((.)*)quindi corrisponde a tutta la riga. Ora $1è semplicemente la linea corrispondente, ma $2è un elenco di corrispondenze, ad esempio caratteri. quindi corrisponde alla fine della riga e quindi all'inizio della riga successiva. (?<-2>.)*utilizza un gruppo di bilanciamento .NET. I <-2>Rimuove partite da $2lungo come un personaggio possono essere abbinati sulla seconda riga. A questo punto, può succedere una delle tre cose:

  • Non c'erano abbastanza personaggi sulla seconda riga. $2rimangono ancora alcune partite.
  • Le due linee avevano esattamente la stessa lunghezza. $2non ci sono partite e siamo alla fine della linea.
  • La seconda riga è più lunga, quindi è rimasto almeno un carattere.

(?(2)$|(.)))aiuta a distinguerli usando una condizione. Se mancano $2ancora alcune corrispondenze, è necessario che ciò avvenga perché la seconda riga è troppo corta, quindi corrispondiamo alla fine della riga, ma se $2non sono rimaste corrispondenze, vogliamo che la seconda riga sia più lunga, quindi abbiniamo un personaggio (che entra in $4modo che sappiamo che la partita è avvenuta). Altrimenti le due linee hanno la stessa lunghezza e la corrispondenza fallisce a questo punto (potrebbe corrispondere di nuovo in una linea successiva ovviamente).

La stringa di sostituzione è $1$#4$* $3$#2$*. Le $#4restituisce 1se abbiamo fatto coincidere un carattere aggiuntivo sulla seconda linea, 0se non. Ciò significa che $#4$*aggiunge uno spazio alla prima riga se la seconda riga era più lunga. Allo stesso modo $#2$*aggiunge spazi alla seconda riga se la prima riga era più lunga. (In effetti, finisce per aggiungere esattamente il giusto numero di spazi. Se stessimo solo bilanciando due linee, si +sarebbe potuto aggiungere a al quarto gruppo di acquisizione per raggiungere questo obiettivo direttamente anche nel caso della seconda linea più lunga.)

Il risultato di tutto ciò è che questo stage completa l'input in un rettangolo. Ora possiamo disegnare un riquadro attorno ad esso.

%`^|$
|

Posizionare |s su ciascun lato.

^.(.*).
+$.1$*-+¶$&

Posizionare +-...-+in alto.

.(.*).$
$&¶+$.1$*-+

E ancora sul fondo.

^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶

Vedi se abbiamo creato una doppia scatola. In tal caso, vengono aggiunte ulteriori righe vuote in alto e in basso affinché le fasi rimanenti corrispondano per eliminare entrambe le caselle.

..(.*)..(?=(.|¶)*¶$)
$1

Se è presente una riga vuota finale, rimuovi due caratteri dall'inizio e dalla fine di ogni riga.

^¶-*¶-*¶|(\G|¶)-*¶-*¶$

Se c'è una riga vuota iniziale, eliminala e le due righe successive (che saranno le -s rimanenti nella parte superiore della casella). Se è presente una riga vuota finale, eliminala e le due righe precedenti. Si (\G|¶)tratta del caso in cui ci sono solo sei righe (e quindi 5 s) perché la scatola non ha contenuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.