Gambar Kotak Tembus

15

note: string art mungkin terlihat mengerikan di sini karena keanehan font SE: P :(

Diberikan daftar empat tupel yang mewakili sudut-sudut persegi panjang, gambarkan persegi panjang transparan satu sama lain dalam urutan itu.

Untuk tantangan ini, Anda harus memiliki koordinat terkecil di sudut kiri atas dan sumbu x meningkat ke kanan dan sumbu y meningkat ke bawah.

Tupel empat (x0, y0, x1, y1)atau (x0, x1, y0, y1)mewakili (x, y)pasangan koordinat sudut kiri atas dan kanan bawah dari sebuah persegi panjang (Anda dapat memilih salah satu dari dua format untuk persegi panjang tetapi harus konsisten)

Apa yang saya maksud dengan "persegi panjang transparan"? Nah, untuk tantangan ini, Anda akan menggunakan karakter spasi dan sebagian besar karakter menggambar kotak ; khususnya, semua yang digunakan untuk menggambar persegi panjang, termasuk karakter "tebal". Ketika sebuah persegi panjang transparan digambar, pertama semua garis tipis di ruang yang ditempati menghilang dan semua garis tebal menjadi tipis, dan kemudian persegi panjang itu sendiri ditarik ke atas dalam garis tebal.

Misalnya, jika Anda menggambar persegi panjang di kiri atas dan kemudian di kanan bawah, itu mungkin terlihat seperti ini:

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

Untuk menjadi jelas, garis-garis menjadi terang (tebal -> tipis -> tidak ada) untuk semua garis secara ketat di dalam persegi panjang (misalnya, garis yang menghadap ke bawah dipengaruhi untuk tepi atas tetapi bukan tepi bawah).

Uji Kasus

Beberapa baris input akan diberikan, diikuti oleh unicode-art, untuk setiap test case.

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

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

Hasilkan lebih banyak kasus uji!

Aturan

  • Input dapat dalam format apa pun yang masuk akal untuk daftar empat-tupel. Input dapat menjadi salah satu-diindeks atau nol-diindeks bersama baik sumbu (yaitu sudut kiri atas dapat salah satu dari (0, 0), (0, 1), (1, 0), (1, 1).
  • Output harus berupa unicode-art seperti yang dijelaskan. Output mungkin tidak memiliki baris baru dan dapat memiliki paling banyak satu baris setelah baris (setelah baris terakhir). Trailing whitespace akan diabaikan untuk tujuan tantangan ini.

Poin kode

Pipa horizontal dan vertikal yang tebal dan terang berada dalam jangkauan [U+2500, U+2503]. Berbagai pipa sudut berada dalam jangkauan [U+250C, U+251C). Pipa tiga-bersenjata berada dalam jangkauan [U+251C, U+253C). Pipa empat-bersenjata berada di kisaran [U+253C, U+254C). Pipa yang tersisa yang dapat ditemukan dalam program saya tidak pernah benar-benar digunakan.

HyperNeutrino
sumber
Apakah ini benar-benar seni ascii? Selain spasi, tidak menggunakan karakter ascii.
caird coinheringaahing
@cairdcoinheringaahing Dari info ascii-art ,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
totallyhuman
1
@cairdcoinheringaahing codegolf.meta.stackexchange.com/questions/10218/…
HyperNeutrino
dapatkah kita menggunakan karakter b / w 220 - 223 dari sini? untuk garis tebal dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar
1
@MukulKumar Tidak, Anda harus menggunakan karakter yang tepat. Anda diizinkan untuk mengambil substring yang tidak digandakan dari permutasi seluruh rangkaian karakter sebagai input sehingga Anda tidak perlu membuang byte / karakter hardcoding karakter masuk.
HyperNeutrino

Jawaban:

3

Python 3 , 289 286 byte

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

Cobalah online!

Mengambil input sebagai daftar 4-tupel (x0, y0, x1, y1):, bersama dengan karakter pipedrawing sebagai berikut:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

Mendukung kotak dengan lebar atau tinggi nol (menggunakan semua karakter kotak gambar).

Berdasarkan jawaban saya untuk pertanyaan ini , tetapi dimodifikasi untuk mengubah kotak yang ada saat menggambar.

'Tidak Disatukan':

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
sumber
Anda dapat mengambil usebagai input.
HyperNeutrino
@HyperNeutrino terima kasih :)
TFeld
Anda dapat menyimpan byte dengan membintangi variabel yang tidak perlu Anda, mengganti _,_,w,h=dengan *_,w,h=.
Jonathan Frech
Selain itu, tugas tuple Anda untuk Qtidak memerlukan tanda kurung, Q=(i<X,y<j,x<i,j<Y);dapat diganti dengan Q=i<X,y<j,x<i,j<Y;untuk dua byte yang disimpan.
Jonathan Frech
@JonathanFrech Terima kasih :)
TFeld
2

JavaScript (ES6), 298 261 byte

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

Dimana \nmewakili karakter baris baru literal. Berdasarkan jawaban saya untuk persegi panjang Unicode . Penjelasan: Array string spasi dibuat untuk menggambar. Setiap spasi kemudian diproses dengan mengulang semua kotak di input. Karakter yang terletak di luar kotak kemudian diabaikan tetapi yang di tepi atau di dalam diproses lebih lanjut. Untuk masing-masing dari empat segmen garis yang membentuk karakter (masing-masing diwakili oleh kekuatan 3) maka ada tiga kemungkinan; a) segmen terletak tepat di luar kotak dan harus diabaikan (dicapai dengan melewati parameter 0 bukannya kekuatan 3) b) segmen terletak di tepi kotak dan harus tebal (dicapai dengan memanggil hfungsi) c) segmen terletak di dalam kotak dan harus diringankan (dicapai dengan memanggilgfungsi). Karakter kemudian diindeks ke dalam string Unicode. Setelah semua kotak diproses, array kemudian bergabung di baris baru.

Neil
sumber