ASCII-Box-Rendering

11

Aufgabe

Ihre Aufgabe ist es, ein Programm zu schreiben, das ASCII-Boxen an den durch die Eingabe angegebenen Stellen ausgibt.

Eingang

Sie erhalten eine Liste mit Zahlen. Das Format ist hier ein wenig flexibel, dass Sie jeden deliminator verwenden , können Sie wollen (zB 1,2,3,4, 1 2 3 4, [1,2,3,4]). Die Liste ist in 4er-Gruppen und gibt die xywheinzelnen Felder an. Die Breite und Höhe jeder Box beträgt mindestens 2. xund widthist von links nach rechts. yund heightsind von oben nach unten.

Ausgabe

Das Rendern kann als von rechts nach links betrachtet werden, wobei das Feld rechts zuerst gezeichnet wird und jedes Feld danach darüber ist. Nachgestellte Leerzeichen sowie eine nachfolgende Newline sind zulässig.

Umgang mit überlappenden Feldern

Das Feld links neben der Eingabe ist das oberste Feld, und nichts wird es überlappen. Jede Box danach wird nur in dem Bereich gerendert, der noch nicht in einer Box enthalten ist, und ersetzt nicht den Rand einer bereits gerenderten Box.

Stil

Der Stil der Kästchen ist ziemlich normal und +wird für Ecken, -für horizontale Linien und |für vertikale Linien verwendet.

Beispiele:

( >>>bezeichnet Eingabe)

>>>0 0 11 4 7 2 8 4 3 5 8 3
+---------+
|         |
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 3 11 4 7 5 8 4 3 8 8 3 4 0 13 5
    +-----------+
    |           |
    |           |
+---------+     |
|         |-----+
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 0 2 2
++
++


>>>2 2 5 3 1 1 7 5 0 0 9 7
+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

>>>0 0 3 3 2 0 3 3
+-+-+
| | |
+-+-+
J Atkin
quelle
Sollte das nicht eher das mittlere sein 4 0 13 5als 0 4 13 5?
Neil
2. Rechteck von unten in den ersten 2 Fällen hat x = 7 (um mit den x = 0 Rechtecken übereinzustimmen)
Level River St
1
Vielen Dank für das Bemerken, ich schreibe selten Antworten auf meine Fragen, und so ist alles von Hand ...
J Atkin
@JAtkin Es tut mir leid, das habe ich verpasst.
Conor O'Brien
Es ist in Ordnung, ich vermisse auch häufig Dinge beim Lesen;)
J Atkin

Antworten:

4

APL, 116 Bytes

{⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵}

Dies ist eine Funktion, die ein Array von Arrays verwendet und eine Zeichenmatrix zurückgibt.

Tests:

      t1← (0 0 11 4)(8 2 8 4)(3 5 8 3)
      t2← (0 3 11 4)(8 5 8 4)(3 8 8 3)(4 0 13 5)
      t3← (⊂0 0 2 2)
      t4← (2 2 5 3)(1 1 7 5)(0 0 9 7)
      {⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵} ¨ t1 t2 t3 t4
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

Erläuterung:

  • ⎕IO←0: Setzen Sie den Indexursprung auf 0.
  • Erstellen Sie eine Matrix mit der richtigen Größe:
    • ⌈⌿↑⍵: Finden Sie die größten Werte für x, y, w und h
    • +⌿2 2⍴: x + w und y + h
    • K←' '⍴⍨⌽: Erstellen Sie eine Matrix aus x + w * y + h Leerzeichen und speichern Sie sie in K.
  • Zeichnen Sie die Kisten hinein:
    • {... }¨⌽⍵: für jede der Boxen in umgekehrter Reihenfolge,
      • x y W H←⍵-⌊.5×⍳4: Die Koordinaten zuzuordnen x, y, W, und H, und subtrahieren 1 von beiden Wund H. (Koordinaten sind exklusiv, APL-Array-Bereiche sind inklusive.)
      • K[Y←y+⍳H;X←x+⍳W]←' ': Füllen Sie das aktuelle Feld mit Leerzeichen
      • K[Y;A←x+0 W]←'|': Zeichnen Sie die vertikalen Seiten
      • K[B←y+0 H;X]←'-': Zeichnen Sie die horizontalen Seiten
      • K[B;A]←'+': setze die Kanten auf '+'
    • K⊣: danach zurück K.
Marinus
quelle
1
APL ist so eine seltsam aussehende Sprache für einen Außenstehenden ...
J Atkin
3

ES6, 228 223 217 208 201 198 Bytes

Akzeptiert ein Array von Koordinatenarrays und gibt eine Zeichenfolge zurück.

