Code golf ABC's: Thử thách hộp ASCII


14

Cho hai số nguyên dương, 'a' và 'b', xuất ra một "hộp" ascii-art có chiều rộng bằng một ký tự và b cao. Ví dụ: với '4' và '6':

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

Đơn giản phải không? Đây là khuynh hướng: Đường viền của hộp phải là các ký tự của "a" và "b" xen kẽ. Điều này bắt đầu ở góc trên cùng bên trái, và tiếp tục theo hình xoắn ốc theo chiều kim đồng hồ. Ví dụ, ví dụ trước với 4 và 6 phải là

4646
6  4
4  6
6  4
4  6
6464

A và B có thể là số có hai chữ số. Ví dụ: đầu vào "10" và "3" sẽ xuất ra điều này:

1031031031
1        0
3013013013

Để giữ đầu ra tương đối nhỏ, bạn không phải hỗ trợ ba hoặc nhiều chữ số. Ngoài ra, vì các đầu vào bị giới hạn ở các số nguyên dương, '0' là đầu vào không hợp lệ, mà bạn không phải xử lý.

Dưới đây là một số trường hợp thử nghiệm:

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

Bạn có thể lấy đầu vào và đầu ra ở bất kỳ định dạng hợp lý nào và các lỗ hổng tiêu chuẩn đều bị cấm. Vì đây là môn đánh gôn, câu trả lời ngắn nhất bằng byte sẽ thắng!



Tôi phải bắt đầu mô hình từ góc trên cùng bên trái theo chiều kim đồng hồ?
Nữ tu bị rò rỉ

@LeakyNun Vâng, đó là cần thiết.
DJMcMayhem

Nếu alà 1 thì nó là tường bên trái hay tường bên phải?
Nữ tu bị rò rỉ

7
Không phải là ví dụ đầu tiên sai? (3,5) phải rộng 3 và 5 cao
Brian

Câu trả lời:



4

C #, 301 byte

Tôi chắc chắn có rất nhiều môn đánh gôn có thể được thực hiện ở đây nhưng tôi rất vui vì tôi đã có một giải pháp hiệu quả.

Tôi tìm thấy một lỗi trong đó dòng dưới cùng là sai thứ tự, chết tiệt!

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

Phiên bản cũ: 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}

Đầu ra theo dõi dòng mới nếu chiều cao là 1.

Liên kết Ideone: https://ideone.com/96WYHt


1
Bạn có thể làm [w,h]*""thay vì "%d%d"%[w,h]4 byte và bạn không cần dấu ngoặc đơn xung quanh s[q-2,w].reverse, nhưng sau đó bạn sẽ cần một khoảng trắng sau :, do đó, 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``}

Chắc chắn có chỗ để cải thiện.

Chỉnh sửa: Đã lưu một byte nhờ TheLethalCoder


Tôi nghĩ rằng `${c}${a}`.repeat(l+1)có thể giúp bạn tiết kiệm một byte.
Neil

Ồ, và không ' W=W.substr(0,a-2).replace(/./g," ")giống như W=" ".repeat(a-2)? (Mã của bạn có thực sự hoạt động a=1không?)
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");}

Sử dụng tự động bao gồm các thư viện stdio.hstring.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`

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Tạo một chuỗi chữ số lặp đi lặp lại, sau đó quyết định nối chuỗi dựa trên hàng nào chúng ta đang ở; hàng trên cùng chỉ là lát cắt ban đầu của chuỗi chữ số lặp lại, hàng dưới cùng (nếu có) là một lát đảo ngược từ giữa chuỗi, trong khi các hàng xen kẽ được xây dựng bằng cách sử dụng các ký tự được lấy từ các phần khác của chuỗi.


Bạn có thể sử dụng currying bằng cách thay đổi (w,h)=>để w=>h=>tiết kiệm một byte
TheLethalCoder

0

TSQL, 291 byte

Chơi gôn

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

Ung dung:

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

Vĩ cầm


0

Python 3, 155 148 byte

Chơi thêm 7 byte nữa:

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

Thay thế 2*w+2*h-4or 1cho max(1,2*w+2*h-4)['',s[-i-1]][w>1]cho (s[-i-1]if w>1else'').

Phiên bản trước:

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])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.