বক্সগুলির ক্রমবর্ধমান স্ট্যাকগুলি আঁকুন


18

কাজটি

এই চ্যালেঞ্জে, আপনার কাজটি হ'ল বর্ধমান উচ্চতার বক্সগুলির কয়েকটি স্ট্যাকের একটি ASCII শিল্প উপস্থাপনা আঁকুন। আপনাকে স্ট্যাকের সংখ্যা হিসাবে ইনপুট হিসাবে দেওয়া হবে যা একটি ধনাত্মক পূর্ণসংখ্যা। প্রথম স্ট্যাকটিতে আকারের একটি বাক্স রয়েছে 2x2। দ্বিতীয় স্ট্যাকের আকারের 2 টি বাক্স রয়েছে 3x3। সাধারণভাবে, kম স্ট্যাকটিতে kআকারের বাক্স রয়েছে (k+1)x(k+1)

প্রতিটি বাক্সের সীমানা অক্ষরগুলি ব্যবহার করে আঁকা হয় -|+এবং তাদের অভ্যন্তরটি সাদা স্থান নিয়ে থাকে p সংলগ্ন বাক্সগুলি তাদের সীমানা ভাগ করে দেয় এবং কোণগুলি সর্বদা সাথে আঁকতে হবে +, এমনকি তারা অন্য বাক্সের সীমানার অংশ হলেও are

উদাহরণ

এর জন্য আউটপুট 1:

++
++

এর জন্য আউটপুট 2:

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

এর জন্য আউটপুট 3:

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

এর জন্য আউটপুট 5:

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

বিধি এবং স্কোরিং

কমান্ড লাইন আর্গুমেন্ট হিসাবে বা কোনও ফাংশন আর্গুমেন্ট হিসাবে এসটিডিআইএন থেকে ইনপুট পাওয়া যায়। আউটপুট অবশ্যই STDOUT বা নিকটতম সমতুল্যে যেতে । পূর্ববর্তী ও পূর্বের নতুন লাইনের মতো সীমাবদ্ধ শ্বেত স্পেসের যে কোনও সীমাবদ্ধ পরিমাণ অনুমোদিত, তবে অতিরিক্ত কোনও পূর্ববর্তী স্থান থাকতে পারে না।

এটি কোড-গল্ফ, তাই সর্বনিম্ন বাইট গণনা জিতে। স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।


2
আমি মনে করি এটা ASCII আউটপুট কিভাবে একটি ভাল চিত্রণ nএবং n-1অপেক্ষাকৃত মৌলিক হয়। দুটি প্লাস কখনই ওভারল্যাপ হবে না।
mbomb007

1
ইনপুট নম্বরটির জন্য কি কোনও সীমাবদ্ধতা রয়েছে?
থমাস ওয়েলার

@ থমাস ওয়ালার কেবল আপনার ভাষার নেটিভ পূর্ণসংখ্যার সর্বাধিক সীমা।
Zgarb

দেখে মনে হচ্ছে এটি বেশ সীমাবদ্ধ ফ্যাক্টর। কিছু জমা দেওয়া Integer.MaxValueইনপুট হিসাবে কাজ করবে না ।
টমাস ওয়েলার

1
@ থমাস ওল্ডার ওহ, আপনি অবশ্যই ঠিক বলেছেন ... বিদ্যমান উত্তরগুলিকে অবৈধ করা আমার উদ্দেশ্য নয়। আসুন ওভারলুল করুন: একটি দ্রবণটি সমস্ত ইনপুটগুলির জন্য কাজ করা উচিত যার জন্য আউটপুটে প্রয়োজনীয় অক্ষরের মোট সংখ্যা অতিক্রম Integer.MaxValueবা সমতুল্য হয় না ।
Zgarb

উত্তর:



8

জাভা ( 407 349 অক্ষর)

@ জাগারব এবং @ জিওবিটসকে কয়েকটি অক্ষর ধন্যবাদ জানায়

কোড