a=>a.reverse().map(([x,y,w,h])=>[...Array(y+h)].map((_,i)=>(s=r[i]||'',r[i]=i<y?s:(s+' '.repeat(x)).slice(0,x)+(c=>c[0]+c[1].repeat(w-2)+c[0])(y-i&&y+h-1-i?'| ':'+-')+s.slice(x+w))),r=[])&&r.join`\n`

Wobei \nein Zeilenumbruchzeichen steht.

Bearbeiten: 5 Bytes durch Umkehren meiner Bedingungen gespeichert. Weitere 6 Bytes wurden gespeichert, indem von einem Array von Zeichenarrays zu einem Array von Zeichenfolgen gewechselt wurde. Weitere 9 Bytes wurden durch Einfügen einer temporären Variablen gespeichert. Weitere 7 Bytes wurden durch Einführung einer Hilfsfunktion gespeichert. Weitere 3 Bytes wurden gespeichert, indem eine vorherige Speicherung rückgängig gemacht wurde!

Neil
quelle
3

Ruby, 153 143

->n{a=(0..m=3*n.max).map{$b=' '*m}
(*n,x,y,w,h=n 
v=w-2
h.times{|i|a[y+i][x,w]=i%~-h<1??++?-*v+?+:?|+' '*v+?|}
)while n[0]
a.delete($b);puts a}

Ungolfed im Testprogramm

f=->n{                                #worst case width when x=w=large number, is max input*2+1
  a=(1..m=3*n.max).map{$b=' '*m}      #find m=max value in input, make an a array of 3*m strings of 3*m spaces 
  (
    *n,x,y,w,h=n                      #extract x,y,w,h from the end of n, save the rest back to n     
    v=w-2                             #internal space in rectangle is w-2  
    h.times{|i|                       #for each row
      a[y+i][x,w]=                    #substitute the relevant characters of the relevant lines of a 
      i%~-h<1?                        #i%~-h = i%(h-1). This is zero (<1) for first and last lines of the rectangle
      ?+ + ?-*v + ?+ :?| + ' '*v +?|  # +--...--+ or |  ...  | as required
    }
  )while n[0]                         #loop until data exhausted (n[0] becomes falsy as it does not exist)
a.delete($b);puts a}                  #delete blank rows ($b is a global variable) and display
Level River St.
quelle
3

SmileBASIC, 128 125 Bytes

DEF B A
WHILE LEN(A)H=POP(A)W=POP(A)-2Y=POP(A)X=POP(A)FOR I=0TO H-1LOCATE X,Y+I?"+|"[M];"- "[M]*W;"+|"[M]M=I<H-2NEXT
WEND
END

Screenshots (beschnitten)

Bildschirmfoto Bildschirmfoto Bildschirmfoto Bildschirmfoto Bildschirmfoto

Erläuterung

DEF B A 'make a function and add 12 bytes :(
 WHILE LEN(A) 'repeat until array is empty
  H=POP(A):W=POP(A)-2 'get width/height
  Y=POP(A):X=POP(A) 'get x/y
  FOR I=0 TO H-1 'draw one row at a time
   LOCATE X,Y+I 'position the cursor
   PRINT "+|"[M]; 'draw left edge
   PRINT "- "[M]*W; 'draw middle
   PRINT "+|"[M] 'draw right edge
   M=I<H-2
  NEXT
 WEND
END

Mspeichert, ob es sich in der ersten / letzten Zeile der Box befindet ( 0= +--+, 1= | |). Beim ersten Durchgang durch die Schleife Mist 0 und bei allen anderen bis zum letzten ist es 1.

12Me21
quelle
Das ist ziemlich schön :)
J Atkin
1

Pyth, 162 145 Bytes

J\+K*h.MZm+@d1@d3Q]*h.MZm+@d0@d2QdD:GHb XKHX@KHGb;V_QDlTR@NTVl3Vl2:+l0b+l1H?|qHtl3qH0\-?|qbtl2qb0\|d)):l0l1J:+l0tl2l1J:l0+l1tl3J:+l0tl2+l1tl3J;jK

Sie können es hier versuchen

Ausgabe der Testsuite:

+---------+     
|         |     
|         |----+
+---------+    |
        |      |
   +----+-+----+
   |      |     
   +------+     

++
++

+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

+-+-+
| | |
+-+-+

Schreckliche Lösung! Ich warte nur darauf, dass jemand es schlägt

Tenchi2xh
quelle
2
In Ihrem ersten Beispiel wird ein zusätzliches + eingefügt, bei dem die Felder eine Kante gemeinsam haben.
Linus