วาดกล่องโปร่งแสง


15

หมายเหตุ: สตริงศิลปะอาจดูน่ากลัวที่นี่เพราะความแปลกประหลาดของตัวอักษร SE: P :(

ให้รายการของสิ่งอันดับสี่ที่แสดงมุมของรูปสี่เหลี่ยมวาดรูปสี่เหลี่ยมผืนผ้าโปร่งแสงทับกันในลำดับนั้น

สำหรับความท้าทายนี้คุณจะต้องมีพิกัดที่เล็กที่สุดที่มุมบนซ้ายและแกน x เพิ่มขึ้นไปทางขวาและแกน y เพิ่มขึ้นลง

สี่ tuple (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

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

สร้างกรณีทดสอบเพิ่มเติม!

กฎระเบียบ

  • อินพุตสามารถอยู่ในรูปแบบที่สมเหตุสมผลสำหรับรายการสี่ tuples การป้อนข้อมูลสามารถเป็นหนึ่งจัดทำดัชนีหรือศูนย์การจัดทำดัชนีตามแนวแกนทั้ง (เช่นมุมบนด้านซ้ายสามารถใด ๆ(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 ใด ๆ
caird coinheringaahing

@cairdcoinheringaahing จากข้อมูลascii-art ,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
เต็มเปามนุษย์


เราสามารถใช้ตัวอักษร b / w 220 - 223 จากที่นี่ได้ไหม? สำหรับเส้นหนาdochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

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

ลองออนไลน์!

รับอินพุตเป็นรายการของ tuples 4: (x0, y0, x1, y1)พร้อมกับตัวอักขระ pipedrawing ดังนี้:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

รองรับกล่องที่มีความกว้างหรือความสูงเป็นศูนย์ (ใช้ตัวอักษรวาดกล่องทั้งหมด)

ขึ้นอยู่กับคำตอบของฉันไปที่คำถามนี้แต่การปรับเปลี่ยนเพื่อเปลี่ยนกล่องที่มีอยู่เมื่อวาด

'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=
Jonathan Frech

นอกจากนี้การกำหนดค่า tuple ของคุณQไม่จำเป็นต้องใช้วงเล็บใด ๆQ=(i<X,y<j,x<i,j<Y);สามารถแทนที่ด้วยQ=i<X,y<j,x<i,j<Y;สองไบต์ที่บันทึกไว้
Jonathan Frech


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) มีความเป็นไปได้สามอย่าง a) เซ็กเมนต์อยู่นอกกรอบและควรละเว้น (ทำได้โดยผ่านพารามิเตอร์ 0 แทนกำลัง 3) b) เซ็กเมนต์อยู่ที่ขอบของกล่องและควรเป็นตัวหนา (ทำได้โดยการเรียกhฟังก์ชัน) c) ส่วนที่อยู่ในกล่องและควรจะเบาลงgฟังก์ชั่น) อักขระจะถูกทำดัชนีในสตริง Unicode เมื่อประมวลผลกล่องทั้งหมดแล้วอาร์เรย์จะถูกรวมเข้ากับ newlines

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.