Przełącz skrzynkę!

9

Biorąc pod uwagę ciąg, który jest potencjalnie zapakowany, przełącz pole. Staje się to wyraźniejsze w przypadkach testowych i wyjaśnieniach.

Wejście wyjście

Format wejściowy

Dane wejściowe będą albo pojedynczym ciągiem oddzielonym CR, LF lub CRLF, albo listą ciągów. Format wejściowy zależy od Ciebie.

Format wyjściowy

Format wyjściowy musi być taki sam jak format wejściowy.

Wyjaśnienie + przykład

Weźmy jako przykład ciąg w pudełku:

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

Aby przełączyć pole, usuwamy pierwszy i ostatni wiersz oraz pierwszą i ostatnią kolumnę. Możesz założyć, że po ostatnim wierszu nie będzie końcowych białych znaków (z opcjonalnym końcowym znakiem nowej linii na końcu ostatniego wiersza) i że nie będzie żadnych białych znaków końcowych w żadnym wierszu, oczywiście nie licząc nowego wiersza.

Stałoby się to:

Hello, World!

Inna droga

Jeśli ciąg nie znajduje się w polu, dodaj do niego pole. To jest dość proste; dodawaj +---...---+do własnej linii z kmyślnikami, gdzie kjest długość najdłuższej linii, a następnie dla każdej linii, dopełniaj ją końcowymi spacjami, aby pasowała do długości najdłuższej linii, a następnie dodawaj i dołączaj znak potoku ( "|"). Na koniec dodaj wiersz zawierający tę samą +---...---+konfigurację co pierwszy wiersz.

Na przykład:

Hello, World!

staje się:

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

Możesz założyć, że żadna z linii wejściowych nie będzie miała spacji końcowych.

Kolejny przykład ciągu, który powinien zawierać pole:

Hello,
    World!

staje się

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

Przykład czegoś, co wciąż powinno być zapakowane:

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

staje się:

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

Zasady + specyfikacje

  • Obowiązują standardowe luki
  • Żaden wiersz danych wejściowych nie będzie zawierał początkowych ani końcowych białych znaków zarówno ogólnie, jak i w każdym wierszu, niezależnie od tego, czy został wstawiony
  • Pudełka będą miały tylko +rogi i |krawędzie pionowe oraz -boki poziome.
  • Pudełko musi mieć swoje plusy, aby mogło być uważane za pudełko; jeśli ma wysokość lub szerokość 2 (to znaczy bez zawartości), nadal powinien być rozpakowany, co spowoduje powstanie wiązki nowych linii, w zależności od wysokości pudełka.
  • Jeśli wejście zawiera pole, ale tekst poza polem, całość powinna być zapakowana.
  • Twój program musi sprawdzić cały obwód łańcucha. Jeśli pojedynczy znak na zewnątrz jest niepoprawny (brakujący lub inny znak niż powinien), należy go zapakować, a nie rozpakować.
  • Sam rozpakowany ciąg może zawierać + | -. Jeśli sam rozpakowany ciąg ma wokół siebie pudełko, zwróć ciąg wraz z pudełkiem; należy go rozpakować tylko raz.

Edge Cases

1: Małe pudełka

Wejście:

++
++

Dane wyjściowe to pusty lub nowy wiersz

Wejście:

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

Dane wyjściowe są puste lub nowy wiersz

Wejście:

++
||
||
++

Wyjście to 2 nowe linie lub 3 nowe linie

2: Częściowe pudełko

Wejście:

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

Wynik:

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

3: Tekst poza polem

Wejście:

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

Wynik:

+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+
HyperNeutrino
źródło
1
„Żaden wiersz danych wejściowych nie będzie zawierał początkowych ani końcowych białych znaków zarówno ogólnie, jak i w każdym wierszu, niezależnie od tego, czy został wstawiony.” Kilka twoich przypadków testowych ma wiodące białe znaki. Czy pytanie prostokątne byłoby zbyt wielkim pytaniem?
Neil,
@ Neil Miał zapewne na myśli brak spójnych wiodących białych znaków, tzn. Każda linia zaczynająca się od 3 spacji nie byłaby przypadkiem, ale linie zaczynające się od 1, 2, 0, 3 spacji byłyby, ponieważ nie są one spójne.
Erik the Outgolfer,
Czy to jest pudełko czy nie?
user41805
@ Cowsquack Ze specyfikacji wydaje się, że nie jest.
Erik the Outgolfer,
@Neil Przepraszamy, to znaczy, że dowolne spacje na początku renderowałyby to jako pole.
HyperNeutrino,

Odpowiedzi:

6

JavaScript (ES2017), 199 bajtów

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

Naiwne rozwiązanie. Może być najlepszy, zobaczymy ...

