Yarı Saydam Kutular Çiz


15

Not: Dize sanatı, SE yazı tipi tuhaflığı nedeniyle burada korkunç görünebilir: P :(

Dikdörtgenlerin köşelerini temsil eden dört tüpün bir listesi verildiğinde, saydam dikdörtgenleri bu sırayla üst üste çizin.

Bu meydan okuma için, sol üst köşede en küçük koordinatın olması ve x ekseninin sağa, y ekseninin aşağı doğru artması gerekir.

Dört demet (x0, y0, x1, y1)veya (x0, x1, y0, y1)temsil eder (x, y), bir dikdörtgenin sol üst ve alt sağ köşesinin koordinatı çiftlerinin (dikdörtgenlerin iki biçimlerinden birini seçebilir fakat tutarlı olmalıdır)

"Yarı saydam dikdörtgen" ile ne demek istiyorum? Bu meydan okuma için, boşluk karakterini ve kutu çizim karakterlerinin çoğunu kullanacaksınız ; özellikle, "kalın" karakterler dahil olmak üzere dikdörtgen çizmek için kullanılanların tümü. Yarı saydam bir dikdörtgen çizildiğinde, önce işgal edilen alandaki tüm ince çizgiler kaybolur ve tüm kalın çizgiler incelir ve sonra dikdörtgenin kendisi kalın çizgilerle çizilir.

Örneğin, sol üstte ve sonra sağ altta bir dikdörtgen çizerseniz, şöyle bir şey olabilir:

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

Net olmak gerekirse, çizgiler kesinlikle dikdörtgen içindeki tüm çizgiler için aydınlatılır (kalın -> ince -> yok) (örneğin, alt kenardan değil, üst kenardan aşağıya bakan çizgiler etkilenir).

Test Durumları

Her test durumu için bir dizi girdi satırı ve ardından unicode-art verilecektir.

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

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

Daha fazla test örneği oluşturun!

kurallar

  • Giriş, dört gruptan oluşan bir liste için herhangi bir makul formatta olabilir. Giriş, bir endeksli ya da (örneğin, sol üst köşe herhangi biri olabilir, ya eksen boyunca sıfır endeksli olabilir (0, 0), (0, 1), (1, 0), (1, 1).
  • Çıktı açıklandığı gibi unicode-art olmalıdır. Çıktının önde gelen satırları olmayabilir ve en fazla bir son satırsonu olabilir (son satırdan sonra). Bu meydan okuma için sondaki boşluk göz ardı edilecektir.

Kod-noktalar

Kalın ve hafif yatay ve dikey borular aralıktadır [U+2500, U+2503]. Çeşitli köşe boruları aralıktadır [U+250C, U+251C). Üç kollu borular menzilde [U+251C, U+253C). Dört kollu borular ürün gamında [U+253C, U+254C). Programımda bulunabilecek kalan borular hiçbir zaman gerçekte kullanılmaz.


Bu gerçekten ascii sanatı mı? Boşlukların yanı sıra, herhangi bir ascii karakteri kullanmaz.
caird coinheringaahing

@cairdcoinheringaahing Ascii-art bilgisinden,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
totallyhuman


b / w 220 - 223 karakterini buradan kullanabilir miyiz? cesur çizgiler için dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

1
@MukulKumar Hayır, tam olarak bu karakterleri kullanmalısınız. Tüm karakter kümesinin herhangi bir permütasyonunun çoğaltılmamış alt dizelerini giriş olarak almanıza izin verilir, böylece karakterleri
kodlayan

Yanıtlar:


3

Python 3 , 289286 bayt

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

Çevrimiçi deneyin!

Girişi 4 tuples listesi olarak alır: (x0, y0, x1, y1)pipedrawing karakterleriyle birlikte aşağıdaki gibi:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

Sıfır genişlik veya yükseklikteki kutuları destekler (tüm kutu çizim karakterlerini kullanır).

Dayanarak cevabım için bu soruya ancak çizerken alter mevcut kutulara güncellenmiştir.

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

uGirdi olarak alabilirsiniz .
HyperNeutrino

@HyperNeutrino thanks :)
TFeld

Sen yerine geçerek gereksiz değişken oynadığı bir bayt kaydedebilirsiniz _,_,w,h=ile *_,w,h=.
Jonathan Frech

Ayrıca, grup atamanız için Qherhangi bir parantez gerekmez, iki kaydedilmiş bayt Q=(i<X,y<j,x<i,j<Y);ile değiştirilebilir Q=i<X,y<j,x<i,j<Y;.
Jonathan Frech


2

JavaScript (ES6), 298 261 bayt

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

Burada \ngerçek satırsonu karakterini temsil eder. Unicode dikdörtgenlere verdiğim cevaba dayanarak . Açıklama: Çizmek için bir dizi boşluk dizisi oluşturulur. Daha sonra her boşluk, girişteki tüm kutular üzerinde döngü yapılarak işlenir. Kutunun dışında kalan karakterler yok sayılır, ancak kenardaki veya içerideki karakterler daha fazla işlenir. Bir karakter (her biri 3'lük bir güçle temsil edilir) oluşturan dört çizgi parçasının her biri için üç olasılık vardır; a) Segment kutunun hemen dışında yer alır ve göz ardı edilmelidir (3'ün gücü yerine 0 parametresini geçirerek elde edilir) b) Segment kutunun kenarında bulunur ve kalın olmalıdır (h işlev ) c) Segment kutunun içinde yer alır ve aydınlatılmalıdır (gfonksiyonu). Karakter daha sonra Unicode dizgisine dizine eklenir. Tüm kutular işlendikten sonra dizi yeni satırlarda birleştirilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.