Ascii用户界面


18

在这一挑战中,我们提供了Ascii用户界面。

+----------------------+
|+-----------++-------+|
||<- Previous||Next ->||
|+-----------++-------+|
|== The title ==       |
|                      |
|Lorem ipsum dolor     |
|sit amet...           |
|+--------------+      |
||Post a comment|      |
|+--------------+      |
|+-----------------+   |
||User X commented:|   |
||                 |   |
||This is amazing! |   |
|+-----------------+   |
|+-----------------+   |
||User Y commented:|   |
||                 |   |
||lol              |   |
|+-----------------+   |
+----------------------+

每个这样的图形都由一个元素组成,其中可以包含子元素。下面列出了可能的元素:

  1. 文字元素。包含一行或多行文本。
  2. 框元素。包含一个被边框包围的子元素。边界的+s在角和-s |在边缘。
  3. 水平列表。包含一个或多个水平对齐的元素。
  4. 垂直列表。包含一个或多个在垂直方向上彼此对齐并在水平方向上向左对齐的元素。

每个元素都是一个矩形。

每个元素除其内容外,还具有称为基线的属性。基线用于垂直对齐元素:水平列表的每个元素都对齐,以使其基线在同一行上。在下面的示例中,基线包含字符aeg。三个盒元件的基线是(0-索引)132

   +-+   
   |c|+-+
+-+|d||f|
|a||e||g|
|b|+-+|h|
+-+   +-+

使用以下规则确定基线:

  1. 对于文本元素,文本的第一行是基线,即。0
  2. 对于框元素,基线是1 +子元素的基线。
  3. 对于水平列表,基线是列表中的最大基线(3在上面的示例中)。
  4. 对于垂直列表,基线是元素的基线,必须在输入中指定。

输入值

输入是某种格式的接口规范(例如,列表,json)。示例输入具有以下格式:

  1. 字符串元素是字符串: "..."
  2. 一个box元素是一个列表,而第一个元素是"b"["b", subelement]
  3. 水平列表是第一个元素是的列表"h"["h", items...]
  4. 垂直列表是列表的第一个元素"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示例中,第一个框已向下移动,因此字母a与处在同一行e,因为它们均位于框的基线处。我不确定“基线”是否是正确的词,我只知道它在印刷领域中用于类似目的。
fergusq

@fergusq在第一个子句上:“对于文本元素,文本的第一行是基线,即0。”,这是否意味着其他“基线”会将文本上移?
Stan Strum,

@fergusq基线应该是正确的词,IIRC也在CSS flexbox的描述中使用
ASCII码,仅ASCII,

Answers:


10

Python 3中721个 694 693 671 661字节

编辑:由于@Arnold Palmer@Step Hen而保存了27个字节

编辑:保存1个字节

编辑:由于@Arnold Palmer,节省了22个字节

编辑:保存了10个字节

这可能打了很多球

L,M,R,e=len,max,range,lambda t:([list(r)+[" "]*(M(map(L,t.split("\n")))-L(r))for r in t.split("\n")],0)if str==type(t)else b(t)if"h">t[0]else h(t)if"v">t[0]else v(t);F=lambda t:"\n".join(map("".join,e(t)[0]))
def h(t):
	t=[e(r)for r in t[1:]];Z=M(s[1]for s in t);X=M(L(s[0])-s[1]for s in t)+Z;u=[[]for i in R(X)]
	for a,b in t:u=[u[j]+[Z-b<=j<L(a)+Z-b and a[j-Z+b][i]or" "for i in R(L(a[0]))]for j in R(X)]
	return u,Z
def b(t):t,b=e(t[1]);u=[["+",*"-"*L(t[0]),"+"]];return u+[["|"]+r+["|"]for r in t]+u,1+b
def v(t):w=[e(r)for r in t[2:]];return[a[i]+[" "]*(M(L(a[0])for a,d in w)-L(a[i]))for a,c in w for i in R(L(a))],sum(L(x[0])for x in w[:t[1]])+w[t[1]][1]

在线尝试


您还可以将所有定义P,L,M,R,K=[" "],len,max,range,map移至程序顶部(变量位于顶部),并移至之外F。这样做可以将其压缩到至少711个字节。(TIO链接太大,无法发布)。
阿诺德·帕尔默

@StepHen现在,我已经解决了问题。:-)
暴民埃里克(Erik the Outgolfer)'17年

降至671。由于TIO链接太长,因此不得不使用tinyurl。我对您的maps 做了大量修改,因为可以用普通的列表理解工具代替它们。因为我能够裁剪map出很多s,所以我也删除了该K变量,因为它花费了2个字节。
阿诺德·帕尔默

做得好。您赢了赏金。
奥利弗·尼
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.