알파벳을 나선으로 굴 리세요

주어진 경우 n, 필요에 따라 반복적으로 n라틴 알파벳 ABCDEFGHIJKLMNOPQRSTUVWXYZ으로 구성된 나선 문자 를 인쇄 하는 프로그램이나 함수를 작성하십시오 . 이 나선은 알파벳을 앞으로 만 통과해야합니다.

나선은 알파벳을 앞뒤로 통과하지만 나선은 일정하지만 알파벳 나선 과 관련 이 있습니다.

테스트 사례

4   AB
    DC

40   UVWXYZ
     TGHIJA
    NSFABKB
    MREDCLC
    LQPONMD
    KJIHGFE

0

10  GHIJ
    FAB
    EDC

1000    UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
        TGHIJKLMNOPQRSTUVWXYZABCDEFGHIJA
        SFABCDEFGHIJKLMNOPQRSTUVWXYZABKB
        REZCDEFGHIJKLMNOPQRSTUVWXYZABCLC
        QDYBMNOPQRSTUVWXYZABCDEFGHIJCDMD
        PCXALEFGHIJKLMNOPQRSTUVWXYZKDENE
        OBWZKDEFGHIJKLMNOPQRSTUVWXALEFOF
        NAVYJCDMNOPQRSTUVWXYZABCDYBMFGPG
        MZUXIBCLCDEFGHIJKLMNOPQREZCNGHQH
        LYTWHABKBABCDEFGHIJKLMNSFADOHIRI
        KXSVGZAJAZGHIJKLMNOPQROTGBEPIJSJ
        JWRUFYZIZYFUVWXYZABCDSPUHCFQJKTK
        IVQTEXYHYXETQRSTUVWXETQVIDGRKLUL
        HUPSDWXGXWDSPUVWXYZYFURWJEHSLMVM
        GTORCVWFWVCROTGHIJAZGVSXKFITMNWN
        FSNQBUVEVUBQNSFABKBAHWTYLGJUNOXO
        ERMPATUDUTAPMREDCLCBIXUZMHKVOPYP
        DQLOZSTCTSZOLQPONMDCJYVANILWPQZQ
        CPKNYRSBSRYNKJIHGFEDKZWBOJMXQRAR
        BOJMXQRARQXMLKJIHGFELAXCPKNYRSBS
        ANILWPQZQPWVUTSRQPONMBYDQLOZSTCT
        ZMHKVOPYPONMLKJIHGFEDCZERMPATUDU
        YLGJUNOXONMLKJIHGFEDCBAFSNQBUVEV
        XKFITMNWVUTSRQPONMLKJIHGTORCVWFW
        WJEHSLMLKJIHGFEDCBAZYXWVUPSDWXGX
        VIDGRKJIHGFEDCBAZYXWVUTSRQTEXYHY
        UHCFQPONMLKJIHGFEDCBAZYXWVUFYZIZ
        TGBEDCBAZYXWVUTSRQPONMLKJIHGZAJA
        SFAZYXWVUTSRQPONMLKJIHGFEDCBABKB
        REDCBAZYXWVUTSRQPONMLKJIHGFEDCLC
        QPONMLKJIHGFEDCBAZYXWVUTSRQPONMD
                                LKJIHGFE

규칙

  • 입력은 음이 아닌 정수 0 <= n <= 1000이지만 코드는 이론적으로 음이 아닌 정수를 처리해야합니다.
  • 출력 형식은 필요한 경우 구분 기호와 함께 임의 형식으로 표시 될 수 있습니다.
  • 회전과 반사는 동일합니다.
  • 알파벳은 대문자이거나 소문자 일 수 있습니다.
  • 나선의 빈 공간은 알파벳이 아닌 널로 채워질 수 있습니다.
  • 나선 자체는 어떤 모양이든 적합 할 수 있습니다. 직사각형 나선은 ASCII 솔루션에서 가장 잘 작동하지만 그래픽 솔루션은 원형 나선에서 더 짧을 수 있습니다.
  • 선행 및 후행 공백과 줄 바꾸기가 허용됩니다.
  • 이것은 코드 골프입니다. 바이트 (또는 동등한)의 최단 답변이 이깁니다.

언제나 그렇듯이 명확하지 않거나 잘못된 것이 있으면 의견에 알려주십시오. 행운과 좋은 골프!



답변

로고, 129 87 바이트

기능으로 구현 된 그래픽 솔루션

이것은 Calormen.com의 로고 인터프리터 에 구축되었습니다 . 이 S함수는 문자 수를 매개 변수로 사용하여 나선형으로 그립니다. T기능은 나선형으로 회전하는 것을 방지하기 위해 문자를 똑바로 출력합니다. . 나는 글자 방향을 수정 하지 않는 것이 더 좋게 보이고 ( 42 바이트 골프를 쳤다 ) 결정했습니다. 또한 바이트 수를 변경하지 않은 간격을 강화했습니다. 실제로 알파벳을 말아 올리면 어쨌든 더 비슷할 것입니다.

업데이트 된 버전 (문자 롤)

TO S:r
PU IF:r[REPEAT:r[LABEL CHAR((REPCOUNT-1)%26)+65
RT 99/SQRT(REPCOUNT)FD 12]]END

기도

호출은 다음과 S 반복을

샘플 출력

S 1000

