Vẽ hộp mờ


15

lưu ý: nghệ thuật chuỗi có thể trông khủng khiếp ở đây vì sự kỳ lạ của phông chữ SE: P :(

Đưa ra một danh sách gồm bốn tup đại diện cho các góc của hình chữ nhật, vẽ các hình chữ nhật mờ lên nhau theo thứ tự đó.

Đối với thử thách này, bạn được yêu cầu có tọa độ nhỏ nhất ở góc trên bên trái và trục x tăng dần sang phải và trục y tăng dần xuống dưới.

Một bộ bốn (x0, y0, x1, y1)hoặc (x0, x1, y0, y1)đại diện cho các (x, y)cặp tọa độ của góc trên cùng bên trái và dưới cùng bên phải của hình chữ nhật (bạn có thể chọn một trong hai định dạng cho hình chữ nhật nhưng nó phải nhất quán)

"Hình chữ nhật mờ" nghĩa là gì? Chà, đối với thử thách này, bạn sẽ sử dụng nhân vật không gian và hầu hết các nhân vật vẽ hộp ; cụ thể, tất cả những cái được sử dụng để vẽ hình chữ nhật, bao gồm các ký tự "in đậm". Khi một hình chữ nhật mờ được vẽ, đầu tiên tất cả các đường mỏng trong không gian bị chiếm sẽ biến mất và tất cả các đường in đậm trở nên mỏng, và sau đó chính hình chữ nhật được vẽ thành các đường in đậm.

Ví dụ: nếu bạn vẽ một hình chữ nhật ở phía trên bên trái và sau đó ở dưới cùng bên phải, nó có thể trông giống như thế này:

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

Để rõ ràng, các dòng được làm sáng (đậm -> mỏng -> không) cho tất cả các dòng trong hình chữ nhật (ví dụ, các đường hướng xuống dưới bị ảnh hưởng cho cạnh trên nhưng không phải cạnh dưới).

Các trường hợp thử nghiệm

Một số dòng đầu vào sẽ được cung cấp, theo sau là unicode-art, cho mỗi trường hợp thử nghiệm.

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

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

Tạo ra nhiều trường hợp thử nghiệm!

Quy tắc

  • Đầu vào có thể ở bất kỳ định dạng hợp lý nào cho danh sách bốn bộ dữ liệu. Đầu vào có thể được một chỉ mục hoặc không lập chỉ mục cùng một trong hai trục (tức là góc trên bên trái có thể là bất kỳ (0, 0), (0, 1), (1, 0), (1, 1).
  • Đầu ra phải là unicode-art như mô tả. Đầu ra có thể không có dòng mới hàng đầu và có thể có nhiều nhất một dòng mới (sau dòng cuối cùng). Khoảng trắng lưu trữ sẽ được bỏ qua cho các mục đích của thách thức này.

Mã điểm

Các ống ngang và dọc đậm và nhẹ nằm trong phạm vi [U+2500, U+2503]. Các ống góc khác nhau là trong phạm vi [U+250C, U+251C). Các ống ba vũ trang là trong phạm vi [U+251C, U+253C). Các ống bốn vũ trang là trong phạm vi [U+253C, U+254C). Các ống còn lại có thể được tìm thấy trong chương trình của tôi không bao giờ thực sự được sử dụng.


Đây thực sự là nghệ thuật ascii? Ngoài khoảng trắng, nó không sử dụng bất kỳ ký tự ascii nào.
caird coinheringaahing

@cairdcoinheringaahing Từ thông tin nghệ thuật ascii ,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
hoàn toàn là


chúng ta có thể sử dụng ký tự b / w 220 - 223 từ đây không? cho các dòng in đậm dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

1
@MukulKumar Không, bạn phải sử dụng những ký tự chính xác đó. Bạn được phép lấy bất kỳ chuỗi con không trùng lặp của bất kỳ hoán vị nào của toàn bộ bộ ký tự làm đầu vào để bạn không phải lãng phí byte / ký tự mã hóa các ký tự trong.
HyperNeutrino

Câu trả lời:


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

Hãy thử trực tuyến!

Đưa đầu vào thành một danh sách gồm 4 tuple: (x0, y0, x1, y1)cùng với các ký tự pipedrawing như sau:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

Hỗ trợ các hộp có chiều rộng hoặc chiều cao bằng không (sử dụng tất cả các ký tự vẽ hộp).

Dựa trên câu trả lời của tôi cho câu hỏi này , nhưng đã sửa đổi để thay đổi các hộp hiện có khi vẽ.

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

Bạn có thể lấy ulàm đầu vào.
HyperNeutrino

@HyperNeutrino cảm ơn :)
TFeld

Bạn có thể lưu một byte bằng cách gắn dấu sao cho biến không cần thiết của mình, thay thế _,_,w,h=bằng *_,w,h=.
Jonathan Frech

Ngoài ra, việc gán tuple của bạn Qkhông cần bất kỳ dấu ngoặc đơn nào, Q=(i<X,y<j,x<i,j<Y);có thể được thay thế bằng Q=i<X,y<j,x<i,j<Y;hai byte đã lưu.
Jonathan Frech


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`

Chức năng ở đâu ). Ký tự sau đó được lập chỉ mục thành chuỗi Unicode. Khi tất cả các hộp đã được xử lý, mảng sẽ được nối vào dòng mới.\n đại diện cho nhân vật dòng chữ mới. Dựa trên câu trả lời của tôi cho hình chữ nhật Unicode . Giải thích: Một chuỗi các chuỗi khoảng trắng được tạo để vẽ. Mỗi khoảng trống sau đó được xử lý bằng cách lặp qua tất cả các hộp trong đầu vào. Các ký tự nằm bên ngoài hộp sau đó được bỏ qua nhưng các ký tự ở cạnh hoặc bên trong được xử lý thêm. Đối với mỗi trong bốn phân đoạn tạo thành một ký tự (mỗi phân đoạn được biểu thị bằng lũy ​​thừa 3) thì có ba khả năng; a) đoạn nằm ngay bên ngoài hộp và nên được bỏ qua (đạt được bằng cách chuyển tham số bằng 0 thay vì lũy thừa 3) b) đoạn nằm ở rìa của hộp và phải được in đậm (đạt được bằng cách gọi hhàm) c) đoạn nằm trong hộp và cần được làm sáng (đạt được bằng cách gọig

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.