ABC golf kodu: ASCII Kutu Mücadelesi


14

İki pozitif tamsayılar, 'a' ve 'b', çıkışı bir ascii-art "kutu" Verilen bir karakter genişliğinde ve b karakterleri boyunda. Örneğin, '4' ve '6' ile:

****
*  *
*  *
*  *
*  *
****

Basit değil mi? İşte bükülme: Kutunun kenarlığı, sırayla "a" ve "b" karakterleri olmalıdır. Bu sol üst köşeden başlar ve saat yönünde spiral şeklinde devam eder. Örneğin, 4 ve 6 ile bir önceki örnek şu şekilde olmalıdır:

4646
6  4
4  6
6  4
4  6
6464

A ve B olabilir , iki basamaklı sayı olabilir. Örneğin, "10" ve "3" girişleri şunu vermelidir:

1031031031
1        0
3013013013

Çıktıyı nispeten küçük tutmak için üç veya daha fazla rakamı desteklemenize gerek yoktur. Ayrıca, girişler pozitif tamsayılarla sınırlı olduğundan , '0' geçersiz bir giriştir ve işlemeniz gerekmez.

İşte bazı test örnekleri:

Input: (3, 5)
Output:

353
5 5
3 3
5 5
353

Input: (1, 1)
Output:

1

Input: (4, 4)
Output:

4444
4  4
4  4
4444

Input: (27, 1)
Output:

271271271271271271271271271

Input: (1, 17)
Output:

1
1
7
1
1
7
1
1
7
1
1
7
1
1
7
1
1

Input: (12, 34):
Output:

123412341234
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
432143214321

Giriş ve çıkışı makul bir biçimde alabilirsiniz ve standart boşluklar yasaklanmıştır. Bu kod golf olduğundan, bayttaki en kısa cevap kazanır!



Deseni sol üst köşeden saat yönünde başlatmalı mıyım?
Leaky Nun

@LeakyNun Evet, bu gerekli.
James

Eğer a1'dir sol duvar veya sağ duvar nedir?
Leaky Nun

7
İlk örnek yanlış değil mi? (3,5) 3 geniş ve 5 uzunluğunda olmalıdır
Brian

Yanıtlar:



4

C #, 301 bayt

Burada yapılabilecek çok daha fazla golf olduğundan eminim ama işe yarayan bir çözüm bulduğum için mutluyum.

Sonuçta yanlış sırada bir hata buldum, lanet olsun!

a=>b=>{var s=new string[b];int i=4,c=b-2,k=a;var t="";for(;i++<2*(a+b);)t+=t.EndsWith(a+"")?b:a;s[0]=t.Substring(0,a);if(b>2){for(i=0;++i<b-1;)s[i]=(a<2?t.Substring(1,c):t.Substring(2*a+c))[c-i]+(a>1?new string(' ',a-2)+t.Substring(a,c)[i-1]:"");for(;--k>=0;)s[b-1]+=t.Substring(a+c,a)[k];}return s;};

Eski versiyon: 280 bayt

a=>b=>{var s=new string[b];int i=4,c=b-2;var t="";for(;i++<2*(a+b);)t+=t.EndsWith(a+"")?b:a;s[0]=t.Substring(0,a);if(b>2){for(i=0;++i<b-1;)s[i]=(a<2?t.Substring(1,c):t.Substring(2*a+c))[c-i]+(a>1?new string(' ',a-2)+t.Substring(a,c)[i-1]:"");s[b-1]=t.Substring(a+c,a);}return s;};

2

Python 2, 199 bayt

w,h=input()
s=(`w`+`h`)*w*h
r=[s[:w]]+[[" "for i in[0]*w]for j in[0]*(h-2)]+[s[w+h-2:2*w+h-2][::-1]]*(h>1)
for y in range(1,h-1):r[y][w-1],r[y][0]=s[w+y-1],s[w+h+w-2-y]
print"\n".join(map("".join,r))

2

Yakut, 128 bayt

->w,h{s="%d%d"%[w,h]*q=w+h;a=[s[0,w]];(h-2).times{|i|a<<(s[2*q-5-i].ljust(w-1)+s[w+i,1])[-w,w]};puts a,h>1?(s[q-2,w].reverse):p}

Yükseklik 1 ise sondaki satır sonunu verir.

Ideone bağlantısı: https://ideone.com/96WYHt


1
Sen yapabilirsin [w,h]*""yerine "%d%d"%[w,h]4 bayt için ve parantez içine gerekmez s[q-2,w].reverse, ama sonra sonra boşluk gerekir :, bu yüzden -1 byte.
Ürdün