이전 버전 (문자는 항상 직립)

TO T:l:h
RT:h
LABEL CHAR(:l%26)+65
LT:h
END
TO S:r
PU IF:r[REPEAT:r[T REPCOUNT-1 90-HEADING
RT 95/SQRT(REPCOUNT)FD 15]]END

공간을 절약하기 위해 이전 출력이 제거되었습니다. 여기를 참조하십시오 .


답변

자바 (ES6) 203 201 바이트

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

데모

아래 데모는 전체 페이지에서 실행하는 것이 좋습니다.

let f =

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

function draw(n) {
  document.getElementById('v').innerHTML = n;
  document.getElementById('o').innerHTML = f(n);
}
draw(500);
pre {font-size:10px}
<input type="range" min="1" max="1000" oninput="draw(this.value)" style="width:500px"><span id="v"></span><pre id="o"></pre>

답변

간격에 따라 R, 46 또는 51 바이트

s=1:scan();plot(s*sin(s),s*cos(s),pch=letters)

플롯의 업데이트 된 버전 : 회색 나선형은 기본적으로 플롯되지 않지만 문자가 실제로 나선형에 있음을 나타 내기 위해 추가했습니다.

나선은 일정한 간격이 아니므로 이것이 좋기를 바랍니다. 일정한 간격이 필요한 경우 s=(1:scan())^.5대신 시작 하여 총계에 5 바이트를 추가하십시오. 그런 다음 출력은 다음과 같습니다 (n = 150).


답변

파이썬 3.5 180 157 152 147 141 바이트

Sherlock9로 인해 -6

r=[[]]
for x in range(int(input())):
 r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
print(*map(''.join,r),sep='\n')

Kap으로 인해 -5.

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

수정 된 솔루션, Python 3.x :

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

이전 솔루션 :

R=range
def g(n):
 r=[]
 for x,f in zip(R(n),(j<1for i in R(n)for j in R(i//2+1))):
  if f:r=list(zip(*r[::-1]))+[[]]
  r[-1].append(chr(x%26+65))
 print(*map(''.join,r),sep='\n')

설명

r나선을 포함하는 목록의 목록입니다. 기본 아이디어는 새로운 문자가 나선의 맨 아래 줄에 추가되는 것입니다 ( r[-1].append(chr(x%26+65))). 맨 아래 줄이 채워지면 나선이 시계 방향으로 90도 회전되고 맨 아래에 새 빈 줄이 추가됩니다 ( r = list(zip(*r[::-1]))+[[]]).

요령은 나선을 언제 회전 시킬지를 알아내는 것입니다. 첫 번째 솔루션에서 생성기 (j<1for i in R(n)for j in R(i//2+1))는 나선 회전시기를 알려주는 일련의 True / False 값을 생성합니다. 수정 된 솔루션에서 r초기화 방법을 변경했습니다 . 이제 맨 아래 줄의 길이가 맨 위 줄의 길이와 같으면 나선을 회전해야합니다.


답변

MATL , 21 18 바이트

X^Xk1YL1Y2y)wG>~*c

입력 0이 오류와 함께 종료됩니다 ( 기본적으로 허용됨 ).

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

설명

X^Xk   % Input n implicitly. Take square root and round up
1YL    % Square matrix of that size containing a spiral of numbers
1Y2    % Predefined literal: string "AB···YZ"
y      % Duplicate the spiral matrix onto the top
)      % Apply as an index inth the string. Gives 2D array of chars
w      % Swap: move copy of the spiral matrix to top
G>~    % Set entries that exceed the input to 0, and the rest to 1
*      % Multiply. This makes unwanted entries equal to 0
c      % Convert to char. 0 is shown as a space. Display implicitly

답변

파이썬 2, 84 82 바이트

거북이를 다시 사용하고 있습니다. 너무 재미 있어요! :디

from turtle import*
up()
for i in range(input()):write(chr(i%26+65));rt(9);fd(9+i)

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

불행히도 Trinket.io는 매우 작은 캔버스를 가지고 있습니다. 나는 변경 9+i하는 9+i/9화면 캡쳐 이미지를, 그래서 출력의 이상에 맞는 것을 목적으로 거북이의 시작 지점을 조정 :


답변

Pyth, 32 바이트

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y

직사각형 소문자 ASCII 나선을 인쇄하는 프로그램입니다. 입력에 따라 선행 또는 후행 공백의 한 행 또는 열이 존재할 수 있습니다.

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

작동 원리

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y  Program. Input: Q
  @Q2                             Yield sqrt(Q)
JS                                Unary range, J=[1, 2, 3, ..., floor(sqrt(q))]
                         .iJJ     Interleave J with itself, yielding [1, 1, 2, 2, 3, 3, ...
                                  floor(sqrt(Q)), floor(sqrt(Q))]
                    .u+NY    Z    Cumulatively reduce by addition with base case 0,
                                  yielding [0, 1, 2, 4, 6, 9, 12, 16, 20...]
                *GQ               Repeat the lower-case alphabet Q times
               <   Q              Truncate to legth Q
              c                   Split the above at the indices in the above list
      u                       ]Y  Reduce the above, with base case [[]]:
          _G                       Reverse
        .t  )                      Transpose
       +     H                     Add the next arm of the spiral
     j                            Join on newlines and implicitly print