代码高尔夫ABC:ASCII Box挑战赛


14

给定两个正整数'a'和'b',输出一个ascii-art“ box”,它是一个字符宽而b个字符高的字符。例如,使用“ 4”和“ 6”:

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

简单吧?这是一个转折点:框的边框必须是交替的“ a”和“ b”字符​​。此操作从左上角开始,并以顺时针螺旋线继续。例如,前面的示例4和6应该是

4646
6  4
4  6
6  4
4  6
6464

A和B 可以是两位数字。例如,输入“ 10”和“ 3”应输出以下内容:

1031031031
1        0
3013013013

为了使输出保持相对较小,您不必支持三个或更多数字。同样,由于输入被限制为正数整数,因此“ 0”是无效输入,您不必处理。

这是更多测试用例:

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

您可以采用任何合理的格式进行输入和输出,并且禁止标准漏洞。由于这是代码高尔夫球,因此以字节为单位的最短答案会胜出!



我是否必须顺时针从左上角开始图案?
Leaky Nun

@LeakyNun是的,这是必需的。
詹姆斯,

如果a是1,是左墙还是右墙?
Leaky Nun

7
第一个例子不对吗?(3,5)应该为3宽5高
布赖恩

Answers:


4

Pyth65 51字节

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

在线尝试!


4

C#,301个字节

我敢肯定,这里可以做更多的高尔夫运动,但是我很高兴能找到有效的解决方案。

我发现了一个错误,其底线顺序错误,该死!

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

旧版本:280个字节

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字节

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个字节

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

如果height为1,则输出尾随换行符。

Ideone链接:https ://ideone.com/96WYHt


1
您可以[w,h]*""代替"%d%d"%[w,h]4个字节来执行操作,并且不需要在周围加上括号s[q-2,w].reverse,但是在:-1字节之后需要一个空格。
约旦

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

当然还有改进的空间。

编辑:感谢TheLethalCoder保存了一个字节


我想`${c}${a}`.repeat(l+1)可以为您节省一个字节。
尼尔

哦,和不W=W.substr(0,a-2).replace(/./g," ")一样W=" ".repeat(a-2)吗?(您的代码是否真正起作用a=1?)
Neil

2

C,311字节

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

使用自动包含的库stdio.hstring.h


2

JavaScript(ES6),171字节

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

其中\n代表文字换行符。创建一个重复的数字字符串,然后根据我们所在的行来决定要连接的内容。顶行只是重复数字字符串的初始片段,底行(如果有)是从字符串中间的反向片段,而中间行则是使用从字符串其他部分获取的字符建立的。


您可以通过更改(w,h)=>w=>h=>保存字节来使用currying
TheLethalCoder '16

0

TSQL,291个字节

打高尔夫球:

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

取消高尔夫:

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

小提琴


0

Python 3中,155个 148字节

打了另外7个字节:

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

替补2*w+2*h-4or 1max(1,2*w+2*h-4)['',s[-i-1]][w>1](s[-i-1]if w>1else'')

先前版本:

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])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.