Переключить коробку!


9

Учитывая строку, которая может быть в штучной упаковке, переключите флажок. Это становится понятнее в тестовых примерах и объяснениях.

Ввод, вывод

Формат ввода

Входными данными будут либо одна строка, разделенная CR, LF или CRLF, либо список строк. Формат ввода зависит от вас, чтобы решить.

Выходной формат

Выходной формат должен быть в том же формате, что и входной.

Объяснение + Пример

Давайте возьмем коробочную строку в качестве примера:

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

Чтобы переключить флажок, мы удаляем первую и последнюю строку и первый и последний столбец. Вы можете предположить, что после последней строки не будет завершающих пробелов (с необязательным завершающим символом новой строки в конце последней строки), а также нет пробельных символов в какой-либо строке, не считая новой строки, конечно.

Это станет:

Hello, World!

Другой способ

Если строка отсутствует в поле, добавьте в нее поле. Это довольно просто; добавьте +---...---+к отдельной строке с kпунктирными линиями где kдлина самой длинной строки, а затем для каждой строки добавьте в конце пробел, чтобы соответствовать длине самой длинной строки, а затем добавьте и добавьте символ конвейера ( "|"). Наконец, добавьте строку, содержащую ту же +---...---+настройку, что и первая строка.

Например:

Hello, World!

будет выглядеть так:

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

Вы можете предположить, что ни одна из строк во входных данных не будет содержать пробелы в конце.

Еще один пример строки, в которую нужно поместить рамку:

Hello,
    World!

становится

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

Пример чего-то, что все еще должно быть в штучной упаковке:

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

будет выглядеть так:

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

Правила + Технические характеристики

  • Применяются стандартные лазейки
  • Ни одна строка ввода не будет иметь начальных или конечных пробелов как в целом, так и в каждой строке, независимо от того, было ли оно помещено в рамку.
  • Коробки будут иметь +как свои углы, так и |вертикальные края и -горизонтальные стороны.
  • Коробка должна иметь свои плюсы, чтобы считаться коробкой; если он имеет высоту или ширину 2 (то есть без содержимого), он все равно должен быть распакован, что приведет к куче новых строк в зависимости от высоты поля.
  • Если у ввода есть поле, но текст за пределами поля, все это должно быть упаковано.
  • Ваша программа должна проверять весь периметр строки. Если один символ снаружи не является правильным (либо отсутствует, либо отличается от того, который должен быть), то он должен быть в штучной упаковке, а не в штучной упаковке.
  • Сама распакованная строка может содержать + | -. Если у самой неупакованной строки есть рамка, верните строку с этим полем; он должен быть распакован только один раз.

Краевые Чехлы

1: Маленькие коробки

Входные данные:

++
++

Вывод пустой или перевод строки

Входные данные:

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

Вывод пуст или перевод строки

Входные данные:

++
||
||
++

Вывод 2 новых или 3 новых строки

2: Частичная коробка

Входные данные:

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

Вывод:

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

3: текст за пределами поля

Входные данные:

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

Вывод:

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

1
«Никакая строка ввода не будет иметь начальных или конечных пробелов как в целом, так и в каждой строке, независимо от того, была ли она включена в квадрат». Некоторые из ваших тестов имеют пробелы в начале. Было бы слишком много, чтобы спросить прямоугольный ввод?
Нил

@Neil Он, вероятно, имел в виду отсутствие последовательных начальных пробелов, то есть каждая строка, начинающаяся с 3 пробелов, не имела бы значения, но строки, начинающиеся с 1, 2, 0, 3 пробелов, имели бы место, поскольку они не согласованы.
Эрик Outgolfer

Является ли это коробка или нет?
user41805

@ Cowsquack Из спецификации кажется, что это не так.
Эрик Outgolfer

@Neil Извините, я имею в виду, что любые пробелы в начале будут отображать это как поле.
HyperNeutrino

Ответы:


6

JavaScript (ES2017), 199 байт

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

Наивное решение. Можем или не будем лучшими, посмотрим ...


«Может быть, или нет, мы увидим ...», но все же здорово видеть язык, не относящийся к игре в гольф, такой как JS, чтобы решить эту проблему в <200 байтов… посмотрите, что я там делал? ;)
Эрик Outgolfer

