Box umschalten!

9

Schalten Sie das Feld um, wenn Sie eine Zeichenfolge angeben, in der möglicherweise eine Box enthalten ist. Dies wird in den Testfällen und Erklärungen klarer.

Input-Output

Eingabeformat

Die Eingabe ist entweder eine einzelne Zeichenfolge, die durch CR, LF oder CRLF getrennt ist, oder eine Liste von Zeichenfolgen. Das Eingabeformat liegt bei Ihnen.

Ausgabeformat

Das Ausgabeformat muss dasselbe Format wie die Eingabe haben.

Erklärung + Beispiel

Nehmen wir als Beispiel eine Box-Zeichenfolge:

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

Um das Feld umzuschalten, entfernen wir die erste und letzte Zeile sowie die erste und letzte Spalte. Sie können davon ausgehen, dass nach der letzten Zeile kein nachgestelltes Leerzeichen (mit einem optionalen nachgestellten Zeilenumbruch am Ende der letzten Zeile) und in keiner Zeile ein nachfolgendes Leerzeichen vorhanden ist, wobei die neue Zeile natürlich nicht berücksichtigt wird.

Dies würde werden:

Hello, World!

Der andere Weg

Wenn sich die Zeichenfolge nicht in einem Feld befindet, fügen Sie ein Feld hinzu. Das ist ziemlich einfach; Stellen Sie +---...---+eine eigene Zeile mit kBindestrichen voran, wobei kdie Länge der längsten Zeile angegeben ist, und füllen Sie sie dann für jede Zeile mit einem nachgestellten Leerzeichen auf, um sie an die Länge der längsten Zeile anzupassen, und stellen Sie dann ein Pipe-Zeichen vor und fügen Sie es hinzu ( "|"). Fügen Sie abschließend eine Zeile hinzu, die das gleiche +---...---+Setup wie die erste Zeile enthält.

Beispielsweise:

Hello, World!

wird:

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

Sie können davon ausgehen, dass keine der Zeilen in der Eingabe nachgestellte Leerzeichen enthält.

Ein weiteres Beispiel für eine Zeichenfolge, um die ein Kästchen gelegt werden sollte:

Hello,
    World!

wird

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

Ein Beispiel für etwas, das noch verpackt werden sollte:

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

wird:

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

Regeln + Spezifikationen

  • Standardschlupflöcher gelten
  • Keine Eingabezeile enthält sowohl insgesamt als auch in jeder Zeile ein führendes oder nachfolgendes Leerzeichen, unabhängig davon, ob sie eingegeben wurde oder nicht
  • Boxen haben nur +als Ecken und |für die vertikalen Kanten und -für die horizontalen Seiten.
  • Eine Box muss ihre Pluspunkte haben, um als Box betrachtet zu werden. Wenn es Höhe oder Breite 2 hat (dh keinen Inhalt), sollte es immer noch entpackt sein, was abhängig von der Höhe der Box zu einer Reihe von Zeilenumbrüchen führen würde.
  • Wenn die Eingabe ein Feld enthält, aber Text außerhalb des Felds, sollte das Ganze eingerahmt sein.
  • Ihr Programm muss den gesamten Umfang der Zeichenfolge überprüfen. Wenn ein einzelnes Zeichen an der Außenseite nicht korrekt ist (entweder fehlt oder ein anderes Zeichen als das, was es sein sollte), sollte es eingerahmt und nicht entpackt werden.
  • Die Zeichenfolge ohne Box selbst kann enthalten + | -. Wenn die Zeichenfolge ohne Box selbst eine Box enthält, geben Sie die Zeichenfolge mit der Box zurück. Es sollte nur einmal entpackt werden.

Randfälle

1: Kleine Kisten

Eingang:

++
++

Die Ausgabe ist eine leere oder eine neue Zeile

Eingang:

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

Die Ausgabe ist leer oder eine neue Zeile

Eingang:

++
||
||
++

Ausgabe ist 2 Zeilenumbrüche oder 3 Zeilenumbrüche

2: Teilbox

Eingang:

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

Ausgabe:

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

3: Text außerhalb des Feldes

Eingang:

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

Ausgabe:

+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+
HyperNeutrino
quelle
1
"Keine Eingabezeile wird sowohl insgesamt als auch in jeder Zeile ein führendes oder nachfolgendes Leerzeichen enthalten, unabhängig davon, ob sie eingepackt wurde oder nicht." Einige Ihrer Testfälle haben führende Leerzeichen. Wäre eine rechteckige Eingabe zu viel verlangt?
Neil
@Neil Er meinte wahrscheinlich kein konsistentes führendes Leerzeichen, dh jede Zeile, die mit 3 Leerzeichen beginnt, wäre kein Fall, aber Zeilen, die mit 1, 2, 0, 3 Leerzeichen beginnen, würden dies tun, da diese nicht konsistent sind.
Erik der Outgolfer
Ist das eine Box oder nicht?
user41805
@Cowsquack Aus der Spezifikation geht hervor, dass dies nicht der Fall ist.
Erik der Outgolfer
@Neil Sorry, ich meine, dass alle Leerzeichen am Anfang es als keine Box rendern würden.
HyperNeutrino

Antworten:

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

Die naive Lösung. Kann oder kann nicht das Beste sein, wir werden sehen ...

ETH-Produktionen
quelle
"Kann oder kann nicht das Beste sein, wir werden sehen ..." Trotzdem ist es cool, eine Nicht-Golf-Sprache wie JS zu sehen, um dies in <200 Bytes zu lösen ... sehen, was ich dort getan habe? ;)
Erik der Outgolfer
Haha, klingt wie ein Werbespot für etwas "jetzt unter 2 Dollar!" wenn es 1,99 kostet: P
ETHproductions
Das nennt man industriellen Raub lol.
Erik der Outgolfer
Dies funktioniert für die Testfälle, aber ich denke nicht, dass es für so etwas funktioniert : '+--+\n|hi|\n|world|\n+----------+'. Es entfernt die Linien, obwohl es nicht rechteckig ist.
Rick Hitchcock
3

