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


22

주어진 경우 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 솔루션에서 가장 잘 작동하지만 그래픽 솔루션은 원형 나선에서 더 짧을 수 있습니다.
  • 선행 및 후행 공백과 줄 바꾸기가 허용됩니다.
  • 이것은 코드 골프입니다. 바이트 (또는 동등한)의 최단 답변이 이깁니다.

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


대부분의 편집자들은 긴 문자열을 출력 할 수 없습니다
t-clausen.dk

@ t-clausen.dk 표준 부호있는 32 비트 정수 최대 값을 사용했습니다. 상한에 대한 더 나은 제안이 있으시면 편집 해 드리겠습니다.
Sherlock9

멋지고 까다로운 :-)
Joffan

답변:


12

로고, 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

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

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


내가 수학을 어떻게 만들 었는지 묻지 마십시오. 온라인에서 수식을 검색하려고 시도했지만 회전 각도를 일정하게 유지하고 세그먼트 길이를 늘려 문제를 해결했지만 세그먼트 길이를 일정하게 유지하고 각도를 변경하고 싶었습니다. 시련과 오류는 안정된 공식을 초래 한 것으로 보인다. 를 조정하면 95나선의 조임이 변경되고을 변경 15하면 문자의 선형 간격이 조정됩니다.
GuitarPicker

9

자바 (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`
`}

데모

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


7

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

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

여기에 이미지 설명을 입력하십시오

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

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

여기에 이미지 설명을 입력하십시오


3
당신의 나선 간격은 전적으로 당신에게 달려 있습니다. 그래도 두 가지 제안이 있습니다. 1) 두 번째 나선형을 유지하십시오. 덜 골프더라도 답변에 추가합니다. 2) 첫 번째 나선형의 이미지에서 문자를 통과하는 나선형 선을 그릴 수 있습니까? 알파벳 나선을 더 선명하게 만들기 위해서입니다.
Sherlock9

6

파이썬 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초기화 방법을 변경했습니다 . 이제 맨 아래 줄의 길이가 맨 위 줄의 길이와 같으면 나선을 회전해야합니다.


당신은 대체 할 수 if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]5 저장 바이트.
R. Kap

range한 번만 사용하므로 R바이트를 저장하기 위해 제거 할 수 있습니다 . 의 답변을 전체 프로그램으로 변환하여 바이트를 절약 할 수도 있지만의 사용을 유지 [*zip(*r[::-1]),[]]하려면을 사용해야 range(int(input()))합니다.
Sherlock9

또한 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)]마지막 줄이 첫 번째 줄보다 크거나 같은지 확인하기 때문입니다.
Sherlock9

두 가지 : 1) 명령문을 세미콜론으로 분리하여 for 루프를 한 줄 길게 만들 수 있습니다. 그리고 2) n이 버전에서 정의하지 않았습니다 . int(input())함수에서 백업 을 사용 하거나 랩인 해야 합니다.
Sherlock9

for루프 압축에서 2 바이트 :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)]
Sherlock9

5

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

5

파이썬 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화면 캡쳐 이미지를, 그래서 출력의 이상에 맞는 것을 목적으로 거북이의 시작 지점을 조정 :

산출


: 당신이 가져 오기에서 공간을 제거하는 경우에서 한 바이트 from turtle import*에서 변경에서 다른를 whilefor i in range(input())
Sherlock9

4

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

3

TSQL, 386 362 358 306 바이트

TSQL에는 텍스트를 회전 할 수있는 방법이 없습니다. 이 스크립트는 A부터 시작하여 다음 문자를 배치 할 방향을 계산합니다. (오른쪽, 아래쪽, 왼쪽, 왼쪽, 왼쪽, 위, 위, 오른쪽 ...)

스크립트는 최대 7744자를 처리 할 수 ​​있습니다.

골프 :

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1);WITH C as(SELECT 0i,@/2a,@/2b UNION ALL SELECT i+1,a+z/2,b+z%2FROM(SELECT*,IIF(a>@/2*2-b,IIF(a<b,2,-1),IIF(a>b,-2,1))z FROM C)t WHERE i<@z-1)SELECT @o=STUFF(@o,@*a-@+b,1,char(i%26+65))FROM c OPTION(maxrecursion 0)PRINT @o

언 골프 드 :

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)
DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1)

;WITH C as
(
  SELECT
    0i,@/2a,@/2b
  UNION ALL
  SELECT
    i+1,a+z/2,b+z%2
    FROM 
      (SELECT*,
         IIF(a>@/2*2-b,
           IIF(a<b,2,-1),
             IIF(a>b,-2,1))z FROM C)t
  WHERE
    i<@z-1
)
SELECT 
  @o=STUFF(@o,@*a-@+b,1,char(i%26+65))
FROM c  
OPTION(maxrecursion 0)

PRINT @o

깡깡이


2

파이썬 2, 243 바이트

r=range(input())
a=[1j**int((4*i+1)**.5)for i in r]
b=[map(int,(-sum(a[:i]).real,sum(a[:i]).imag))for i in r]
c,d=zip(*b)
for i in range(min(c),max(c)+1):print''.join([i,j]in b and chr(b.index([i,j])%26+65)or' 'for j in range(min(d),max(d)+1))

무시 했어!


0

PHP , 219 바이트

for($q=ceil(sqrt($a=$argn))**2,$d=1,$x=$y=$w=0;$i<$q;$i++,${yx[$w%2]}+=[-1,1][$d&1],$i%$d?:$d+=$w++&1)$e[$c[]=$x-!($a&1)][$l[]=$y]=$i<$a?chr(65+$i%26):" ";for($k=min($c);$e[$k];print join($e[+$k++])."\n")ksort($e[+$k]);

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

PHP, 260 바이트

구 버전

for($y=$x=$d=$i=0;$i<$m=ceil(sqrt($n=$argv[1]))**2;$i++){$a[$y][$x]=$i<$n?chr($i%26+65):" ";$d=$y==$x&$y<1?0:(1-$y==$x&$x>0?1:($y==$x&$y>0?2:($y==-$x&$x<0?3:$d)));$d>2?$y--:($d>1?$x--:($d>0?$y++:$x++));}ksort($a);foreach($a as$r){ksort($r);echo join($r)."\n";}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.