此任务是“ 首次定期Premier Programming Puzzle Push”的一部分。
您将获得以下格式的项目层次结构:
2
Hat
1
Gloves
需要放在盒子里,就像这样:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
在输入格式中,数字以一个框开头,其中包含与数字指定数量一样多的项目。第一个盒子里面有两个物品(帽子和包含手套的盒子),第二个盒子只包含一个物品–手套。
可以看出,盒子也可以放在盒子里面。而且它们总是圆的……有点(尖角是伤人的危险,我们不希望这样)。
对于那些想要利用规范给出的每条细微回旋余地的人来说,下面是令人讨厌的细节。请注意,不阅读规格并不是提交错误解决方案的借口。最后有一个测试脚本和一些测试用例。
规格
框由以下字符构成:
|
(U + 007C)用于构造垂直边缘。-
(U + 002D)用于构造水平边缘。'
(U + 0027)是圆形的下角。.
(U + 002E)是圆形的上角。
因此,一个框如下所示:
.--. | | '--'
请注意,尽管Unicode也具有圆角和适当的框形图字符,但此任务仅以ASCII格式。尽管我非常喜欢Unicode,但我意识到在第二个到最后一个十年中还没有语言和环境。
框可以包含一系列项目,这些项目可以是文本,也可以是其他项目。框中的各个项目从上到下呈现。因此,序列A,B,C表示如下:
.---. | A | | B | | C | '---'
当然,这也适用于嵌套框,嵌套框就像文本一样。因此序列A,B,Box(C,Box(D,E)),F将呈现如下:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
框会根据内容调整其大小,而嵌套框始终会扩展到其父级的大小。内容前后总是有一个空格,因此文本和嵌套框都不会太靠近外框的边缘。简而言之,以下是错误的:
.---. |Box| '---'
并且以下是正确的:
.-----. | Box | '-----'
看起来也更好:-)
文本项(请参见下面的输入)必须准确复制。
始终只有一个顶级框(参见XML)。但是,一个盒子可以包含其他几个盒子。
输入项
输入基于标准输入;为了更方便的测试,可能是从文件重定向。
输入是逐行给出的,每行代表一个文本项以放置在当前框中或打开一个新框。
每行以换行符终止。
文本项由不包含数字的行标记(请参见下文)。文本使用字母字符,空格和标点符号(
.,-'"?!()
)。文本不会以空格开头或结尾,并且将始终至少包含一个字符。一个框以一行开头并带有数字。数字表示盒子的大小,即放入其中的以下物品的数量:
2 A B
产生一个带有两个文本项的框:
.---. | A | | B | '---'
一个盒子将始终包含至少一项。
框的末尾未明确标记为一行;而是在将指定数量的项目放入其中后暗中关闭这些框。
无论盒子中有多少个物品,盒子始终只是一个物品。例如
3 A 4 a b c d B
将产生一个包含三个项目的盒子,第二个是另一个包含四个项目的盒子。
嵌套也不会影响盒子只是单个项目的事实。
限度
最大嵌套级别为5。即彼此之间最多有五个盒子。这包括最外面的一个。
每个盒子最多有十个物品。
文本项的最大长度为100个字符。
输出量
- 输出是根据上述规则包含所有包含和嵌套项目的渲染框。
- 输出应在标准输出上给出,并且必须完全匹配。不允许前导或尾随空格。
- 每行必须以换行符结尾,包括最后一个。
获奖条件
- 最短的代码获胜(即获得可接受的答案)。
样品输入1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
样品输出1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
样品输入2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
样品输出2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
样品输入3
1
1
1
1
1
Extreme nesting Part Two
样品输出3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
样品输入4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
样品输出4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
测试脚本
由于有时很难正确地获取详细信息,我们(Ventero和我)已经准备了一个测试脚本,您可以运行您的解决方案以检查其是否正确。它既可以用作PowerShell脚本,也可以用作bash脚本。调用是:<test-script> <program invocation>
。
更新: 测试脚本已更新;有许多测试用例不符合我定义的限制。PowerShell测试脚本未使用区分大小写的比较来检查结果。我希望现在一切都好。测试用例的数量减少到156,尽管现在的最后一个相当大。
更新2: 我上传了我的测试用例生成器。以C#编写,针对.NET 2运行时。它在Mono上运行。它可以帮助人们测试其实施。考虑到任务中的限制,在最坏的情况下,您可以尝试:
nb.exe 1 10 10 5 100 100 | my invocation
它将仅生成最内层的框,并同时使用每个框的最大项目数和文本项目的最大长度。但是,我没有将此测试用例包含在测试脚本中,因为它很大并且输出更大。
更新3: 我更新了PowerShell测试脚本,该脚本容易引发错误,具体取决于脚本中的行尾如何以及解决方案打印的行尾。现在,两者都应该不可知。再次抱歉造成混乱。