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!



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!


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

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

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


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


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.


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.


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


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])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.