मुझे एक बाड़ बनाओ!


15

चुनौती

यह एक सरल चुनौती है। यह देखते हुए दो धनात्मक पूर्णांक w और hकी चौड़ाई के साथ एक ASCII बाड़ बनाने wऔर की ऊंचाई h। बाड़ का निर्माण निम्नलिखित नियमों का उपयोग करके किया जाना चाहिए:

  • +चरित्र एक पोस्ट का प्रतिनिधित्व करेंगी।
  • -चरित्र बाड़ की चौड़ाई का प्रतिनिधित्व करने के लिए इस्तेमाल किया जाएगा।
  • |बाड़ की ऊंचाई का प्रतिनिधित्व करने के लिए इस्तेमाल किया जाएगा।
  • बाद वास्तव में तीन -पात्रों outputted किया गया है, एक +चरित्र चाहिए बाद में outputted हो। चार कोनों को छोड़कर, आपके द्वारा आउटपुट किए जाने वाले किसी भी समय +अमान्य होगा। आपको इस नियम का पालन या तो बाएं या दाएं से शुरू करने की अनुमति है (उदाहरण देखें), लेकिन आपको सुसंगत होना चाहिए।
  • बाद वास्तव में दो |पात्रों outputted किया गया है, एक +चरित्र चाहिए बाद में outputted हो। चार कोनों को छोड़कर, आपके द्वारा आउटपुट किए जाने वाले किसी भी समय +अमान्य होगा। आपको इस नियम का पालन करने की अनुमति ऊपर या नीचे से शुरू होती है (उदाहरण देखें), लेकिन आपको सुसंगत होना चाहिए।
  • प्रत्येक बाड़ में ठीक चार कोने होंगे, और प्रत्येक कोने को ए के साथ दर्शाया जाएगा +

दूसरे शब्दों में: प्रत्येक तीन -वर्णों पर, आपको आउटपुट ए होना चाहिए +। और हर दो |वर्णों पर, आपको आउटपुट होना चाहिए +

आप मान सकते हैं कि बाड़ जाएगा हमेशा एक आयत हो, और दोनों कि wऔर hअधिक से अधिक कभी नहीं होगा 100या कम से कम 1। अनुगामी और / या पूर्ववर्ती व्हाट्सएप की अनुमति है।

उदाहरण / परीक्षण मामले

w = 1
h = 1

+-+ 
| |
+-+


w = 3
h = 2

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


w = 5
h = 7

+---+--+ or +--+---+
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
+---+--+    +--+---+

w = 10
h = 5

+---+---+---+-+  or +-+---+---+---+
|             |     |             |
|             |     +             +
+             +     |             |
|             |     |             |
|             |     +             +
+             +     |             |
|             |     |             |
+---+---+---+-+     +-+---+---+---+


w = 4
h = 4

+---+-+ or +-+---+
|     |    |     |
|     |    |     |
+     +    +     +
|     |    |     |
|     |    |     |
+---+-+    +-+---+

नियम



3
क्या मुझे यह समझने का अधिकार है कि दो +स्पर्श नहीं हो सकते हैं ?
22

@xnor हाँ, यह सही है।
ईसाई डीन

3
महान पहली चुनौती, वैसे।
xnor

1
@LeakyNun आपका अधिकार। यह एक ऐसा मामला है जब मुझे अपने नियम बनाते समय ध्यान में नहीं आया। मैंने यह बताने के लिए एक नियम जोड़ा कि +-+-+-+-+-+अमान्य क्यों है। गलतफहमी के लिए खेद है।
ईसाई डीन

जवाबों:


9

सी, 131 बाइट्स

#define L for(i=0,j=w;j;)putchar(i++%4?--j,45:43);puts("+")
f(w,h,i,j,c){L;for(j=1;h;printf("%c%*c\n",c,i,c))c=j++%3?--h,124:43;L;}

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण:

// The first and the last line are always similar, so let's use a macro
// to avoid code duplication.
#define L

// Let's initialize 'i' and 'j'. 'i' will be used to keep track of which
// character ('+' or '-') we should print, whereas 'j' starts from the
// input width and the loop terminates when 'j' reaches zero.
for(i=0,j=w;j;)

// We post-increment 'i' and take a modulo 4 of its previous value.
// If i%4 == 0, we print '+' (ASCII 43), otherwise we decrement 'j'
// and print '-' (ASCII 45).
putchar(i++%4?--j,45:43);

// After the loop we print one more '+' and newline.
puts("+")

// The function declaration which takes the two input parameters, and
// also declares three integer variables. These three variables could
// also be declared as global variables with the same bytecount.
f(w,h,i,j,c)

