Намалюйте напівпрозорі коробки


15

Примітка: струнне мистецтво може виглядати жахливо через дивність шрифту SE: P :(

Давши список чотирьох кортезів, що представляють кути прямокутників, намалюйте напівпрозорі прямокутники один над одним у такому порядку.

Для цього завдання вам потрібно мати найменшу координату у верхньому лівому куті, а вісь x збільшується праворуч, а вісь y збільшується вниз.

Чотири-кортеж (x0, y0, x1, y1)або (x0, x1, y0, y1)являє собою (x, y)пари координат верхнього лівого та нижнього правого кутів прямокутника (ви можете обрати будь-який із двох форматів для прямокутників, але він повинен відповідати)

Що я маю на увазі під «напівпрозорим прямокутником»? Ну а для цього завдання ви будете використовувати пробіл та більшість символів, що малюють коробку ; конкретно, всі ті, які використовуються для малювання прямокутників, включаючи «жирні» символи. Коли намальовано напівпрозорий прямокутник, спочатку всі тонкі лінії в займаному просторі зникають, а всі жирні лінії стають тонкими, а потім сам прямокутник накреслюється жирними лініями.

Наприклад, якщо ви намалюєте прямокутник у верхньому лівому, а потім у правому нижньому куті, це може виглядати приблизно так:

┏━━━━┓
┃    ┃
┃    ┃
┃ ┏━━╇━━┓
┃ ┃  │  ┃
┗━╉──┘  ┃
  ┃     ┃
  ┃     ┃
  ┗━━━━━┛

Щоб було чітко, лінії світліші (жирний -> тонкий -> жоден) для всіх ліній строго в прямокутнику (наприклад, спрямовані вниз лінії спрямовані на верхній край, але не на нижній край).

Випробування

Для кожного тестового випадку буде надано деяку кількість рядків введення, а потім unicode-art.

0 0 5 5
5 5 10 10
3 3 7 7
2 2 8 8

┏━━━━┓     
┃    ┃     
┃ ┏━━╇━━┓  
┃ ┃┌─┴─┐┃  
┃ ┃│   │┃  
┗━╉┤   ├╊━┓
  ┃│   │┃ ┃
  ┃└─┬─┘┃ ┃
  ┗━━╈━━┛ ┃
     ┃    ┃
     ┗━━━━┛

14 5 15 9
13 2 15 16
6 4 15 11


             ┏━┓
             ┃ ┃
      ┏━━━━━━╇━┫
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┗━━━━━━╈━┫
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┗━┛

6 8 10 11
15 12 16 16
14 10 16 16
9 1 15 15

         ┏━━━━━┓ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
      ┏━━╉┐    ┃ 
      ┃  ┃│    ┃ 
      ┃  ┃│   ┌╊┓
      ┗━━╉┘   │┃┃
         ┃    │┠┨
         ┃    │┃┃
         ┃    │┃┃
         ┗━━━━╈┩┃
              ┗┷┛

Створіть більше тестових випадків!

Правила

  • Вхід може бути в будь-якому розумному форматі для списку чотирьох кортежів. Вхідні дані можуть бути один або нуль індексованих індексовані уздовж будь-якої осі (тобто верхнього лівого кута може бути будь-яким з (0, 0), (0, 1), (1, 0), (1, 1).
  • Вихід повинен бути таким же unicode-art, як описано. Вихідні дані можуть не мати провідних нових рядків і можуть мати максимум один кінцевий новий рядок (після останнього рядка). Третя пробільна зона буде ігнорована для цілей цього виклику.

Код-бали

Сміливі та легкі горизонтальні та вертикальні труби знаходяться в асортименті [U+2500, U+2503]. Різні кутові труби є в асортименті [U+250C, U+251C). Тримісні труби знаходяться в радіусі дії [U+251C, U+253C). Чотириразові труби знаходяться в радіусі дії [U+253C, U+254C). Решта труб, які можна знайти в моїй програмі, ніколи фактично не використовуються.


Це справді мистецтво ascii? Крім пробілів, він не використовує жодних символів ascii.
caird coinheringaahing

@cairdcoinheringaahing З інформації про мистецтво ascii ,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
totalhuman


чи можемо ми використати символ б / в 220 - 223 звідси? для жирних ліній dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

1
@MukulKumar Ні, ви повинні використовувати ці точні символи. Вам дозволяється брати будь-яку непростою підстрочку будь-якої перестановки всього набору символів як вхідну, щоб вам не довелося витрачати байти / символи жорсткого кодування символів.
HyperNeutrino

Відповіді:


3

Python 3 , 289 286 байт

l,u=eval(input())
*_,w,h=map(max,zip(*l))
r=[*map(list,[' '*-~w]*-~h)]
R=range
for x,y,X,Y in l:
 for i in R(x,X+1):
  for j in R(y,Y+1):Q=i<X,y<j,x<i,j<Y;r[j][i]=u[sum(3**o*max(Q[o]*[j in(y,Y),i in(x,X)][o%2]*2,u.index(r[j][i])//3**o%3-Q[o])for o in R(4))]
for l in r:print(''.join(l))

Спробуйте в Інтернеті!

(x0, y0, x1, y1)Вводиться як список із 4-х кортежів: разом із символами натягування:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

Підтримує коробки нульової ширини або висоти (використовує всі символи малювання коробки).

На основі моєї відповіді на це запитання , але змінено для зміни існуючих коробок під час малювання.

"Безголовки":

u=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

#Create array of spaces:
l=eval(input())
w,h=list(map(max,zip(*l)))[2:]
r=[[' ']*w for _ in' '*h]

for x,y,X,Y in l:
 n,m=X-1,Y-1
 for i in range(x,X):
  for j in range(y,Y):
   A,B=j in(y,m),i in(x,n)
   P=(i<n*A,y<j*B,x<i*A,j<m*B)   # Pipe sides of the new box
   Q=(i<n,y<j,x<i,j<m)           # Pipe sides that are inside the new box, and should be thinned.
   # Get new pipe (sides of new box, on top of thinned pipes of existing boxes. (u.index... is existing pipe))
   l=sum(3**o*max(P[o]*2,(u.index(r[j][i])//3**o%3)-Q[o])for o in range(4))
   #Add to 'canvas'
   r[j][i]=u[l]

print('\n'.join(''.join(l)for l in r))

Ви можете взяти uза вхід.
HyperNeutrino

@HyperNeutrino спасибі :)
TFeld

Ви можете зберегти байт, позначивши непотрібну змінну, замінивши _,_,w,h=на *_,w,h=.
Джонатан Фрех

Крім того, для вашого призначення кортежу Qне потрібні дужки, Q=(i<X,y<j,x<i,j<Y);його можна замінити Q=i<X,y<j,x<i,j<Y;на два збережені байти.
Джонатан Фрех

@JonathanFrech Спасибі :)
TFeld

2

JavaScript (ES6), 298 261 байт

(a,u,m=n=>[...Array(1+Math.max(...a.map(t=>t[n])))])=>m(3).map((_,j)=>m(2).map((_,i)=>u[a.reduce((c,[x,y,v,w])=>i<x|j<y|i>v|j>w?c:(g=n=>c-=c/n%3|0&&n,h=n=>c+=n*(2-(c/n%3|0)),[i>x&&9,i<v].map(j>y&j<w?g:h),[j>y&&3,j<w&&27].map(i>x&i<v?g:h),c),0)]).join``).join`\n`

Де \nпредставляє буквальний символ нового рядка. На основі моєї відповіді на прямокутники Unicode . Пояснення: для малювання створюється масив рядків пробілів. Потім кожен пробіл обробляється, перебираючи петлі на вхідних полях. Символи, які лежать поза рамкою, ігноруються, але ті, що знаходяться на краю або всередині, обробляються далі. Для кожного з чотирьох відрізків рядків, що складають символ (кожен представлений силою 3), є три можливості; а) сегмент лежить просто поза коробкою і його слід ігнорувати (досягається передачею параметра 0 замість потужності 3) б) сегмент лежить на краю вікна і повинен бути жирним (досягається викликом hфункції) в) сегмент лежить всередині коробки і повинен бути світлішим (досягається викликомgфункція). Потім символ індексується в рядок Unicode. Після того як всі поля оброблені, масив потім приєднується до нових рядків.

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