코드 골프 ABC : ASCII 박스 챌린지


14

이 양 개의 정수, 'a'와 'b', 출력 아스키 예술 "상자"을 감안할 때 문자 폭 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 그렇습니다.
James

경우 a1은 왼쪽 벽이나 오른쪽 벽인가?
Leaky Nun

7
첫 번째 예가 잘못 되었습니까? (3,5) 넓이 3와 키 5가되어야합니다
Brian

답변:



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

파이썬 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

루비, 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}

높이가 1 인 경우 후행 줄 바꿈을 출력합니다.

이데 오네 링크 : https://ideone.com/96WYHt


1
4 바이트 [w,h]*""대신 대신 할 수 "%d%d"%[w,h]있으며 괄호가 필요하지 않지만, 뒤에 -1 바이트 s[q-2,w].reverse뒤에 공백이 필요합니다 :.
Jordan

2

자바 스크립트, 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)바이트를 절약 할 수 있다고 생각 합니다.
Neil

아, 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.h및을 사용합니다 string.h.


2

자바 스크립트 (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=>
TheLethalCoder

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

파이썬 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 1되었습니다 .max(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])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.