切换框!


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)'17年

这个盒子或不?
user41805

@Cowsquack从规格来看似乎不是。
大公埃里克(Erik the Outgolfer)'17年

@Neil抱歉,我的意思是,开头的任何空格都将其呈现为非盒子。
HyperNeutrino

Answers:


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字节以下解决这个问题……看看我在那儿做了什么?;)
Erik the Outgolfer

哈哈,听起来像是“现在不到2美元!”的广告。当它花费1.99时:P
ETHproductions'Jul

那就是工业抢劫大声笑。
暴民埃里克(Erik the 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个字节(⁰I{_=}¹χ),因为未实现元素逐个等距
+1字节(),因为对于我来说,输入不能保证是平方
+1字节(A),所以我懒惰而不是实现类型化的输入(因此,这期望在堆栈上输入。)易于使用,在线链接包括→,因此可以使用输入框)


⁰I{_=}¹χ是+8个字节,而不是+7个字节。
大公埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer很好,替换应该是=,但是那样行不通,它的长度更改为-1 + 8 = +7
dzaima


2

视网膜197195字节

+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的情况下交易,因为盒子没有内容S)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.