ASCII बॉक्स प्रतिपादन


11

कार्य

आपका कार्य एक प्रोग्राम लिखना है जो इनपुट द्वारा निर्दिष्ट स्थानों पर ASCII बक्से का उत्पादन करेगा।

इनपुट

आपको संख्याओं की एक सूची दी जाएगी। प्रारूप यहाँ आप किसी भी deliminator आप चाहते हैं का उपयोग कर सकते है कि में थोड़ा लचीला है, (उदाहरण के लिए 1,2,3,4, 1 2 3 4, [1,2,3,4])। सूची 4 के समूहों में है और xywhप्रत्येक बॉक्स को निर्दिष्ट करती है। प्रत्येक बॉक्स की चौड़ाई और ऊंचाई कम से कम 2. होगी xऔर widthबाएं से दाएं होगी। yऔर heightऊपर से नीचे हैं।

उत्पादन

रेंडरिंग को बाएं से दाएं के रूप में सोचा जा सकता है, पहले दायीं ओर के बॉक्स के साथ, और उसके बाद हर बॉक्स पर। अनुगामी रिक्त स्थान की अनुमति है, साथ ही एक अनुगामी न्यूलाइन।

अतिव्यापी बक्से को कैसे संभालना है

इनपुट के बाईं ओर स्थित बॉक्स शीर्ष बॉक्स है, और कुछ भी इसे ओवरलैप नहीं करेगा। प्रत्येक बॉक्स के बाद इसे केवल उस स्थान में प्रदान किया जाता है जो पहले से ही एक बॉक्स में समाहित नहीं है और पहले से ही प्रस्तुत बॉक्स की सीमा को प्रतिस्थापित नहीं करेगा।

अंदाज

बक्से की शैली काफी मानक होती है, जिसका +उपयोग कोनों के -लिए किया जाता है, क्षैतिज रेखाओं के |लिए उपयोग किया जाता है , और ऊर्ध्वाधर लाइनों के लिए उपयोग किया जाता है।

उदाहरण:

( >>>इनपुट को दर्शाता है)

>>>0 0 11 4 7 2 8 4 3 5 8 3
+---------+
|         |
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 3 11 4 7 5 8 4 3 8 8 3 4 0 13 5
    +-----------+
    |           |
    |           |
+---------+     |
|         |-----+
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 0 2 2
++
++


>>>2 2 5 3 1 1 7 5 0 0 9 7
+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

>>>0 0 3 3 2 0 3 3
+-+-+
| | |
+-+-+

उस एक के 4 0 13 5बजाय बीच में नहीं होना चाहिए 0 4 13 5?
नील २

पहले 2 मामलों में नीचे से दूसरी आयत में x = 7 (x = 0 आयतों के अनुरूप होने के लिए) है
स्तर नदी St

1
ध्यान देने के लिए धन्यवाद, मैं शायद ही कभी अपने सवालों के जवाब लिखता हूं, और इसलिए यह सब हाथ से है ...
जे एटकिन

@JAtkin मुझे खेद है, मैं चूक गया।
कॉनर ओ'ब्रायन

यह ठीक है, मैं अक्सर पढ़ते समय सामान याद करता हूं;)
जे एटकिन

जवाबों:


4

एपीएल, 116 बाइट्स

{⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵}

यह एक ऐसा फंक्शन है जो एरे की एक सरणी लेता है और एक कैरेक्टर मैट्रिक्स लौटाता है।

टेस्ट:

      t1← (0 0 11 4)(8 2 8 4)(3 5 8 3)
      t2← (0 3 11 4)(8 5 8 4)(3 8 8 3)(4 0 13 5)
      t3← (⊂0 0 2 2)
      t4← (2 2 5 3)(1 1 7 5)(0 0 9 7)
      {⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵} ¨ t1 t2 t3 t4
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

स्पष्टीकरण:

  • ⎕IO←0: इंडेक्स उत्पत्ति को सेट करें 0
  • सही आकार का एक मैट्रिक्स बनाएं:
    • ⌈⌿↑⍵: x, y, w और h के लिए सबसे बड़ा मान ज्ञात करें
    • +⌿2 2⍴: x + w और y + h
    • K←' '⍴⍨⌽: x + w * y + h स्पेस का एक मैट्रिक्स बनाएं और इसे स्टोर करें K
  • इसमें बक्से ड्रा करें:
    • {... }¨⌽⍵: प्रत्येक बॉक्स के लिए, रिवर्स ऑर्डर में,
      • x y W H←⍵-⌊.5×⍳4: करने के लिए निर्देशांक नियत x, y, W, और H, और दोनों से 1 घटाना Wऔर H। (निर्देशांक अनन्य हैं, एपीएल सरणी श्रेणियां समावेशी हैं।)
      • K[Y←y+⍳H;X←x+⍳W]←' ': रिक्त स्थान के साथ वर्तमान बॉक्स भरें
      • K[Y;A←x+0 W]←'|': ऊर्ध्वाधर पक्षों को ड्रा करें
      • K[B←y+0 H;X]←'-': क्षैतिज पक्षों को ड्रा करें
      • K[B;A]←'+': किनारों को '+' पर सेट करें
    • K⊣: बाद में, वापस K

