Rysuj przezroczyste pudełka

15

Uwaga: grafika sznurkowa może tutaj wyglądać okropnie z powodu dziwnej czcionki SE: P :(

Biorąc pod uwagę listę czterech krotek reprezentujących rogi prostokątów, narysuj półprzezroczyste prostokąty nad sobą w tej kolejności.

W przypadku tego wyzwania wymagana jest najmniejsza współrzędna w lewym górnym rogu, oś x rośnie w prawo, a oś y - w dół.

Czterokrotny (x0, y0, x1, y1)lub (x0, x1, y0, y1)reprezentuje (x, y)pary współrzędnych lewego górnego i prawego dolnego rogu prostokąta (możesz wybrać jeden z dwóch formatów prostokątów, ale musi być spójny)

Co rozumiem przez „przezroczysty prostokąt”? Do tego wyzwania użyjesz spacji i większości postaci rysujących pudełka ; w szczególności wszystkie te używane do rysowania prostokątów, w tym „pogrubione” znaki. Kiedy rysowany jest półprzezroczysty prostokąt, najpierw wszystkie cienkie linie w zajmowanej przestrzeni znikają, a wszystkie pogrubione linie stają się cienkie, a następnie sam prostokąt jest rysowany pogrubionymi liniami.

Na przykład, jeśli narysujesz prostokąt w lewym górnym rogu, a następnie w prawym dolnym rogu, może on wyglądać mniej więcej tak:

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

Aby być jasnym, linie są rozjaśniane (pogrubione -> cienkie -> brak) dla wszystkich linii ściśle w obrębie prostokąta (na przykład wpływają na linie skierowane w dół na górną krawędź, ale nie dolną krawędź).

Przypadki testowe

Dla każdego przypadku testowego zostanie podana pewna liczba wierszy danych wejściowych, a następnie grafika Unicode.

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

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

Wygeneruj więcej przypadków testowych!

Zasady

  • Dane wejściowe mogą być w dowolnym rozsądnym formacie dla listy czterech krotek. Wejście może być jeden lub zero-indeksowane indeksowane wzdłuż obu osi (czyli lewy górny narożnik może być dowolny (0, 0), (0, 1), (1, 0), (1, 1).
  • Dane wyjściowe muszą być tak unikatowe, jak opisano. Wyjście może nie mieć wiodących nowych linii i może mieć najwyżej jedną końcową nową linię (po ostatniej linii). Końcowe białe znaki zostaną zignorowane na potrzeby tego wyzwania.

Punkty kodowe

Odważne i lekkie rury poziome i pionowe znajdują się w zakresie [U+2500, U+2503]. Różne rury narożne są w zakresie [U+250C, U+251C). Trójramienne rury są w zasięgu [U+251C, U+253C). Czteroramienne rury są w zasięgu [U+253C, U+254C). Pozostałe potoki, które można znaleźć w moim programie, nigdy nie są używane.

HyperNeutrino
źródło
Czy to naprawdę sztuka ascii? Oprócz spacji nie używa żadnych znaków ascii.
caird coinheringaahing
@cairdcoinheringaahing Z informacji ascii-art ,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
totalhuman
1
@cairdcoinheringaahing codegolf.meta.stackexchange.com/questions/10218/…
HyperNeutrino
czy możemy stąd użyć znaku b / w 220 - 223? dla odważnych linii dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar
1
@MukulKumar Nie, musisz używać dokładnie tych znaków. Dozwolone jest przyjmowanie dowolnego nieuplikowanego podciągu dowolnej permutacji całego zestawu znaków jako danych wejściowych, więc nie musisz marnować bajtów / znaków na kodowanie znaków.
HyperNeutrino 14.09.17

Odpowiedzi:

3

Python 3 , 289 286 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę 4-krotek: (x0, y0, x1, y1)wraz z następującymi znakami:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

Obsługuje pola o zerowej szerokości lub wysokości (wykorzystuje wszystkie znaki rysowania pól).

Na podstawie mojej odpowiedzi na to pytanie , ale zmodyfikowany w celu zmiany istniejących pól podczas rysowania.

„Niegolfowany”:

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))
TFeld
źródło
Możesz wziąć ujako dane wejściowe.
HyperNeutrino,
@HyperNeutrino dzięki :)
TFeld
Możesz zapisać bajt, oznaczając gwiazdką niepotrzebną zmienną, zastępując _,_,w,h=*_,w,h=.
Jonathan Frech
Ponadto przypisanie krotki do Qnie wymaga nawiasów, Q=(i<X,y<j,x<i,j<Y);można je zastąpić Q=i<X,y<j,x<i,j<Y;dwoma zapisanymi bajtami.
Jonathan Frech
@JonathanFrech Thanks :)
TFeld
2

JavaScript (ES6), 298 261 bajtów

(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`

Gdzie \nreprezentuje dosłowny znak nowej linii. Na podstawie mojej odpowiedzi na prostokąty Unicode . Objaśnienie: Tablica ciągów spacji jest tworzona do rysowania. Każda spacja jest następnie przetwarzana przez zapętlenie wszystkich pól na wejściu. Znaki leżące poza polem są następnie ignorowane, ale te na krawędzi lub wewnątrz są przetwarzane dalej. Dla każdego z czterech segmentów linii tworzących znak (każdy reprezentowany przez potęgę 3) istnieją trzy możliwości; a) segment leży tuż poza ramką i powinien zostać zignorowany (osiągnięty przez przekazanie parametru 0 zamiast potęgi 3) b) segment leży na krawędzi skrzynki i powinien być pogrubiony (osiągnięty przez wywołanie hfunkcji) c) segment leży wewnątrz pudełka i powinien być oświetlony (osiąga się to przez wywołaniegfunkcjonować). Znak jest następnie indeksowany do ciągu Unicode. Po przetworzeniu wszystkich pól tablica jest następnie łączona na nowych liniach.

Neil
źródło