Ascii Kullanıcı Arayüzleri


18

Bu zorlukta Ascii kullanıcı arayüzlerini oluşturuyoruz.

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

Bu gibi her çizim , alt öğeler içerebilen bir öğeden yapılır . Olası öğeler aşağıda listelenmiştir:

  1. Metin öğesi. Bir veya daha fazla metin satırı içerir.
  2. Kutu öğesi. Kenarlıklarla çevrili bir alt öğe içerir. Kenarlıklar +köşelerde ve -s'de ve |kenarlarındadır.
  3. Yatay liste. Yatay olarak hizalanmış bir veya daha fazla öğe içerir.
  4. Dikey liste. Birbiri üzerine dikey olarak ve sola yatay olarak hizalanmış bir veya daha fazla eleman içerir.

Her eleman bir dikdörtgendir.

Her öğenin, içeriğine ek olarak, taban çizgisi adı verilen bir özelliği vardır . Taban çizgisi, öğeleri dikey olarak hizalamak için kullanılır: yatay bir listenin her öğesi, taban çizgileri aynı satırda olacak şekilde hizalanır. Aşağıdaki örnekte taban çizgisi karakterler içerir aeg. Üç kutu elemanlarının taban (0-endeksli) vardır 1, 3ve 2.

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

Taban çizgileri aşağıdaki kurallarla belirlenir:

  1. Metin öğeleri için metnin ilk satırı taban çizgisidir, yani. 0.
  2. Kutu elemanları için taban çizgisi 1 + alt öğenin taban çizgisidir.
  3. Yatay listeler için taban çizgisi, listedeki maksimum taban çizgisidir ( 3yukarıdaki örnekte).
  4. Dikey listeler için taban çizgisi, girişte belirtilmesi gereken bir öğenin taban çizgisidir.

Giriş

Girdi, bazı formattaki bir arayüzün bir özelliğidir (örn. Listeler, json). Örnek girişler aşağıdaki biçime sahiptir:

  1. Bir dize öğesi bir dizedir: "..."
  2. Bir kutu öğesi, ilk öğenin "b":["b", subelement]
  3. Yatay liste ilk öğenin listesidir "h":["h", items...]
  4. Dikey liste, ilk öğenin bulunduğu listedir "v"ve ikinci öğe, taban çizgisinin kullanıldığı öğenin (0 dizinli) sayısıdır:["v", n, items...]

Çıktı

Çıktı, yukarıda belirttiğim kurallar kullanılarak hizalanmış öğeler içermelidir. Çıktı stdout, bir dize listesi veya anlamlı başka bir şey olabilir.

puanlama

Bu , her zamanki kurallar geçerlidir.

Test senaryoları

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
Tatlı İsa ... Yine her yerde jeositeler.
Sihirli Ahtapot Urn

Temelin nasıl çalıştığından emin değilim, daha fazla açıklayabilir misiniz?
Stan Strum

@StanStrum Taban çizgisi, yatay bir listedeki öğeleri dikey olarak hizalamak için kullanılır. Öğelerin taban çizgileri eşleşmelidir, yani. hepsi aynı fiziksel sıra olmalıdır. Örneğin, swcond örneğinde, ilk kutu, her ikisi de kutularının taban açizgisinde olduğu gibi e, aynı satırda olacak şekilde aşağı doğru hareket ettirilir . "Taban çizgisi" bunun için doğru kelime olup olmadığından emin değilim, sadece tipografi alanında benzer bir amaç için kullanıldığını biliyorum.
fergusq

@fergusq İlk fıkrada: "Metin öğeleri için metnin ilk satırı satır taban çizgisidir, yani 0.", diğer "satır taban çizgilerinin" metni yukarı kaydırdığı anlamına mı geliyor?
Stan Strum

@fergusq Baseline doğru kelime olmalı, CSS flexbox açıklamalarında da kullanılan IIRC
sadece ASCII-sadece

Yanıtlar:


10

Python 3 , 721 694 693 671 661 bayt

Düzenleme: @Arnold Palmer ve @Step Hen nedeniyle 27 bayt kaydedildi

Düzenleme: Kaydedilen 1 bayt

Düzenleme: @Arnold Palmer sayesinde 22 bayt kaydedildi

Düzenle: 10 bayt kaydedildi

Bu muhtemelen biraz golf olabilir

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]

Çevrimiçi deneyin


Ayrıca tüm tanımları ve P,L,M,R,K=[" "],len,max,range,mapprogramın en üstüne (üstteki değişkenler) ve dışına taşıyabilirsiniz F. Bunu yaparak en az 711 bayta düşebilirsiniz. (TIO bağlantısı gönderilemeyecek kadar büyük).
Arnold Palmer

@StepHen Artık değil, sorunu çözdüm. :-)
Outgolfer Erik

671'e kadar . TIO bağlantısı çok uzun olduğu için tinyurl kullanmak zorunda kaldı. mapNormal liste anlama öğeleri ile değiştirilebileceği için birçoğunuzu yeniden çalıştım . Bu kadar çok şeyi düzeltebildiğim için, 2 bayta mal olduğu mapiçin Kdeğişkeni de kaldırdım .
Arnold Palmer

Aferin. Ödül kazanırsın.
Oliver Ni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.