알파벳을 나선!


13

다음 문자열을보십시오. 패턴을 알 수 있습니까?

아베 노프
DC GQI
MHRJ
LKJI SK
DTL
CUM
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

일부 사람들이 알 수 있듯이, 기본적으로 행 / 열 사이의 거리가 1 공백 / 개행으로 점차 증가하는 알파벳의 나선입니다.

엄격한 정의

  • 카운터 c 가 있는데, 처음에는 0입니다.
  • 알파벳 의 첫 c + 1 자를 왼쪽에서 오른쪽으로 씁니다 A.
  • 그런 다음 위에서 아래로 (c + 1) (c + 2) / 2 자 (add B) : AB.

  • 왼쪽에서 오른쪽으로 다음 (c + 1) (c + 2) / 2 (추가 C) :

    AB
     C
    
  • 그리고 아래에서 위로, 다음 c + 1 문자 (추가 D) :

    AB
    DC
    
  • 사이클의 끝에 도달했습니다. 따라서 c (1이 됨)를 증가시킵니다 . 그런 다음 첫 번째 단계부터 다시 시작합니다. 단, 차이점 은 알파벳 의 첫 번째 c + 1 자를 사용하는 대신 이주기의 마지막 요소에서 시작 하여 다음 c + 1을 사용한다는 것입니다 ( D이 경우 EFG...)로 계속 진행 합니다. Z에 도달 하면 에서 순환됩니다 A.

직무

정수 N (1 인덱싱의 경우 양수 또는 0 인덱싱의 경우 음수가 아님)이 주어지면 나선 의 첫 번째 N 사이클을 출력합니다 .

규칙

  • 소문자 나 대문자 알파벳을 사용할 수 있지만, 선택은 일관되어야합니다 (그중 하나만 사용하십시오, 혼합은 허용되지 않습니다).

  • 이러한 허점 은 기본적으로 금지되어 있지만 모든 프로그래밍 언어 에서 표준 방법 중 하나를 통해 입력을 받고 출력을 제공 할 수 있습니다 .

  • 허용 가능한 출력 형식 : 여러 줄 문자열, 줄을 나타내는 문자열 목록, 여러 문자 목록을 포함하는 목록, 각각 한 줄을 나타내는 것 또는 기타 적절하다고 생각되는 것. 첫 번째 형식을 선택하지 않으면 예쁘게 인쇄 된 코드 버전을 포함시키는 것이 좋습니다.

  • 이것은 이므로 요구 사항을 충족시키는 가장 짧은 코드 (바이트 단위) (각 언어로)가 승리합니다!


테스트 사례

입력 정수는 줄 바꿈을 통해 해당 출력으로 분리되고 테스트는 대시를 사용하여 분리됩니다. 이것들은 1 인덱스입니다.

1

AB
DC

--------

2

아베 프
DC G
MH
LKJI 

--------

삼

아베노
DC GQ
MHR
LKJI S
DT
CU
BAZYXWV

-------

4

아베 노프
DC GQI
MHRJ
LKJI SK
DTL
CUM
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
DC GQIK
MHRJL
LKJI SKM
DTLN
CUMO
BAZYXWV NP
EOQ
DPR
CQS
BAZYXWVUTSR T
RU
QV
PW
소
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
MHRJLZ
LKJI SKMA
DTLNB
쿠모
BAZYXWV NPD
EOQE
DPRF
CQSG
BAZYXWVUTSR TH
루이
QVJ
PWK
OXL
NMLKJIHGFEDCBAZY M
SN
RO
QP
PQ
또는 
NMLKJIHGFEDCBAZYXWVUTS

테스트 케이스는 n = 1,2,3,5,6이어야합니다.
TFeld

답변:


9

, 31 바이트

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 참고 : 디버 보시 파이어는 어떤 이유로 후행 구분 기호를 출력합니다. 설명:

F⮌…⁰NB

상자를 큰 순서에서 작은 순서로 그립니다.

⁺²⊘×ι⁺³ι

상자의 크기를 계산하십시오.

⭆α§α⁺λ

회전 된 알파벳을 사용하여 상자의 테두리를 그립니다.

÷×ι⊕×ι⁺⁹⊗ι⁶

상자 왼쪽 상단에 표시 될 문자를 계산합니다 (0 색인).


6

파이썬 2 , 176 바이트

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

온라인으로 사용해보십시오!

설명

올바른 크기의 빈 공간 배열을 만든 다음 왼쪽 상단에서 시작하여 다음과 같이 이동하십시오.

  • 1 단계 →, 1 단계 ↓, 1 단계 ←, 1 단계 ↑

  • 3 단계 →, 3 단계 ↓, 3 단계 ←, 3 단계 ↑

  • 6 단계 →, 6 단계 ↓, 6 단계 ←, 6 단계 ↑

  • 10 단계 →, 10 단계 ↓, 10 단계 ←, 10 단계 ↑

빈 셀을 찾을 때마다 문자를 넣고 알파벳의 다음 문자로 순환합니다.

코드 s%4에서 방향은 (→ ↓ ← ↑)이며 여러 번이 단계를 수행합니다.

TriangularNumber(s/4) = s/4*(s/4+1)/2.

골프 기회

  • 지도하는 짧은 방법이 s%41,0,-1,0이상이 abs(2-s%4)-1?

  • 지도하는 짧은 방법이 s%40,1,0,-1이상이 s%2-s%4/3*2?

크레딧

  • Xcoder는 바이트를 저장했습니다.

2
+1와, 정말 훌륭합니다. 작동 방식을 알아 내기 위해 시간이 걸렸습니다. 나는에 대한 속기를 발견 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 바이트 ). 그래도 골프를 탈 수 있습니다
Mr. Xcoder

4

C,  305  281 바이트

@Mr에게 감사합니다. 4 바이트 절약을위한 Xcoder!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

온라인으로 사용해보십시오!


1
처음으로 #definefor for((실제로는 바이트를 절약)를 볼 수 있습니다. 나에게서 +1 :)
Kevin Cruijssen

2

파이썬 2 , 262 260 254 245 바이트

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

온라인으로 사용해보십시오!

더 많은 수학을 가진 새로운 방법!

문자리스트의리스트를 돌려줍니다.


구 버전:

파이썬 (2) , 322 (321) 308 298 바이트

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

온라인으로 사용해보십시오!


@ Mr.Xcoder이 경우에 .49충분 하지 않습니까 , 아니면 매우 큰 입력에 실패합니까?
Kevin Cruijssen

1
@KevinCruijssen 확실하지는 않지만 260 바이트 입니다.
Mr. Xcoder

파이썬을 잘 모르지만 i<j4 번 사용하기 때문에에 대한 인라인 변수를 만들 수 있습니까?
Kevin Cruijssen

1
+1==1+내 이전 방법에서 골프 245 바이트
Mr. Xcoder

1

Perl 5, 177 +2 (-nl) = 179 바이트

Xcali 덕분에 2 바이트 절약

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

온라인으로 사용해보십시오


-1대신을 사용하여 바이트를 저장할 수 있습니다 $#O. $,대신에 $n를 사용 하면 이전 for에 공간을 제거 할 수 있습니다 .$_.=$"x$n for@O
Xcali

감사합니다, 나는 다른 개선을 찾고 있었지만 지금은 찾을 수 없습니다
Nahuel Fouilleul

정규식을 변경하는 2 이상의 바이트 저장 s/ (?=\S)/n/es/.*\K /n/e
나우 Fouilleul

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.