在这一挑战中,我们提供了Ascii用户界面。
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
每个这样的图形都由一个元素组成,其中可以包含子元素。下面列出了可能的元素:
- 文字元素。包含一行或多行文本。
- 框元素。包含一个被边框包围的子元素。边界的
+
s在角和-
s|
在边缘。 - 水平列表。包含一个或多个水平对齐的元素。
- 垂直列表。包含一个或多个在垂直方向上彼此对齐并在水平方向上向左对齐的元素。
每个元素都是一个矩形。
每个元素除其内容外,还具有称为基线的属性。基线用于垂直对齐元素:水平列表的每个元素都对齐,以使其基线在同一行上。在下面的示例中,基线包含字符aeg
。三个盒元件的基线是(0-索引)1
,3
和2
。
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
使用以下规则确定基线:
- 对于文本元素,文本的第一行是基线,即。
0
。 - 对于框元素,基线是1 +子元素的基线。
- 对于水平列表,基线是列表中的最大基线(
3
在上面的示例中)。 - 对于垂直列表,基线是元素的基线,必须在输入中指定。
输入值
输入是某种格式的接口规范(例如,列表,json)。示例输入具有以下格式:
- 字符串元素是字符串:
"..."
- 一个box元素是一个列表,而第一个元素是
"b"
:["b", subelement]
- 水平列表是第一个元素是的列表
"h"
:["h", items...]
- 垂直列表是列表的第一个元素
"v"
,第二个元素是使用基线的元素的(0索引)编号:["v", n, items...]
输出量
输出必须包含使用上面指定的规则对齐的元素。输出可以是stdout,字符串列表或其他有意义的东西。
计分
这是代码高尔夫球,通常的规则适用。
测试用例
1个
["b", ["v", 0, ["h", ["b", "<- Previous"], ["b", "Next ->"]], "== The title ==\n\nLorem ipsum dolor\nsit amet...", ["b", "Post a comment"], ["b", "User X commented:\n\nThis is amazing!"], ["b", "User Y commented:\n\nlol"]]]
+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title == |
| |
|Lorem ipsum dolor |
|sit amet... |
|+--------------+ |
||Post a comment| |
|+--------------+ |
|+-----------------+ |
||User X commented:| |
|| | |
||This is amazing! | |
|+-----------------+ |
|+-----------------+ |
||User Y commented:| |
|| | |
||lol | |
|+-----------------+ |
+----------------------+
2
["h", ["b", ["v", 0, "a", "b"]], ["b", ["v", 2, "c", "d", "e"]], ["b", ["v", 1, "f", "g", "h"]]]
+-+
|c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+ +-+
3
["h", ["b", ["v", 0, ["b", ["h", "a\nb", "c"]], "d", "e", ["h", ["h", "f"], ["b", ["h", "g"]], "h"]]], ["b", "ijk\nl\nmn\no"], ["v", 2, ["b", "pqrst"], ["b", "uv\nw"], ["b", "x"]], ["b", ["b", ["b", "yz"]]]]
+-----+
|pqrst|
+-----+
+--+
|uv|
|w | +------+
+-----+ +--+ |+----+|
|+--+ |+---++-+ ||+--+||
||ac| ||ijk||x| |||yz|||
||b | ||l |+-+ ||+--+||
|+--+ ||mn | |+----+|
|d ||o | +------+
|e |+---+
| +-+ |
|f|g|h|
| +-+ |
+-----+
4
["h", "a * b = ", ["v", 0, "a + a + ... + a", "\\_____________/", " b times"]]
a * b = a + a + ... + a
\_____________/
b times
2
亲爱的耶稣...这又是地缘。
—
魔术章鱼缸
我不太确定基准的工作原理,您能进一步解释一下吗?
—
Stan Strum,
@StanStrum基线用于垂直对齐水平列表中的项目。项目的基线应该匹配,即 它们都应该是同一物理行。例如,在swcond示例中,第一个框已向下移动,因此字母
—
fergusq
a
与处在同一行e
,因为它们均位于框的基线处。我不确定“基线”是否是正确的词,我只知道它在印刷领域中用于类似目的。
@fergusq在第一个子句上:“对于文本元素,文本的第一行是基线,即0。”,这是否意味着其他“基线”会将文本上移?
—
Stan Strum,
@fergusq基线应该是正确的词,IIRC也在CSS flexbox的描述中使用
—
ASCII码,仅ASCII,