2

JavaScript, 213 212 202

c=>a=>{for(a=$=a,c=_=c,l=c*a*2,b=0,s=Array(l+1).join(c+""+a),O=W=s.substr(0,a),W=W.substr(0,a-2).replace(/./g," ");--_;)O+="\n"+s[l-c+_]+W+s[$++];return O+"\n"+[...s.substr(l-a-c+1,a)].reverse().join``}

Elbette iyileştirme için yer var.

Edit: TheLethalCoder sayesinde bir bayt kaydetti


Sanırım `${c}${a}`.repeat(l+1)bir bayt kurtarabilir.
Neil

Oh, ' W=W.substr(0,a-2).replace(/./g," ")aynı değil W=" ".repeat(a-2)mi? (Kodunuz gerçekten işe yarıyor a=1mu?)
Neil

2

C, 311 bayt

char s[5];sprintf(s,"%d%d",a, b);int z=strlen(s);int i=0;while(i<a){printf("%c",s[i++%z]);}if(b>2){i=1;while(i<b-1){char r=s[(a+i-1)%z];char l=s[(2*a+2*b-i-4)%z];if(a>1){printf("\n%c%*c",l,a-1,r);}else{printf("\n%c",l);}i++;}}printf("\n");if(b>1){i=0;while(i<a){printf("%c",s[(2*a+b-i-3)%z]);i++;}printf("\n");}

Otomatik olarak eklenen kitaplıkları stdio.hve string.h.


2

JavaScript (ES6), 171 bayt

(w,h)=>[...Array(h)].map((_,i)=>i?++i<h?(w>1?s[p+p+1-i]+` `.repeat(w-2):``)+s[w+i-2]:[...s.substr(p,w)].reverse().join``:s.slice(0,w),s=`${w}${h}`.repeat(p=w+h-2)).join`\n`

Burada \ngerçek satırsonu karakterini temsil eder. Tekrarlanan bir rakam dizesi oluşturur, ardından hangi satırda olduğumuza bağlı olarak neyi birleştireceğimize karar verir; üst sıra sadece tekrarlanan sayı dizisinin ilk dilimi, alt sıra (varsa) dizenin ortasından tersine çevrilmiş bir dilim iken, müdahale eden satırlar dizenin diğer kısımlarından alınan karakterler kullanılarak oluşturulur.


Sen değiştirerek Currying kullanabilirsiniz (w,h)=>için w=>h=>bir byte kaydetmek
TheLethalCoder

0

TSQL, 291 bayt

golfed:

DECLARE @ INT=5,@2 INT=4

,@t INT,@z varchar(max)SELECT @t=iif(@*@2=1,1,(@+@2)*2-4),@z=left(replicate(concat(@,@2),99),@t)v:PRINT iif(len(@z)=@t,left(@z,@),iif(len(@z)>@,right(@z,1)+isnull(space(@-2)+left(@z,1),''),reverse(@z)))SET @z=iif(len(@z)=@t,stuff(@z,1,@,''),substring(@z,2,abs(len(@z)-2)))IF @<=len(@z)goto v

Ungolfed:

DECLARE @ INT=5,@2 INT=4

,@t INT,@z varchar(max)
SELECT @t=iif(@*@2=1,1,(@+@2)*2-4),@z=left(replicate(concat(@,@2),99),@t)

v:
  PRINT
    iif(len(@z)=@t,left(@z,@),iif(len(@z)>@,right(@z,1)
      +isnull(space(@-2)+left(@z,1),''),reverse(@z)))
  SET @z=iif(len(@z)=@t,stuff(@z,1,@,''),substring(@z,2,abs(len(@z)-2)))
IF @<=len(@z)goto v

Vaktini boşa harcamak


0

Piton 3, 155 148 bayt

7 bayt daha kapalı:

p=print
def f(w,h):
 s=((str(w)+str(h))*w*h)[:2*w+2*h-4or 1];p(s[:w])
 for i in range(h-2):p(['',s[-i-1]][w>1]+' '*(w-2)+s[w+i])
 p(s[1-h:1-h-w:-1])

İkame edilmiş 2*w+2*h-4or 1için max(1,2*w+2*h-4)ve ['',s[-i-1]][w>1]için (s[-i-1]if w>1else'').

Önceki sürüm:

p=print
def f(w,h):
 s=((str(w)+str(h))*w*h)[:max(1,2*w+2*h-4)];p(s[:w])
 for i in range(h-2):p((s[-i-1]if w>1else'')+' '*(w-2)+s[w+i])
 p(s[1-h:1-h-w:-1])
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.