ASCII візуалізація


11

Завдання

Ваше завдання - написати програму, яка буде виводити коробки ASCII у місця, вказані вхідними даними.

Вхідні дані

Вам буде наданий список номерів. Формат тут трохи гнучкий, в тому , що ви можете використовувати будь-який deliminator ви хочете (наприклад 1,2,3,4, 1 2 3 4, [1,2,3,4]). Список складається з 4 груп і вказує xywhкожне поле. Ширина та висота кожного ящика становитимуть щонайменше 2. xі widthзнаходяться зліва направо. yі heightзнаходяться зверху вниз.

Вихідні дані

Відображення можна розглядати як праворуч ліворуч, спочатку намальоване поле праворуч, а кожне поле після цього - над ним. Доступні пробіли, а також один зворотний рядок.

Як обробляти коробки, що перекриваються

Поле з входу - це верхнє поле, і нічого не перекриє його. Кожен ящик після його надання відображається лише у просторі, який вже не міститься у вікні, і не замінить рамку вже винесеного вікна.

Стиль

Стиль коробки досить стандартний, з +куточками, -для горизонтальних ліній і |для вертикальних ліній.

Приклади:

( >>>позначає вхід)

>>>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
+-+-+
| | |
+-+-+

Чи не повинен бути цей середній, 4 0 13 5а не 0 4 13 5?
Ніл

У другому прямокутнику знизу в перших 2 випадках є х = 7 (відповідати прямокутникам х = 0)
рівень річки Св.

1
Дякую, що помітили, я рідко пишу відповіді на свої запитання, і тому все це вручну ...
J Atkin

@JAtkin Вибачте, це я пропустив.
Conor O'Brien

Це добре, я часто пропускаю речі і під час читання;)
J Atkin

Відповіді:


4

APL, 116 байт

{⎕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← (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
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

Пояснення:

  • ⎕IO←0: встановити початок індексу на 0.
  • Створіть матрицю потрібного розміру:
    • ⌈⌿↑⍵: знайдіть найбільші значення для x, y, w та h
    • +⌿2 2⍴: x + w і y + h
    • K←' '⍴⍨⌽: складіть матрицю пробілів x + w * y + h і збережіть її K.
  • Намалюйте коробки в ньому:
    • {... }¨⌽⍵: для кожного з скриньок у зворотному порядку,
      • x y W H←⍵-⌊.5×⍳4: Призначити координати на x, y, W, і H, і відняти 1 з обох Wі H. (координати виключні, діапазони масивів APL включно.)
      • K[Y←y+⍳H;X←x+⍳W]←' ': заповніть поточне поле пробілами
      • K[Y;A←x+0 W]←'|': намалюйте вертикальні сторони
      • K[B←y+0 H;X]←'-': намалюйте горизонтальні сторони
      • K[B;A]←'+': встановіть краї "+"
    • K⊣: згодом, повернення K.

1
APL - це така дивна на вигляд мова для сторонніх людей ...
J Atkin

3

ES6, 228 223 217 208 201 198 байт

Приймає масив масивів координат і повертає рядок.

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`

Де \nзображено символ нового рядка.

Редагувати: Збережено 5 байт, змінивши мої умови. Збережено ще 6 байт шляхом переключення з масиву масивів char на масив рядків. Збережено ще 9 байт шляхом введення тимчасової змінної. Збережено ще 7 байт, ввівши допоміжну функцію. Збережено ще 3 байти, скасувавши попереднє збереження!


3

Рубі, 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 в тестовій програмі

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

3

SmileBASIC, 128 125 байт

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

Скріншоти (обрізані)

скріншот скріншот скріншот скріншот скріншот

Пояснення

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

Mзберігає, чи знаходиться він у першому / останньому рядку поля ( 0= +--+, 1= | |). На першому проході через цикл Mдорівнює 0, а на всіх інших до останнього - 1.


Це дуже приємно :)
J Atkin


1

Pyth, 162 145 байт

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

Ви можете спробувати тут

Вихід тестового набору:

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

++
++

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

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

Жахливе рішення! Тільки чекаю, коли хтось битиме


2
У вашому першому прикладі додається додаткове значення +, де поля мають спільний край.
Лінус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.