간격이 좋은 ASCII 나선


13

이 나선을 고려하십시오

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

중심에서 시작 :

  • 첫 번째 줄 (위쪽)은 3 자입니다.
  • 두 번째 줄의 문자 수는 같습니다 (3)
  • 다음으로 다음 두면에 두 개의 문자 (5)를 추가합니다.
  • 이 패턴은 두 변의 길이가 같으면 길이가 2 씩 증가합니다.

N 줄에 대해이 나선형을 생성하고 싶습니다.

  • 모든 언어로 작성하십시오.
  • 입력 / 인수 등은 나선의 줄 수입니다.
  • 각 줄은 이전 줄의 끝 문자로 시작합니다 (이전 줄의 시계 방향으로 90도 방향).
  • 나선의 요소가 정렬되어있는 한 각 줄 앞뒤에 얼마나 많은 공백이 있는지는 중요하지 않습니다.
  • 공백이 아닌 문자를 선택하여 나선을 그리려면 텍스트를 출력하십시오.
  • 가장 적은 바이트 수로이 작업을 시도하십시오.

테스트 사례 (해시를 출력으로 사용) :

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy "공백이 아닌 문자로 나선을 그리려면 텍스트를 출력하십시오." 네, 원하는대로
AJFaraday


3
초기 이미지는 *대신에 #있습니다. 기대 했습니까?
Wernisch

@Wernisch 도움이되는 출발점이 되었으나 오해의 소지가 있다고 생각합니다. 원하는 문자를 사용할 수 있습니다.
AJFaraday

답변:


11

05AB1E , 13 11 바이트

암호:

2 바이트를 절약 한 Emigna 에게 감사드립니다 !

LDÈ-Ì'#3Ý·Λ

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!

설명

나선형의 각 개별 모서리의 길이는 길이 3 으로 시작하여 두 단계마다 2 씩 점차 증가합니다.

3,3,5,5,7,7,9,

nn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

이것은 기본적으로 원하는 길이 목록을 제공합니다.

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

캔버스는 <length (s)> , <char (s)> , <direction (s)> 이라는 세 개의 매개 변수를 표시하는 함수로 작동합니다 . 길 찾기 매개 변수는이 경우 숫자 목록입니다. 지시 사항에 해당하는 숫자는 다음과 같습니다.

[70162543]

이 경우 [0, 2, 4, 6] 은 길 찾기 목록에 해당합니다 [↑, →, ↓, ←]. 캔버스는 길이 목록에서 검색된 각 길이를 반복하고 '#'문자를 사용하며 길 찾기 목록을 주기적으로 반복합니다.


0246S=3Ý·
Emigna 2016 년

@Emigna 아 그 생각하지 않았다, 감사합니다!
Adnan

6

파이썬 (2) , 176 (170) 165 161 157 바이트

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

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

반복적으로 : 나선형의 반복을 '정규'위치 (N = 3 또는 N = 7과 유사) g로 회전하고 n기존 행의 왼쪽에 2 개의 공백을 추가 한 다음 마지막 행을 대체하여 새 세그먼트를 추가하는 데 사용합니다. 모든 '#'s (N = 4 또는 N = 8과 비슷한 위치에 있음)를 사용하고 마지막으로 g다시 사용 하여 올바른 위치로 다시 회전시킵니다. 오히려 헹구고 반복하십시오.


4

, 16 15 14 바이트

↶FN«¶×#⁺³⊗÷ι²↷

@Neil 덕분에 -2 바이트 .

온라인으로 사용해보십시오 (자세한 내용) 또는 온라인으로 시도해보십시오 (순수) .

설명:

인쇄 방향은 기본적으로 오른쪽에 있으며 위로 시작하고 싶습니다. 따라서 시계 반대 방향으로 45도 회전합니다.

PivotLeft();
↶

그런 다음 i범위에서 반복 하십시오 [0, input).

For(InputNumber()){ ... }
FN« ...

한 줄 뒤로 이동하는 효과를 모방하기 위해 새 줄을 인쇄하십시오.

Print("\n");
¶

x현재 방향으로 "#" 회 인쇄합니다 .

Print(Times("#", ... ));
×# ...

위치 x: 3 + i // 2 * 2:

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

그리고 루프의 다음 반복을 위해 시계 방향으로 45도 회전합니다.

PivotRight();
↷

차콜에는 뒤로 이동하라는 명령이 없다고 생각합니까?
Emigna

@Emigna 확실하지 않지만 찾을 수 없습니다. 내가이 답변을 쓸 때 실제로 나 자신을 찾고있었습니다. 주어진 방향의 Move와 주어진 좌표의 Jump가 있지만 불행히도 MoveBack은 없습니다.
Kevin Cruijssen

1
⊗÷ι²보다 짧은 바이트 ⁻ι﹪ι²입니다. 또한 s \n앞에 a를 인쇄하여 뒤로 이동하는 효과를 얻을 수 있으므로 전체 바이트를 추가로 절약 할 수 있습니다. #»#
Neil

@Neil 감사합니다 ⊗÷ι². 그러나 s \n이전 에 인쇄 할 경우 어떤 변경이 #있습니까? 를 추가하면 나선이 잘못되었습니다Print("\n") .
Kevin Cruijssen

이제 팔이 겹치므로 팔을 #더 길게 만들어야합니다 .
Neil

3

파이썬 2 , 179178 바이트

-1 바이트의 Kevin Cruijssen 에게 감사합니다 .

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

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


파이썬 2 , 179 바이트

이 방법에서는 수식이 조회 목록 대신 xy델타에 사용됩니다.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

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


n+1+n%2n%2-~n-1 바이트. 그리고 0--n/4*21보다 짧은 것을 기억해야합니다 -(-n/4*2). 좋은 답변, +1
Kevin Cruijssen 2016 년

1

자바 스크립트 (ES6), 185 바이트

물론 카레로 더 골프를 칠 수는 있지만 여기는 매우 겸손한 시도입니다. 두 번째 문자를 제외한 가독성을 위해 줄 바꿈이 추가되었습니다.

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

사용법 : d(10)N = 10 시도 예제에 따라 문자열을 반환합니다.

함수 정의 r(a,n)배열 회전 a에 의해 n회전하는 단계; 간격과 라인을 재귀 적으로 회전시키고 추가함으로써 (시작 위치로 다시 회전하지 않는) s(n)크기의 나선을 나타내는 2 차원 배열을 생성 하는 기능 n; 및 d(n)크기의 나선을 n그리고 챌린지에 따라 일관되게 회전하며 반환 된 문자열로 렌더링 하는 함수 .

이것은 정말 재미있는 도전이었습니다 : ¬)

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