Ха-ха, звучит как реклама для чего-то "сейчас под 2 доллара!" когда это стоит 1,99: P
ETHпродукция

Это называется промышленным грабежом, смеется.
Эрик Outgolfer

Это работает для тестов, но я не думаю , что он работает на что - то вроде этого: '+--+\n|hi|\n|world|\n+----------+'. Он удаляет линии, даже если он не прямоугольный.
Рик Хичкок,

3

SOGL V0.12 , 72 байта

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

Попробуй здесь!

+7 bytes ( ⁰I{_=}¹χ), потому что поэлементное равенство не реализовано
+1 byte ( ), потому что ввод не гарантирован, будет квадратом
+1 byte ( A), потому что я ленивый и не реализую типизированные вводы (так что это ожидает ввода в стеке. простота использования, онлайн-ссылка включает в себя →, поэтому можно использовать поле ввода)


⁰I{_=}¹χ+8 байт не +7.
Эрик Outgolfer

@EriktheOutgolfer хорошо замена должна быть =, но так как это не работает, она меняет длину на -1 + 8 = +7
dzaima


2

Сетчатка , 197 195 байт

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

Попробуйте онлайн! Объяснение:

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

Этот этап сам по себе довольно сложный, поэтому я его немного разбью. +означает, что этап повторяется до тех пор, пока не будет найдено никаких замен. m`^означает, что этап совпадает в начале любой строки. ((.)*)затем соответствует всей строке. Теперь $1это просто совпадающая строка, но $2это список совпадений, то есть символов. затем соответствует концу строки и, следовательно, началу следующей строки. (?<-2>.)*использует балансирующую группу .NET. В <-2>Удаляет результаты от до $2тех пор , как персонаж может быть подобран на второй линии. На этом этапе может произойти одно из трех:

  • Во второй строке не хватило символов. $2еще осталось несколько матчей.
  • Две линии были одинаковой длины. $2не осталось ни одного совпадения, и мы находимся в конце строки.
  • Вторая строка длиннее, поэтому остался хотя бы один символ.

(?(2)$|(.)))помогает отличить их с помощью условия. Если $2все еще осталось несколько совпадений, то нам нужно, чтобы это было потому, что вторая строка слишком короткая, поэтому мы сопоставляем конец строки, но если $2совпадений не осталось, мы хотим, чтобы вторая строка была длиннее, поэтому мы сопоставляем персонаж (который входит в то, $4чтобы мы знали, что совпадение произошло). В противном случае две строки имеют одинаковую длину, и на этом этапе совпадение не будет выполнено (оно может снова совпадать на более поздней строке).

Строка замены есть $1$#4$* $3$#2$*. В $#4принимает значение , 1если мы соответствует дополнительный символ на второй линии, 0если нет. Это означает, что $#4$*добавляет пробел к первой строке, если вторая строка была длиннее. Аналогично $#2$*добавляет пробелы во вторую строку, если первая строка была длиннее. (Фактически, это заканчивает тем, что добавляло точно правильное число пробелов. Если бы мы только уравновешивали две строки, a +мог бы быть добавлен к четвертой группе захвата, чтобы достигнуть этого непосредственно для случая более длинной второй строки также.)

Результатом всего этого является то, что этот этап дополняет ввод в прямоугольник. Теперь мы можем нарисовать рамку вокруг него.

%`^|$
|

Поместите |s с каждой стороны.

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

Поместите +-...-+сверху.

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

И снова внизу.

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

Посмотрим, создали ли мы двойную коробку. Если это так, дополнительные пустые строки добавляются сверху и снизу, чтобы остальные этапы соответствовали друг другу, чтобы удалить оба поля.

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

Если есть завершающая пустая строка, удалите два символа из начала и конца каждой строки.

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

Если есть начальная пустая строка, удалите ее и следующие две строки (которые будут -оставаться в верхней части окна). Если есть завершающая пустая строка, удалите ее и две предыдущие строки. В (\G|¶)касается случая , где есть только шесть строк (и , следовательно , 5 лет) , потому что коробка не имела никакого содержания.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.