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つの要素で構成されています。可能な要素は次のとおりです。

  1. テキスト要素。1行以上のテキストが含まれます。
  2. ボックス要素。境界線で囲まれた1つのサブ要素が含まれます。境界線+のコーナーと-s、および|エッジにsがあります。
  3. 水平リスト。水平に配置された1つ以上の要素が含まれます。
  4. 垂直リスト。垂直方向および水平左方向に互いに整列された1つ以上の要素が含まれます。

すべての要素は長方形です。

各要素には、そのコンテンツに加えて、baselineというプロパティがあります。ベースラインは、要素を垂直に配置するために使用されます。水平リストのすべての要素は、ベースラインが同じ行にあるように配置されます。次の例では、ベースラインに文字が含まれていますaeg。3つのボックス要素のベースライン(0インデックス)であり13そして2

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

ベースラインは、次のルールで決定されます。

  1. テキスト要素の場合、テキストの最初の行はベースラインです。0
  2. ボックス要素の場合、ベースラインは1 +サブ要素のベースラインです。
  3. 水平リストの場合、ベースラインはリストの最大ベースラインです(3上記の例)。
  4. 垂直リストの場合、ベースラインは要素のベースラインであり、入力で指定する必要があります。

入力

入力は、何らかの形式のインターフェイスの仕様です(リスト、jsonなど)。入力例の形式は次のとおりです。

  1. 文字列要素は文字列です: "..."
  2. ボックス要素は、最初の要素が次のリストである"b"["b", subelement]
  3. 水平リストは、最初の要素が次のリストである"h"["h", items...]
  4. 垂直リストは、最初の要素が含まれるリストで"v"あり、2番目の要素は、ベースラインが使用される要素の(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
甘いイエス...それは再び地質です。
魔法のタコUr

ベースラインがどのように機能するかはよくわかりませんが、さらに説明していただけますか?
スタンストラム

@StanStrumベースラインは、水平リスト内のアイテムを垂直に整列するために使用されます。アイテムのベースラインは一致する必要があります。それらはすべて同じ物理行である必要があります。たとえば、swcondの例では、最初のボックスが下に移動しており、両方のボックスのベースラインにあるため、文字aはと同じ行にありeます。「ベースライン」がこれに対する正しい単語であるかどうかは完全にはわかりませんが、それが似たような目的のためにタイポグラフィの分野で使用されていることだけを知っています。
-fergusq

@fergusq最初の節:「テキスト要素の場合、テキストの最初の行はベースライン、つまり0です。」、これは他の「ベースライン」がテキストを上にシフトしていることを意味しますか?
スタン・ストラム

ベースラインが正しい単語、IIRCそれは同様にCSSのフレキシボックスの説明に使われていなければなりません@fergusq
ASCIIのみ

回答:


10

Pythonの3721の 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もはや、私は問題を修正しました。:-)
エリックアウトゴルファー

671まで。TIOリンクが長すぎるため、tinyurlを使用する必要がありました。mapそれらを通常のリストの理解のものに置き換えることができるので、私はあなたのものの多くを作り直しました。非常に多くmapのs をトリムできたため、K2バイトのコストがかかっていたため、変数も削除しました。
アーノルドパーマー

よくやった。あなたは賞金を獲得します。
オリバーNi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.