ETHprodukcje
źródło
„Może i nie będzie najlepszy, zobaczymy ...” nadal fajnie jest widzieć język nie golfowy, taki jak JS, aby rozwiązać ten problem w <200 bajtach ... widzisz, co tam zrobiłem? ;)
Erik the Outgolfer
Haha, brzmi jak reklama czegoś „teraz poniżej 2 dolarów!” kiedy kosztuje 1,99: P
ETHprodukcje
To się nazywa lol rabunku przemysłowego .
Erik the Outgolfer,
To działa dla przypadków testowych, ale nie sądzę, że działa na coś takiego: '+--+\n|hi|\n|world|\n+----------+'. Usuwa linie, nawet jeśli nie są prostokątne.
Rick Hitchcock,
3

SOGL V0.12 , 72 bajty

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

Wypróbuj tutaj!

+7 bajtów ( ⁰I{_=}¹χ), ponieważ elementwise jest równe, nie jest zaimplementowany
+1 bajt ( ), ponieważ nie można zagwarantować, że będzie to kwadrat
+1 bajt ( A), ponieważ jestem leniwy i nie implementuję wpisywanych danych wejściowych (więc oczekuje to danych wejściowych na stosie. łatwość użycia, link online zawiera →, aby można było użyć pola wprowadzania)

dzaima
źródło
⁰I{_=}¹χjest +8 bajtów, a nie +7.
Erik the Outgolfer,
@EriktheOutgolfer dobrze, wymiana powinna być =, ale ponieważ to nie działa, zmienia długość o -1 + 8 = +7
dzaima
2

Galaretka , 46 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
Hmm, to transponuje (zamki) dane wejściowe podczas tworzenia prostokąta
HyperNeutrino,
@HyperNeutrino Nie pamiętam, żeby to robiłem, kiedy odpowiedziałem ...
Erik the Outgolfer
2

Retina , 197 195 bajtów

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

Wypróbuj online! Wyjaśnienie:

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

Ten etap sam w sobie jest dość skomplikowany, więc trochę go podzielę. +oznacza, że ​​etap się powtarza, aż nie będzie już można znaleźć zamienników. m`^oznacza, że ​​etap dopasowuje się na początku dowolnej linii. ((.)*)następnie dopasowuje całą linię. Teraz $1jest po prostu dopasowana linia, ale $2jest to lista dopasowań, tj. Znaków. następnie dopasowuje koniec linii, a tym samym początek następnej linii. (?<-2>.)*używa grupy równoważącej .NET. W <-2>Usuwa mecze z $2tak długo jak znak może być dopasowana w drugiej linii. W tym momencie może się zdarzyć jedna z trzech rzeczy:

  • W drugiej linii nie było wystarczającej liczby znaków. $2wciąż zostało kilka dopasowań.
  • Dwie linie miały dokładnie taką samą długość. $2nie ma żadnych dopasowań, a my jesteśmy na końcu linii.
  • Druga linia jest dłuższa, więc pozostała przynajmniej jedna postać.

(?(2)$|(.)))pomaga odróżnić je za pomocą warunku. Jeśli $2nadal pozostało kilka dopasowań, musimy to zrobić, ponieważ druga linia jest zbyt krótka, więc dopasowujemy koniec linii, ale jeśli $2nie ma żadnych dopasowań, chcemy, aby druga linia była dłuższa, więc dopasowujemy postać (która wchodzi $4, abyśmy wiedzieli, że dopasowanie się stało). W przeciwnym razie dwie linie mają tę samą długość i dopasowanie nie powiedzie się w tym momencie (może się zgadzać ponownie w późniejszej linii).

Ciąg zastępujący to $1$#4$* $3$#2$*. W $#4Zwraca 1jeśli dopasowane dodatkowy znak w drugim wierszu, 0czy nie. Oznacza to, że $#4$*dodaje spację do pierwszego wiersza, jeśli drugi wiersz był dłuższy. Podobnie $#2$*dodaje spacje do drugiej linii, jeśli pierwsza linia była dłuższa. (W rzeczywistości kończy się to dodaniem dokładnie odpowiedniej liczby spacji. Gdybyśmy tylko balansowali dwie linie, to +mogłaby zostać dodana do czwartej grupy przechwytywania, aby osiągnąć to bezpośrednio również w przypadku dłuższej drugiej linii.)

Konsekwencją tego wszystkiego jest to, że ten etap wypełnia wejście w prostokąt. Możemy teraz narysować wokół niego pudełko.

%`^|$
|

Umieść |s po każdej stronie.

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

Umieść +-...-+na górze.

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

I znowu na dole.

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

Sprawdź, czy stworzyliśmy podwójne pudełko. Jeśli tak, dodatkowe puste linie są dodawane u góry iu dołu, aby pozostałe etapy były dopasowane, aby usunąć oba pola.

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

Jeśli występuje końcowa pusta linia, usuń dwa znaki na początku i na końcu każdej linii.

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

Jeśli jest wiodący pusty wiersz, usuń go i następne dwa wiersze (które będą -pozostałymi na górze pola). Jeśli występuje końcowa pusta linia, usuń ją i poprzednie dwa wiersze. Na (\G|¶)dotyczy przypadku, w którym jest tylko sześć linii (a więc 5 S), ponieważ nie miał zawartość skrzynki.

Neil
źródło