Büyüyen Kutu Yığını çizin


18

Görev

Bu meydan okumada, göreviniz artan yükseklikteki birkaç kutu yığınından bir ASCII sanat temsili çizmektir. Pozitif bir tamsayı olan yığın sayısını girdi olarak alırsınız. İlk yığın bir kutu içerir 2x2. İkinci yığın 2 kutu boyutundadır 3x3. Genel olarak, kyığın yığını kboyut kutuları içerir (k+1)x(k+1).

Her kutunun kenarlıkları karakterler kullanılarak çizilir -|+ve iç kısımları boşluktan oluşur. Bitişik kutular sınırlarını paylaşır ve +başka bir kutunun kenarlığının parçası olsalar bile köşeler her zaman çizilmelidir .

Örnekler

Çıktı 1:

++
++

Çıktı 2:

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

Çıktı 3:

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

Çıktı 5:

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

Kurallar ve Puanlama

Giriş, STDIN'den bir komut satırı bağımsız değişkeni veya bir işlev bağımsız değişkeni olarak alınabilir. Çıktı gerekir STDOUT ya da en yakın eşdeğer gidin. Önceki ve sondaki satır sonlarında olduğu gibi, sonlu herhangi bir sondaki boşluk alanına izin verilir, ancak fazladan önceki boşluklar olamaz.

Bu kod golf, bu yüzden en düşük bayt sayısı kazanır. Standart boşluklara izin verilmez.


2
Bu ascii çıktısının nasıl nve n-1nispeten asal olduğu için iyi bir örnek olduğunu düşünüyorum . İki artı asla örtüşmez.
mbomb007

1
Giriş numarası için herhangi bir maksimum sınır var mı?
Thomas Weller

@ThomasWeller Dilinizin yerel tam sayı türünün yalnızca maksimum sınırı.
Zgarb

Görünüşe göre bu oldukça sınırlayıcı bir faktör. Bazı gönderiler Integer.MaxValuegirdi olarak çalışmaz .
Thomas Weller

1
@ThomasWeller Oh, elbette haklısın ... niyetim mevcut cevapları geçersiz kılmak değildi. Şunu geçersiz kılalım: Bir çözüm, çıktıdaki toplam gerekli karakter sayısının aşılmadığı Integer.MaxValueveya eşdeğer olmadığı tüm girişler için çalışmalıdır .
Zgarb

Yanıtlar:



8

Java ( 407349 karakter)

@Zgarb ve @Geobits sayesinde birkaç karakter

kod

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();}}

Bunun en uygun olup olmadığından emin değilim, ama bu benim ilk denemem, muhtemelen daha sonra daha iyi bir golf diline koymaya çalışacağım. Herhangi bir öneri bekliyoruz!

Expanded

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();
        }
    }
}

Buradan kontrol edin.


5
1) değiştirin: 10 byte için ipuçları &&ve ||birlikte &ve |. 2) intBeyanları for( for(int i=0,j,x,z;...) içine taşıyın . 3) Golf fonksiyonunuzun sonunda çok fazla diş teliniz var.
Geobits

4
Formun birçok karşılaştırması var a+1<=b+1; ile değiştirilebilir a<=b.
Zgarb

2
q*q+1muhtemelen başka bir değişkene atanmalıdır. 9 kez kullanıyorsunuz ve bir a=q*q+1kez söyleyerek bir demet kaydedebilirsiniz . Ayrıca, q*(q+1)sadece q*q+q.
Geobits

Sadece Geobits ve Zgarb'ı yapıyordum, öneriler için teşekkürler!
Changming

Belki özyinelemeli bir çözüm arayabilirsin? Güzel bir tane olması gerektiği anlaşılıyor.
mbomb007

5

Python 2, 144128 bayt

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

Biraz dönüyor. Her yerde biraz burkuluyor.


3

Python, 188 bayt

Her x,ykonumdaki karakteri matematiksel olarak hesaplar . Bu yapım zor oldu +her kutunun her iki tarafında lar baskı yanı sıra en sağdaki durdurma +olacağını ne s n+1inci kutuları.

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 ne yapar?
Abr001am


@Geobits Beni kendi kodumun ne yaptığını cevaplamak için yendi!
KSab

@Geobits evet ben kat $ sqrt (2 * n-sqrt (2 * n)) $,
Abr001am

1
@ThomasWeller piton otomatik olarak o dönüştürecektir longolan hiçbir üst sınır.
KSab

1

304 bayt (işlev)

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();}}

veya 363 bayt (tam kod)

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();}}}}

If ifadeleri önlemek için çalıştı. 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;
        }
    }
}

Çözümüm, OP tarafından tanımlanan Tamsayı aralığının herhangi bir girdisi için çalışmıyor. Onun longyerine kullanmam gerekecekti .
Thomas Weller

1

Yakut (205 bayt)

Sayıyı komut satırı bağımsız değişkenleri olarak alır. Yeni bir satırsonu ile başlar, ancak buna izin verilir.

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

JavaScript (ES6), 293 bayt

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

Bunu Firefox'ta çalıştırdım. Yoksay "konsolun dizeler arasında eklediğini görmezden gelin. Bu çoğunlukla ES5 şeyler ama ben bu daha golf çalışacağız.

Ungolfed / ES5

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

Python 2, 294 290

Çalıştırdım, ama yine de daha fazla golf yapmam gerekiyor. Yine de çok mutluyum, bu zordu (en azından benim için)!

Muhtemelen daha sonra bir açıklama ekleyeceğim, eğer biri için hemen net değilse ...? Şüpheliyim.

Burada deneyin

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

Python - 243 bayt

İlki hariç sütunlardaki çakışmaları değiştirerek tüm sütunları oluşturur. Sonra boşluklarla doluyor, iç içe geçiyor ve baskı yapıyor.

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

Pyth'e çevirmeyi düşünüyorum, ancak pad işlevi için bir yedek almam gerekecek.

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.