// The start of the function body. We use the macro 'L' to print the 
// first line along with a newline.
{L;

// This loop prints all the lines between the first and the last. 'j'
// keeps track of when we should output a '+' instead of a '|'. 'h',
// which is the input parameter for height, serves as a terminator
// for the loop as it reaches zero.
for(j=1;h;<stuff missing from here>)

// We post-increment 'j' and check if its previous value is divisible
// by three, and if it isn't, we decrement 'h' and assign 124 (ASCII
// value for '|') to 'c'. Otherwise we assign '+' (ASCII 43) to 'c'.
c=j++%3?--h,124:43;

// The following is inside the 'increment' part of the 'for' loop.
// We print the character corresponding to the value of 'c', then
// the same character again, but padded with i-1  spaces before it 
// ('i' hasn't been touched since the first loop, so it still stores
// the length of the first line), then a newline.
printf("%c%*c\n",c,i,c)

// Lastly we print the first line again using the same macro 'L'.
L;}

5

पायथन 3 , 140 137 128 119 106 105 बाइट्स

def f(w,h):a=~-w//3-~w;b=("+---"*w)[:a]+'+';print(b,*[i+' '*~-a+i for i in"||+"*h][:h+~-h//2],b,sep='\n')

इसे ऑनलाइन आज़माएं!


2
यह अब लंबा है लेकिन मुद्दा तय हो गया है।
गारेथपब्लू

1
आप के बीच की जगह को निकाल कर एक बाइट को बचा सकता है inऔर [w+1+(w-1)//3]]अंतिम भाग में।
ईसाई डीन

1
PPCG में आपका स्वागत है! आप अंतरिक्ष में भी निकाल सकते हैं '\n') for। इसके अलावा, आप बदल सकते हैं (w-1), ~-wजिससे आपको कोष्ठक को हटाने की अनुमति मिलती है, क्योंकि अपर संचालकों को द्विआधारी की तुलना में अधिक पूर्वता होती है। के लिए समान (h-1)-> ~-hऔर (a-1)-> ~-aइसे ऑनलाइन आज़माएं - 128 बाइट्स
म्यूज़िकमैन 523

1
इसके अलावा जब से आपका सभी आउटपुट प्रिंट होता है, def f(w,h)तब तक यही लंबाई होती है lambda w,h, लेकिन अगर आप अपने कोड को आगे बढ़ाने में मदद करते हैं तो आप कई लाइनों का उपयोग कर सकते हैं
Musicman523

1
a=~-w//3-~w;1 बाइट को बचाने के लिए
फेलिप नारदी बतिस्ता

4

मैथेमेटिका, 165 बाइट्स