void s(int q){int d,h,y,i,j,x,z,t=q*q+1;char b;for(i=0;i<t;i++){z=x=0;d=t-i;for(j=0;j<(q*q+q)/2+1;j++){b=' ';h=x*x+1;if(x==z){y=x+1;if((d<=h&d%(x==0?1:x)==(x==1?0:1))|(y<=q&d<=y*y+1&d%(y==0?1:y)==(y==1?0:1)))b='+';else if(d<=h|y<=q&d<=y*y+1)b='|';x++;z=1;}else{if(d<=h&d%(x==0?1:x)==(x==1?0:1))b='-';z++;}System.out.print(b);}System.out.println();}}

এটি সর্বোত্তম কিনা তা নিশ্চিত নয় তবে এটি আমার প্রথম প্রচেষ্টা, আমি সম্ভবত এটি পরে আরও ভাল গল্ফিং ভাষায় রাখার চেষ্টা করব। কোন পরামর্শ স্বাগত!

সম্প্রসারিত

class StackingBlocks{
    public static void main(String[]a){
        int d,h,y,i,j,x,z,t,q=10;
        t=q*q+1;
        char b;
        for(i=0;i<t;i++){
            z=x=0;
            d=t-i;
            for(j=0;j<(q*q+q)/2+1;j++){
                b=' ';
                h=x*x+1;
                if(x==z){
                    y=x+1;
                    if((d<=h&d%(x==0?1:x)==(x==1?0:1))|(y<=q&d<=y*y+1&d%(y==0?1:y)==(y==1?0:1)))
                        b='+';
                    else if(d<=h|y<=q&d<=y*y+1)
                        b='|';
                    x++;
                    z=1;
                }else{
                    if(d<=h&d%(x==0?1:x)==(x==1?0:1))
                        b='-';
                    z++;
                }
                System.out.print(b);
            }
            System.out.println();
        }
    }
}

এটি এখানে দেখুন।


5
10 বাইটের জন্য দ্রুত টিপস: 1) প্রতিস্থাপন করুন &&এবং এর ||সাথে &এবং |। 2) intঘোষণাগুলিকে for( ) এ সরান for(int i=0,j,x,z;...। 3) আপনার গল্ফড ফাংশন শেষে আপনার একটি খুব বেশি ধনুর্বন্ধনী রয়েছে।
জিওবিটস

4
আপনার সাথে ফর্মের তুলনা অনেক আছে a+1<=b+1; তারা দ্বারা প্রতিস্থাপন করা যেতে পারে a<=b
জাগারব

2
q*q+1সম্ভবত অন্য একটি পরিবর্তনশীল বরাদ্দ করা উচিত। আপনি এটি 9 বার বা তার বেশি বার ব্যবহার করেন এবং a=q*q+1একবার বলে আপনি একগুচ্ছ সাশ্রয় করতে পারেন । এছাড়াও, q*(q+1)ঠিক হয় q*q+q
জিওবিটস

আমি কেবল সেই জিওবিটস এবং জগারব করছিলাম, পরামর্শগুলির জন্য ধন্যবাদ!
Changming

আপনি একটি পুনরাবৃত্ত সমাধান সমাধান করতে পারেন, সম্ভবত? দেখে মনে হচ্ছে এখানে একটি সুন্দর হওয়া উচিত।
mbomb007

5

পাইথন 2, 144 128 বাইট

n=input()
i=n*n
while-~i:j=x=1;l="";exec'y=i%j<1;z=i>j*j;l+=j*z*" "or"|+"[x|y]+" -"[y]*~-j;x=y^z>z;j+=1;'*n;print l+"|+"[x];i-=1

বিট টুইডলিং। কোথাও বিট বিড়ম্বনা।


3

পাইথন, 188 বাইট

গাণিতিকভাবে প্রতিটি x,yপজিশনে অক্ষর গণনা করা হয় । এটি +প্রতিটি বাক্সের উভয় দিকে এস মুদ্রণ তৈরি করার পাশাপাশি তম বাক্সগুলি +কী হবে তার ডানদিকের স্টপ করা কৌতুকপূর্ণ ছিল n+1

n=input();l=1;c=0
for y in range(n*n,-1,-1):
 s=""
 for x in range((n*n+n)/2+1):k=((8*x+1)**.5+1)/2;i=int(k);b=y<=i**2;s+=" |-+"[((k==i)+2*((y%l+c)*(y%i+(k==n+1))<1))*b];l=i;c=b^1
 print s

(8 * x + 1) ** কী করে? 5 + 1 কী করে?

