Нарисуйте полупрозрачные коробки


15

примечание: строковое искусство может выглядеть здесь ужасно из-за странности шрифта SE: ​​P :(

Учитывая список из четырех кортежей, представляющих углы прямоугольников, нарисуйте полупрозрачные прямоугольники друг над другом в этом порядке.

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

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

Что я имею в виду под «полупрозрачным прямоугольником»? Ну, для этой задачи вы будете использовать символ пробела и большинство символов рисования прямоугольников ; в частности, все те, которые используются для рисования прямоугольников, включая «жирные» символы. Когда рисуется полупрозрачный прямоугольник, сначала все тонкие линии в занимаемом пространстве исчезают, а все жирные линии становятся тонкими, а затем сам прямоугольник рисуется жирными линиями.

Например, если вы рисуете прямоугольник в верхнем левом углу, а затем в нижнем правом, он может выглядеть примерно так:

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

Для ясности, линии подсвечиваются (жирный -> тонкий -> нет) для всех линий строго внутри прямоугольника (например, линии, направленные вниз, затрагивают верхний край, но не нижний край).

Тестовые случаи

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

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 Coneheringaahing

@cairdcoinheringaahing Из информации ascii-art ,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
полностью человек


мы можем использовать символ ч / б 220 - 223 отсюда? для жирных линий dochome.programbl.com/dochome/sites/default/files/image169.png
Мукул Кумар

1
@MukulKumar Нет, вы должны использовать именно эти символы. Вам разрешено принимать любую недублированную подстроку любой перестановки всего набора символов в качестве входных данных, чтобы вам не приходилось тратить впустую байты / символы,
жестко кодирующие

Ответы:


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

Попробуйте онлайн!

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

Поддерживает поля нулевой ширины или высоты (использует все символы рисования блоков).

На основании моего ответа на этот вопрос , но изменен, чтобы изменить существующие поля при рисовании.

'Ungolfed':

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.