Code golf ABC's: The ASCII Box Challenge

14

Mengingat dua bilangan bulat positif, 'a' dan 'b', keluaran sebuah ascii-seni "kotak" yang merupakan karakter lebar dan b karakter tinggi. Misalnya, dengan '4' dan '6':

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

Sederhana bukan? Berikut ini twistnya: Batas kotak harus karakter "bergantian" dan "b". Ini dimulai di sudut kiri atas, dan berlanjut dalam spiral searah jarum jam. Misalnya, contoh sebelumnya dengan 4 dan 6 seharusnya

4646
6  4
4  6
6  4
4  6
6464

A dan B dapat berupa angka dua digit. Misalnya, input "10" dan "3" harus menampilkan ini:

1031031031
1        0
3013013013

Agar outputnya relatif kecil, Anda tidak harus mendukung tiga angka atau lebih. Juga, karena input dibatasi untuk bilangan bulat positif , '0' adalah input yang tidak valid, yang tidak harus Anda tangani.

Berikut adalah beberapa kasus uji lagi:

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

Anda dapat mengambil input dan output dalam format yang masuk akal, dan celah standar dilarang. Karena ini adalah kode-golf, jawaban tersingkat dalam byte menang!

DJMcMayhem
sumber
Terkait
DJMcMayhem
Haruskah saya memulai pola dari sudut kiri atas searah jarum jam?
Leaky Nun
@ LeakyNun Ya, itu perlu.
DJMcMayhem
Jika a1 apakah itu dinding kiri atau dinding kanan?
Leaky Nun
7
Bukankah contoh pertama salah? (3,5) harus selebar 3 dan 5 tinggi
Brian

Jawaban:

4

Pyth , 65 51 byte

juXGhHX @ GhHeH @ jkQ ~ hZ {s [+ L] 0UhQ + R] thQUeQ + L] teQ_UhQ + R] 0_UeQ) m *; hQeQ
AQjuXGhHX @ GhHeH @ jkQ ~ hZ {s [, L0G, RtGH_, LtHG_, R0H) m *; GH

Cobalah online!

Biarawati Bocor
sumber
4

C #, 301 byte

Saya yakin ada lebih banyak golf yang bisa dilakukan di sini tapi saya senang saya mendapat solusi yang berhasil.

Saya menemukan bug di mana intinya berada di urutan yang salah, sial!

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

Versi lama: 280 byte

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;};
TheLethalCoder
sumber
2

Python 2, 199 byte

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))
Loovjo
sumber
2

Ruby, 128 byte

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

Output membuntuti baris baru jika tinggi 1.

Tautan Ideone: https://ideone.com/96WYHt

Leibrug
sumber
1
Anda dapat melakukan [w,h]*""alih - alih "%d%d"%[w,h]untuk 4 byte, dan Anda tidak perlu tanda kurung di sekitar s[q-2,w].reverse, tetapi kemudian Anda akan membutuhkan spasi setelah :, jadi -1 byte.
Jordan
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``}

Tentunya memiliki ruang untuk perbaikan.

Sunting: Menyimpan satu byte berkat TheLethalCoder

pengguna2428118
sumber
Saya pikir `${c}${a}`.repeat(l+1)mungkin menghemat satu byte.
Neil
Oh, dan tidakkah W=W.substr(0,a-2).replace(/./g," ")sama dengan W=" ".repeat(a-2)? (Apakah kode Anda benar-benar berfungsi a=1?)
Neil
2

C, 311 byte

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

Menggunakan perpustakaan yang disertakan secara otomatis stdio.hdan string.h.

ncke
sumber
2

JavaScript (ES6), 171 byte

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

Dimana \nmewakili karakter baris baru literal. Membuat string digit berulang, kemudian memutuskan apa yang akan digabungkan berdasarkan pada baris mana kita berada; baris atas hanyalah irisan awal dari string digit yang diulang, baris bawah (jika ada) adalah irisan terbalik dari tengah-tengah string, sementara baris intervensi dibangun menggunakan karakter yang diambil dari bagian lain dari string.

Neil
sumber
Anda dapat menggunakan currying dengan mengubah (w,h)=>ke w=>h=>menyimpan byte
TheLethalCoder
0

TSQL, 291 byte

Golf:

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

Tidak Disatukan:

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

Biola

t-clausen.dk
sumber
0

Python 3, 155 148 byte

Bermain golf 7 byte lagi:

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

Digantikan 2*w+2*h-4or 1untuk max(1,2*w+2*h-4)dan ['',s[-i-1]][w>1]untuk (s[-i-1]if w>1else'').

Versi sebelumnya:

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