@ আগওয়া 1001 দেখতে একটি বিপরীত ত্রিভুজ ফাংশন
জিওবিটস

@ জিওবিটস আমার নিজের কোড কী করে তার জবাব দিতে আমাকে মারধর করুন!
কেএসব

@ জিওবিটস হ্যাঁ আমি ফ্লোর something বর্গ (2 * এন-
স্ক্রিট

1
@ থমাস ওয়েলারের অজগরটি স্বয়ংক্রিয়ভাবে এটিকে এমন রূপান্তর করবে longযার কোনও উচ্চতর সীমা নেই।
কেএসব

1

সি # - 304 বাইট (ফাংশন)

void b(int s){int h=s*s,w=h+s>>1,x,y,j;var c=new int[w+1,h+1];for(;s>0;s--){for(y=s*s-s;y>=0;y-=s){x=s*s-s>>1;for(j=0;j<s;){c[x+j,y]=c[x+j,y+s]=13;c[x,y+j]=c[x+s,y+j++]=92;}c[x,y]=c[x+s,y]=c[x+s,y+s]=c[x,y+s]=11;}}for(y=h;y>=0;y--){for(x=0;x<=w;x++)Console.Write((char)(32+c[x,y]));Console.WriteLine();}}

বা 363 বাইট (সম্পূর্ণ কোড)

namespace System{class C{static void Main(string[]a){int s=int.Parse(a[0]),h=s*s,w=h+s>>1,x,y,j;var c=new int[w+1,h+1];for(;s>0;s--){for(y=s*s-s;y>=0;y-=s){x=s*s-s>>1;for(j=0;j<s;){c[x+j,y]=c[x+j,y+s]=13;c[x,y+j]=c[x+s,y+j++]=92;}c[x,y]=c[x+s,y]=c[x+s,y+s]=c[x,y+s]=11;}}for(y=h;y>=0;y--){for(x=0;x<=w;x++)Console.Write((char)(32+c[x,y]));Console.WriteLine();}}}}

আমি বক্তব্য এড়াতে চেষ্টা করেছি। Ungolfed:

namespace N
{
    public class Explained
    {
        static void boxes(string[] args)
        {
            int size = int.Parse(args[0]);
            int height = size * size + 1;
            int width = size * (size + 1) / 2 + 1;
            var canvas = new int[width, height];
            for (; size > 0; size--)
                drawboxes(size, canvas);

            for (int y = height - 1; y >= 0; y--)
            {
                for (int x = 0; x < width; x++)
                    Console.Write((char)(32 + canvas[x, y]));
                Console.WriteLine();
            }
        }

        static void drawboxes(int size, int[,] canvas)
        {
            int x = size * (size - 1) / 2;
            for (int i = size - 1; i >= 0; i--)
            {
                drawbox(x, i * size, size, canvas);
            }
        }

        static void drawbox(int x, int y, int size, int[,] canvas)
        {
            for (int i = 0; i < size; i++)
            {
                canvas[x + i, y] = 13; // +32 = '-'
                canvas[x + i, y + size] = 13;
                canvas[x, y + i] = 92; // +32 = '|'
                canvas[x + size, y + i] = 92;
            }
            canvas[x, y] = 11; // +32 = '+'
            canvas[x + size, y] = 11;
            canvas[x + size, y + size] = 11;
            canvas[x, y + size] = 11;
        }
    }
}

আমার দ্রষ্টব্যটি ওপি দ্বারা সংজ্ঞায়িত হিসাবে পূর্ণসংখ্যার ব্যাপ্তির কোনও ইনপুট জন্য কাজ করে না। longপরিবর্তে আমার ব্যবহার করা উচিত
টমাস ওয়েলার

1

রুবি (205 বাইট)

কমান্ড লাইন আর্গুমেন্ট হিসাবে নম্বর নেয়। এটি একটি ব্যর্থ নেতৃস্থানীয় নিউলাইনগুলি দিয়ে শুরু হয়, তবে এটি অনুমোদিত।

n=$*[0].to_i
m=n+1
f=m.times.inject(:+)+1
c=((" "*f+p=?+)*n*m).split p
y=0
1.upto(n){|b|(b*b+1).times{|x|d=x%b==0;r=c[x]
d&&b.times{|g|r[y+g]=?-}
r[y]=d||r[y]==p ?p:?|
r[y+b]=d ?p:?|}
y+=b}
puts c.reverse

1

জাভাস্ক্রিপ্ট (ES6), 293 বাইট

(n,o='',r,f,t,u,b,c,e=n*n+1,i)=>{for(t=0;e>t;t++){for(c=b=0,d=e-t,u=0;(n*n+n)/2+1>u;u++)i=" ",r=b*b+1,b==c?(f=b+1,d<=r&d%(0==b?1:b)==(1==b?0:1)|n>=f&d<=f*f+1&d%(0==f?1:f)==(1==f?0:1)?i="+":d<=r|n>=f&d<=f*f+1&&(i="|"),b++,c=1):(d<=r&d%(0==b?1:b)==(1==b?0:1)&&(i="-"),c++),o+=i;o+="\n"}return o}

আমি এটি ফায়ারফক্সে চালিয়েছি। "কনসোলটি স্ট্রিংয়ের মধ্যে যুক্ত করে উপেক্ষা করুন । এটি বেশিরভাগ ES5 স্টাফ তবে আমি আরও গল্ফ দেওয়ার চেষ্টা করব।

অবহেলিত / ইএস 5

function box(n, o, r, f, t, u, b, c, e, i) {
  if (o === undefined) o = "";
  if (e === undefined) e = n * n + 1;
  return (function() {
    for (t = 0; e > t; t++) {
      for (c = b = 0, d = e - t, u = 0;
        (n * n + n) / 2 + 1 > u; u++) i = " ", r = b * b + 1, b == c ? (f = b + 1, d <= r & d % (0 == b ? 1 : b) == (1 == b ? 0 : 1) | n >= f & d <= f * f + 1 & d % (0 == f ? 1 : f) == (1 == f ? 0 : 1) ? i = "+" : d <= r | n >= f & d <= f * f + 1 && (i = "|"), b++, c = 1) : (d <= r & d % (0 == b ? 1 : b) == (1 == b ? 0 : 1) && (i = "-"), c++), o += i;
      o += "\n";
    }
    return o;
  })();
}

document.getElementById('g').onclick = function(){ document.getElementById('o').innerHTML = box(+document.getElementById('v').value) };
<input id="v"><button id="g">Run</button><pre id="o"></pre>


1

পাইথন 2, 294 290

আমি এটি কাজ করেছিলাম, তবে আমার এখনও এটি আরও গল্ফ করা দরকার। আমি খুব খুশি, যদিও, এটি শক্ত ছিল (আমার পক্ষে, কমপক্ষে)!

আমি সম্ভবত পরে একটি ব্যাখ্যা যুক্ত করব, যদি তা অবিলম্বে কারও কাছে পরিষ্কার না হয় ...? আমি এটা এক ধরনের সন্দেহ।

এখানে চেষ্টা করুন

n=input()
w=n*n+n+2>>1
a=eval(`[[' ']*w]*-~n**2`)
r=range
j=[i*i+i>>1for i in r(n+1)]
p=0
for i in r(w):
 if i in j:
    p+=p<n
    for k in r(p*p+1):a[~k][i]='+'if k%p<1or' '<a[~k][i-1]<'.'else'|'
 else:
    for k in r(p*p+1):a[~k][i]=' 'if k%p else'-'
print'\n'.join(''.join(i)for i in a)

0

পাইথন - 243 বাইট

প্রথমটি বাদে কলামগুলিতে ওভারল্যাপগুলি প্রতিস্থাপন করে সমস্ত কলাম তৈরি করে। তারপরে এটি স্পেস, ট্রান্সপোজ এবং প্রিন্টগুলির সাথে প্যাড দেয়।

Q=input()
Y=[]
for i in range(Q):
    f="+"+i*"-"+"+";x=map(list,zip(*([f]+["|"+" "*i+"|"]*i)*(i+1)+[f]))
    if i:y=Y.pop();x[0][-len(y):]=y
    Y+=x
print"\n".join("".join(i)for i in zip(*["".join(j[::-1]).ljust(Q*Q+1," ")for j in Y])[::-1])

আমি পাইথ অনুবাদ করার বিষয়ে বিবেচনা করছি, তবে প্যাড ফাংশনের জন্য আমার একটি প্রতিস্থাপনের প্রয়োজন হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.