SOGL V0.12 , 72 Bytes

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

Probieren Sie es hier aus!

+7 bytes ( ⁰I{_=}¹χ), weil elementweise gleich nicht implementiert ist
+1 byte ( ), weil die Eingabe nicht garantiert quadratisch ist
+1 byte ( A), weil ich faul bin und keine typisierten Eingaben implementiere (dies erwartet also eine Eingabe auf dem Stapel Benutzerfreundlichkeit, der Online-Link enthält → damit das Eingabefeld verwendet werden kann)

Dzaima
quelle
⁰I{_=}¹χist +8 Bytes nicht +7.
Erik der Outgolfer
@EriktheOutgolfer gut sollte der Ersatz sein =, aber da das nicht funktioniert, ändert es die Länge um -1 + 8 = +7
dzaima
2

Gelee , 46 Bytes

ẋ2jЀ
z©⁶”|çZṖ”-çµḢ⁾-+yWWçWẎZ
ḊṖZḊṖÇ
Ỵ®2ĿÇ⁼$?Y

Probieren Sie es online aus!

Erik der Outgolfer
quelle
Um dies transponiert (reißt) die Eingabe, wenn es rechteckig gemacht wird
HyperNeutrino
@ HyperNeutrino Ich erinnere mich nicht daran, als ich antwortete ...
Erik der Outgolfer
2

Retina , 197 195 Bytes

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

Probieren Sie es online aus! Erläuterung:

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

Diese Phase ist an sich ziemlich kompliziert, deshalb werde ich sie ein wenig aufschlüsseln. +bedeutet, dass sich die Stufe wiederholt, bis keine Ersetzungen mehr gefunden werden können. m`^bedeutet, dass die Bühne am Anfang einer Zeile übereinstimmt. ((.)*)stimmt dann mit der gesamten Zeile überein. Jetzt $1ist einfach die übereinstimmende Zeile, aber es $2ist eine Liste von Übereinstimmungen, dh Zeichen. stimmt dann mit dem Zeilenende und damit dem Anfang der nächsten Zeile überein. (?<-2>.)*verwendet eine .NET-Ausgleichsgruppe. Das <-2>entfernt Übereinstimmungen von $2, solange ein Zeichen in der zweiten Zeile abgeglichen werden kann. An diesem Punkt kann eines von drei Dingen passieren:

  • In der zweiten Zeile waren nicht genügend Zeichen. $2hat noch einige Streichhölzer übrig.
  • Die beiden Linien waren genau gleich lang. $2hat keine Übereinstimmungen mehr und wir sind am Ende der Linie.
  • Die zweite Zeile ist länger, sodass mindestens ein Zeichen übrig bleibt.

(?(2)$|(.)))hilft, diese anhand einer Bedingung zu unterscheiden. Wenn $2noch einige Übereinstimmungen vorhanden sind, muss dies der Fall sein, da die zweite Zeile zu kurz ist, sodass wir mit dem Ende der Zeile übereinstimmen. Wenn $2jedoch keine Übereinstimmungen mehr vorhanden sind, soll die zweite Zeile länger sein, damit wir übereinstimmen ein Charakter (der darauf eingeht, $4damit wir wissen, dass das Match stattgefunden hat). Andernfalls sind die beiden Zeilen gleich lang und die Übereinstimmung schlägt an dieser Stelle fehl (möglicherweise stimmt sie in einer späteren Zeile erneut überein).

Die Ersatzzeichenfolge ist $1$#4$* $3$#2$*. Das ergibt $#4, 1ob wir ein zusätzliches Zeichen in der zweiten Zeile gefunden haben, 0wenn nicht. Dies bedeutet, dass $#4$*der ersten Zeile ein Leerzeichen hinzugefügt wird, wenn die zweite Zeile länger war. Ebenso $#2$*fügt Räume in die zweite Zeile , wenn die erste Zeile länger war. (Tatsächlich wird genau die richtige Anzahl von Leerzeichen hinzugefügt. Wenn wir nur zwei Zeilen +ausgeglichen hätten, hätte der vierten Erfassungsgruppe ein hinzugefügt werden können, um dies auch für den Fall der längeren zweiten Zeile direkt zu erreichen.)

Das Ergebnis all dessen ist, dass diese Stufe die Eingabe in ein Rechteck auffüllt. Wir können jetzt eine Kiste darum zeichnen.

%`^|$
|

Platziere |s auf jeder Seite.

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

Legen Sie +-...-+auf der Oberseite.

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

Und wieder unten.

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

Überprüfen Sie, ob wir eine Doppelbox erstellt haben. In diesem Fall werden oben und unten zusätzliche Leerzeilen hinzugefügt, damit die verbleibenden Stufen übereinstimmen und beide Felder gelöscht werden.

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

Wenn eine nachgestellte Leerzeile vorhanden ist, entfernen Sie zwei Zeichen am Anfang und Ende jeder Zeile.

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

Wenn eine führende Leerzeile vorhanden ist, löschen Sie diese und die nächsten beiden Zeilen (die -s bleiben oben im Feld). Wenn eine nachgestellte Leerzeile vorhanden ist, löschen Sie diese und die beiden vorherigen Zeilen. Der (\G|¶)befasst sich mit dem Fall, dass es nur sechs Zeilen (und damit 5 s) gibt, weil die Box keinen Inhalt hatte.

Neil
quelle