Перемикайте коробку!


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, будуть, оскільки вони не є послідовними.
Erik the Outgolfer

Є чи це коробка чи ні?
користувач41805

@Cowsquack З специфікації здається, що це не так.
Ерік Аутгольфер

@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 байт ... Подивіться, що я там зробив? ;)
Ерік Аутгольфер

Ха-ха, це звучить як рекламний ролик на щось "зараз під 2 долари!" коли це коштує 1,99: P
ETHproductions

Це називається промисловим пограбуванням lol.
Ерік Аутгольфер

Це працює для тестів, але я не думаю , що він працює на що - щось на зразок цього: '+--+\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 байт ( ⁰I{_=}¹χ), тому що елементарно дорівнює не реалізовано
+1 байт ( ), оскільки для мене введення не гарантовано квадратним
+1 байтом ( A), для мене лінь і не вводяться введені входи (тому це очікує введення в стек. Для простота у використанні, онлайн-посилання включає →, щоб поле для введення можна було використовувати)


⁰I{_=}¹χстановить +8 байт не +7.
Ерік Аутгольфер

@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|¶)-*¶-*¶$

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.