1
एपीएल एक बाहरी व्यक्ति के लिए एक ऐसी अजीब भाषा है ...
जे Atkin

3

ईएस 6, 228 223 217 208 201 198 बाइट्स

निर्देशांक के सरणियों की एक सरणी को स्वीकार करता है और एक स्ट्रिंग लौटाता है।

a=>a.reverse().map(([x,y,w,h])=>[...Array(y+h)].map((_,i)=>(s=r[i]||'',r[i]=i<y?s:(s+' '.repeat(x)).slice(0,x)+(c=>c[0]+c[1].repeat(w-2)+c[0])(y-i&&y+h-1-i?'| ':'+-')+s.slice(x+w))),r=[])&&r.join`\n`

जहां \nएक नई लाइन चरित्र का प्रतिनिधित्व करती है।

संपादित करें: मेरी स्थितियों को उलट कर 5 बाइट्स सहेजे गए। तार सरणियों के एक सरणी से एक सरणी में स्विच करके आगे के 6 बाइट्स को बचाया। एक अस्थायी चर पेश करके एक और 9 बाइट्स को बचाया। एक सहायक समारोह की शुरुआत करके एक और 7 बाइट्स को बचाया। पिछली बचत को पूर्ववत करके एक और 3 बाइट्स सहेजे!


3

रूबी, 153 143

->n{a=(0..m=3*n.max).map{$b=' '*m}
(*n,x,y,w,h=n 
v=w-2
h.times{|i|a[y+i][x,w]=i%~-h<1??++?-*v+?+:?|+' '*v+?|}
)while n[0]
a.delete($b);puts a}

परीक्षण कार्यक्रम में अपराजित

f=->n{                                #worst case width when x=w=large number, is max input*2+1
  a=(1..m=3*n.max).map{$b=' '*m}      #find m=max value in input, make an a array of 3*m strings of 3*m spaces 
  (
    *n,x,y,w,h=n                      #extract x,y,w,h from the end of n, save the rest back to n     
    v=w-2                             #internal space in rectangle is w-2  
    h.times{|i|                       #for each row
      a[y+i][x,w]=                    #substitute the relevant characters of the relevant lines of a 
      i%~-h<1?                        #i%~-h = i%(h-1). This is zero (<1) for first and last lines of the rectangle
      ?+ + ?-*v + ?+ :?| + ' '*v +?|  # +--...--+ or |  ...  | as required
    }
  )while n[0]                         #loop until data exhausted (n[0] becomes falsy as it does not exist)
a.delete($b);puts a}                  #delete blank rows ($b is a global variable) and display

3

स्माइलबासिक, 128 125 बाइट्स

DEF B A
WHILE LEN(A)H=POP(A)W=POP(A)-2Y=POP(A)X=POP(A)FOR I=0TO H-1LOCATE X,Y+I?"+|"[M];"- "[M]*W;"+|"[M]M=I<H-2NEXT
WEND
END

स्क्रीनशॉट (फसली)

स्क्रीनशॉट स्क्रीनशॉट स्क्रीनशॉट स्क्रीनशॉट स्क्रीनशॉट

व्याख्या

DEF B A 'make a function and add 12 bytes :(
 WHILE LEN(A) 'repeat until array is empty
  H=POP(A):W=POP(A)-2 'get width/height
  Y=POP(A):X=POP(A) 'get x/y
  FOR I=0 TO H-1 'draw one row at a time
   LOCATE X,Y+I 'position the cursor
   PRINT "+|"[M]; 'draw left edge
   PRINT "- "[M]*W; 'draw middle
   PRINT "+|"[M] 'draw right edge
   M=I<H-2
  NEXT
 WEND
END

Mस्टोर करता है कि क्या यह बॉक्स की पहली / अंतिम पंक्ति ( 0= +--+, 1= | |) पर है। लूप के माध्यम से पहले पास Mपर, 0 है, और अन्य सभी पर आखिरी तक, यह 1 है।


यह बहुत अच्छा है :)
J Atkin


1

पायथ, 162 145 बाइट्स

J\+K*h.MZm+@d1@d3Q]*h.MZm+@d0@d2QdD:GHb XKHX@KHGb;V_QDlTR@NTVl3Vl2:+l0b+l1H?|qHtl3qH0\-?|qbtl2qb0\|d)):l0l1J:+l0tl2l1J:l0+l1tl3J:+l0tl2+l1tl3J;jK

आप इसे यहाँ आज़मा सकते हैं

परीक्षण सूट का उत्पादन:

+---------+     
|         |     
|         |----+
+---------+    |
        |      |
   +----+-+----+
   |      |     
   +------+     

++
++

+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

+-+-+
| | |
+-+-+

भयानक समाधान! बस उसे किसी के पिटने का इंतजार है


2
आपका पहला उदाहरण एक अतिरिक्त + डालता है जिसमें बक्से एक किनारे साझा करते हैं।
लाइनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.