v=Column;d[w_,y_,m_,n_]:=Table[If[Mod[i,y]==0&&i!=w,m,n],{i,w}];(a="+"<>d[#,3,"-+","-"]<>"+";b=v@d[#2,2,"|\n+","|"];v[{a,Row[{b,""<>Table[" ",#+Floor[#/3]],b}],a}])&

4

पिप , 38 बाइट्स

कोड के 37 बाइट्स, +1 के लिए -nझंडे के ।

Ph:'-Xa<>3JW'+PsX#h-2WR:'|Xb<>2J'+^xh

कमांड लाइन तर्क के रूप में चौड़ाई और ऊंचाई लेता है। इसे ऑनलाइन आज़माएं!

व्याख्या

                         a,b are cmdline args; s is space; x is empty string (implicit)
Ph:'-Xa<>3JW'+
   '-Xa                  String of hyphens of length a
       <>3               grouped into substrings of (maximum) length 3
          JW'+           Join on +, also wrapping the result in +
 h:                      Assign that string to h (mnemonic: "header")
P                        and print it (with newline)

PsX#h-2WR:'|Xb<>2J'+^xh
          '|Xb           String of pipes of length b
              <>2        grouped into substrings of (maximum) length 2
                 J'+     joined on +
                    ^x   and split on empty string (i.e. converted to list of chars)
 sX#h-2                  String of len(h)-2 spaces
       WR:               Wrap the spaces with the list of chars
                         Note 1: WR operates itemwise on lists, so the result is a list,
                          each item of which consists of the spaces wrapped in an item
                          from the list of chars
                         Note 2: the : compute-and-assign meta-operator is here abused
                          to give WR: lower precedence than J and ^ and avoid parentheses
P                        Print that list, newline-separated (-n flag)
                      h  Autoprint the header a second time as the footer

4

चारकोल, 47 45 40 बाइट्स

F⁴«¿﹪ι³FIη↓⁺×+¬﹪κ²|FIθ⁺×+¬﹪κ³-P+¿⁼ι¹J⁰¦⁰

स्पष्टीकरण: प्रत्येक पक्ष बनाकर काम करता है -एस / |एस बारी में, डालने +रों जहां आवश्यक हो, तो एक साथ खत्म +। शीर्ष और दाएं पक्षों को खींचने के बाद, उन्हें उल्टे क्रम में खींचने के लिए शुरुआत में वापस कूदता है, प्रभावी रूप से बाईं और नीचे की तरफ ड्राइंग करता है। मुझे नहीं पता कि घूर्णी समरूपता की अनुमति है या नहीं, लेकिन यदि ऐसा है, तो 27 25 बाइट्स के लिए:

F⁴«FI⎇﹪ι²ηθ⁺×+¬﹪κ⁻³﹪ι²-⟲T

उपरोक्त विचार को ऊपर की ओर खींचकर, बाएं को घुमाते हुए, दाईं ओर की रेखा को खींचकर, फिर से घुमाते हुए ऊपर की ओर ले जाता है, और फिर नीचे और बाएं पक्षों को उलटने के लिए दोहराता है।


1
@LeakyNun पिछली बार जब मैंने पायथ को हराया तो कुछ हीरों को डबल करने के लिए था, और तब भी यह केवल छोटा था।
नील

4

जावास्क्रिप्ट (ईएस 6), 133 132 बाइट्स

w=>h=>(a="-".repeat(w).replace(/--?-?/g,"+$&")+`+`)+(`
|`.padEnd(a.length)+`|`).repeat(h).replace(/(\|( +)\|\n)\1/g,`$&+$2+
`)+`
`+a

करी सिंटैक्स में इनपुट लेता है f(width)(height):।

टेस्ट स्निपेट

f=
w=>h=>(a="-".repeat(w).replace(/--?-?/g,"+$&")+`+`)+(`
|`.padEnd(a.length)+`|`).repeat(h).replace(/(\|( +)\|\n)\1/g,`$&+$2+
`)+`
`+a
O.innerHTML=f(W.value=5)(H.value=10)
<div oninput="O.innerHTML=f(+W.value)(+H.value)">
W <input id=W type=number min=1> H <input id=H type=number min=1>
</div>
<pre id=O>



2

जावा (ओपनजेडके 8) , 178 177 बाइट्स

w->h->{int i=0;String t="",m,r;for(;i<w;)t+=i++%3<1?"+-":"-";r=t+="+\n";m=t.format("|%"+(t.length()-3)+"s|\n","");for(i=0;i<h;)r+=i++%2<1&i>1?m.replace("|","+")+m:m;return r+t;}

इसे ऑनलाइन आज़माएं!

-1 बाइट @KevinCruijssen को धन्यवाद


आप मापदंडों को कम करके एक बाइट को बचा सकते हैं: w->h-> इसे यहां आज़माएं।
केविन क्रूज़सेन

हां, मैं लगातार करीने के बारे में भूल जाता हूं ... यह कुछ ऐसा नहीं है जो मुझे स्वाभाविक लगता है: s
ओलिवियर ग्रेजायर

1

चारकोल , 47 45 37 बाइट्स

A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β

इसे ऑनलाइन आज़माएं!

  • स्ट्रिंग निर्माण में संकेतों के साथ खेलने के बाद 2 बाइट्स बचाए गए।
  • 8 बाइट्स ने नील को धन्यवाद दिया, जो बाड़ की लंबाई की गणना करने के लिए बहुत सरल तरीके से आए।

@ नील के दृष्टिकोण से एक अलग दृष्टिकोण : पहले मैं स्ट्रिंग्स बनाता हूं αऔर βक्षैतिज और ऊर्ध्वाधर सीमाओं में वर्णों को शामिल करता हूं , Rangeऑपरेटर का उपयोग करके एक स्ट्रिंग की पुनरावृत्ति बनाता है जब तक कि एक निर्धारित लंबाई तक नहीं पहुंच जाता है। फिर मैं उन्हें उचित क्रम में प्रिंट करता हूं:

  • कर्सर को हिलाए बिना α प्रिंट करें।
  • नीचे की ओर प्रिंट करें।
  • प्रिंट α।
  • एक "+" प्रिंट करें।
  • कर्सर को ऊपर और बाईं ओर ले जाएँ।
  • प्रिंट Print ऊपर की ओर, उल्टा।

एक वर्बोज़ संस्करण से लिंक करें ।


1
मेरे बारे में याद दिलाने के लिए धन्यवाद Range, जो मेरे दूसरे दृष्टिकोण पर 3 बाइट्स बचाता है!
नील

@ क्योंकि यह अच्छा है क्योंकि मैंने अभी-अभी आपका बहिर्गमन किया है और मैं अभी इस पर विश्वास नहीं कर सकता। :-)
चार्ली

1
अभी भी बेहतर है, मैं 8 बाइट्स बचाते हुए, आपके भावों को अनुकूलित करने में कामयाब रहा A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β:।
नील

@ नील वाह। ऐसा अनुकूलन। बहुत चारकोल।
चार्ली

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