pssssssssssssst


31

소개

이것은 매우 간단합니다. 우리는 아스키에서 뱀을 그릴 것입니다. 이것은 과일을 수집하고 지속적으로 자라는 오래된 뱀 게임에서 영감을 얻었습니다.

정의

뱀의 길이를 나타내는 양의 정수 N이 주어지면 뱀의 몸에 n과 머리와 꼬리가 더해 지도록 뱀을 그립니다.

부분품:

  • 머리: <, >, ^, v
  • 꼬리: @
  • 수직선: |
  • 수평선 : -

모든 모서리는 \또는로 /각각 만족해야합니다 . 머리가 구석에서 끝나지 않는 한 <, >, ^, v뱀이 말리는 방향으로 머리 가 우선합니다. 즉, 길이 1의 예에서는 시계 반대 방향으로 돌리므로 헤드가 그렇게 회전합니다. 시계 방향 솔루션의 경우 오른쪽에 >있습니다.

뱀은 꼬리가있는 가운데에서 시작해야하지만 시계 방향 또는 시계 반대 방향으로 선택한 방향으로 바깥쪽으로 갈 수 있습니다. 또한 원형으로 바깥쪽으로 확장 될 때 자체를 단단히 감싸 야합니다.

/--\
|/\|
||@|
|\-/
\--->

@꼬리와 시작 위치는 어디 입니까? 위에서 볼 수 있듯이 꼬리는 가운데에서 시작하여 시계 반대 방향으로 바깥쪽으로 왼쪽으로 올라갑니다.

여기서 길이는 19꼬리와 머리에 더해집니다.

다른 예로, 길이는 1다음과 같습니다.

<\
 @

승리

이것은 코드 골프이므로 가장 적은 수의 바이트로 제출 된 답변이 타이 브레이커로 사용될 시간과 함께 승리합니다.

즐기세요!


2
내가 같은 직선 뱀을 그리는 것이 허용되지 않는다는 것은 분명하지 않습니다 @---->. 아마도 뱀 모양에 대해 더 엄격한 조건을 계획 할 것입니다. 또한 얼마나 많은 공백이 허용되는지 허용되지 않는지 확인하십시오
Ton Hospel

1
"뱀은 꼬리로 가운데에서 시작해야하지만, 원하는 방향으로 그리고 시계 방향 또는 시계 반대 방향으로 바깥쪽으로 갈 수 있습니다"
jacksonecac

1
그래서 나는 @중간 이라고 말합니다 (공간을 추가하면 가능합니다). "오른쪽으로"를 방향으로 선언하고 헤드 포인트를 아래로 향하게하고 시계 방향으로 선언하십시오. 당신의 용어는 분명해 보이지만 실제로는 모호합니다. 나는 당신이 아마 코일 뱀을 가능한 한 단단하게 의미한다는 것을 알고 있지만, 당신은 그것을 분명히해야합니다
Ton Hospel

1
걱정마 그것은 그 도전의 상쇄로 인해 훨씬 ​​더 어렵다.
Martin Ender

2
좋은 첫 도전! 사이트에 오신 것을 환영합니다!
Luis Mendo

답변:


10

MATL , 85 83 바이트

그리고 spiral내장이 있으면 짧은 코드가 될 것이라고 생각했습니다 ...

Oli2+XH:UQXItH:+XJh(YsXKoQ3I(4J(5l(H:)0HX^XkU(6H(3M1YL3X!P)'|-\/@' '<v>^'KHq))h0hw)

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

설명

하자 N은 입력을 나타낸다. length +의 벡터 ceil(sqrt(N+2))^2, 즉 N +2 이상인 가장 작은 완벽한 정사각형을 만듭니다. 이 벡터는 숫자 값으로 채워지고 나선형으로 굴려서 길이가 완벽한 정사각형이되어야합니다. 그러면 숫자 값이 문자로 대체됩니다.

하자 N 나선의 중심에서 1부터 시작하여 각 단계를 나타낸다. 뱀이 회전하는 단계는 기호에 대해 n 2 +1 (즉, 2, 5, 10, ...) \n 2 + n +1 (즉, 3, 7, 13, ...)로 제공됩니다. 에 대한 /. 사이의 단계 \와이 /있어야 -하고, 그 사이의 /a는 \되어야한다 |.

벡터는 1전환점 (2,3,5,7,10,13 ...)과 0나머지에 포함되도록 만들어집니다. 누적 합계의 패리티는 각 항목이 a -또는 a 여야하는지 여부를 알려줍니다 |. 이 결과에 1을 더하면 1(for |) 또는 2(for -) 를 포함하는 벡터를 얻습니다 . 그러나이 자체가 될 턴 점하게 1또는 2너무합니다. 따라서 우리가 알고있는 위치의 전환점을 덮어 씁니다. 위치 n 2 +1이 채워 3지고 위치 n 2 + n +1이로 채워집니다 4. 꼬리와 머리도 특별한 경우입니다 : 벡터의 첫 번째 요소 (꼬리)가로 설정되고 5색인이 N 인 요소+2 (헤드)가로 설정되었습니다 6. 마지막으로, 인덱스가 N +2를 초과하는 요소 는로 설정됩니다 0.

입력 N = 19를 예로 들어 길이가 25 인 벡터가 생겼습니다.

5 3 4 1 3 2 4 1 1 3 2 2 4 1 1 1 3 2 2 2 6 0 0 0 0

이 벡터를 나선형으로 굴려야합니다. 이를 위해 나선형 행렬을 생성하는 내장 함수를 사용하고 반사와 조옮김을 생성합니다.

13 12 11 10 25
14  3  2  9 24
15  4  1  8 23
16  5  6  7 22
17 18 19 20 21 

행렬로 벡터를 인덱싱하면

4 2 2 3 0
1 4 3 1 0
1 1 5 1 0
1 3 2 4 0
3 2 2 2 6

여기서 0공간에 대응 1에 대응하고 |, 2-, 3\, 4/, 5@6머리.

네 문자 ^<, v또는 >헤드 중 어떤 문자를 가져야하는지 알기 위해 이전에 계산 한 누적 전환점 합계를 사용합니다. 구체적으로,이 누적 합 (즉, N +1 값) 모듈로 4 의 두 번째 마지막 값은 헤드에 어떤 문자를 사용해야하는지 알려줍니다. 때문에 우리는 "코너에 머리 끝이 머리가있는 경우 요구 사항으로, 누적 합계, 마지막으로하지의 두 번째 마지막 값을 <, >, ^, v뱀이 말려 방향으로 우선합니다". 들어 N은 19 일 예를 = 헤드이다 >.

이제 여섯 번째 위치에서 머리에 적절한 문자를 포함하여 모든 뱀 문자가 포함 된 문자열을 만들 수 있습니다 '|-\/@> '. 그런 다음 위의 행렬을 사용하여이 문자열을 색인화합니다 (인덱싱은 1 기반이며 모듈 식이므로 공간이 오래갑니다).

/--\ 
|/\| 
||@| 
|\-/ 
\--->

1
대단한 직업! 참여해 주셔서 감사합니다!
jacksonecac

8

파이썬 2 250 233 191 바이트

n=input()
l=[''],
a=x=0
b='@'
while a<=n:x+=1;l+=b,;l=zip(*l[::-1]);m=x%2;b='\/'[m]+x/2*'-|'[m];k=len(b);a+=k
l+=b[:n-a]+'>v'[m]+' '*(k-n+a-1),
if m:l=zip(*l[::-1])
for i in l:print''.join(i)
  • @JonathanAllan 덕분에 39 바이트 절약

반복

뱀 전체를 시계 방향으로 90º 돌리고 아래쪽 부분을 추가하여 뱀을 그리십시오. 이렇게하면 뱀이 항상 반 시계 방향이됩니다.
새로운 세그먼트는 항상 함께 시작 \하고 있습니다 -심지어 측면에 대한 본문으로하고 / -이상한 측면에 대해. (모서리)없이 세그먼트 크기는 0, 1, 1, 2, 2, 3...이다 floor(side/2).
세그먼트가 마지막 문자이면 초과 문자를 제거하고 머리를 추가하고 공백으로 완성하십시오.

desired_size=input()
snake=[['']]
snake_size=side=0
new_segment='@'
while snake_size<=desired_size:
    side+=1
    snake+=[new_segment]
    snake=zip(*snake[::-1])
    odd_side=side%2
    new_segment='\/'[odd_side]+side/2*'-|'[odd_side]
    snake_size+=len(new_segment)
diff=desired_size-snake_size
snake+=[new_segment[:diff]+'>v'[odd_side]+' '*(len(new_segment)-diff-1)]
if odd_side:
    snake=zip(*snake[::-1])

for line in snake:print ''.join(line)

좋은 작업! 순위 결정자가 이길 수 있습니다. 사람들이 무엇을 생각해 내는지 보자.
jacksonecac

2
확실히이 문제를 해결하기위한 이상적인 언어입니다.
Neil

+1. 결함은 머리가 모퉁이에있을 때 모퉁이가 아닌 직선을 향해야한다는 것입니다.
Jonathan Allan

1
: 16 개 같이 문자열로 인덱싱하여 바이트 저장 '\/'[m], '-|'[m]'>v'[m]
조나단 앨런

1
print''.join
Jonathan Allan

7

자바 스크립트 (ES6), 193 201 203215220224

편집 4 들으 @Arnauld 바이트 저장
Edit2가이 논리, 단지 현재의 방향에서 그들을 얻을, x와 y의 현재 단위를 저장하지 않는 변경
EDIT3 , 몇 바이트를 저장하는 데 나는 빈 공간의 더 나은 관리를 사용하기로 결정
Edit4 8 다른 답변과 마찬가지로 헤드 방향에 대한 예제를 정확하게 따르지 않고 저장된 바이트

현재 버전은 Chrome, Firefox 및 MS Edge에서 작동합니다.

이 답변은 후행과 선행 공간 (및 빈 줄)을 제공합니다.

n=>(t=>{for(x=y=-~Math.sqrt(++n)>>1,g=[i=t];(g[y]=g[y]||Array(x).fill` `)[x]='^<v>|-/\\@'[t?n?i-t?4+t%2:x-y?7:6:t%4:8],n--;i=i>1?i-2:++t)d=t&2,t&1?x+=d-1:y+=d-1})(0)||g.map(x=>x.join``).join`
`

약간 덜 골프

n=>
{
  g = [],
  // to save a few bytes, change line below (adds a lot of spaces)
  // w = ++n,
  w = -~Math.sqrt(++n)
  x = y = w>>1,
  s=c=>(g[y] = g[y] || Array(x).fill(' '))[x] = c, // function to set char in position
  s('@'); // place tail
  for (
     i = t = 0; // t increases at each turn, t%4 is the current direction
     n--;
     i = i > 0 ? i - 2 : t++ // side length increases every 2 turns
  )
     d = t & 2,
     t & 1 ? x += d-1: y += d-1
     s(!n ? '^<v>' [t % 4] // head
          : '|-/\\' [i > 0 ? t % 2 : x-y ? 3 : 2]) // body
  return g.map(x=>x.join``).join`\n`
}

f=
n=>(t=>{for(x=y=-~Math.sqrt(++n)>>1,g=[i=t];(g[y]=g[y]||Array(x).fill` `)[x]='^<v>|-/\\@'[t?n?i-t?4+t%2:x-y?7:6:t%4:8],n--;i=i>1?i-2:++t)d=t&2,t&1?x+=d-1:y+=d-1})(0)||g.map(x=>x.join``).join`
`

function update() {
  O.textContent=f(+I.value);
}

update()
<input type=number id=I value=19 oninput='update()' 
 onkeyup='update() /* stupid MS browser, no oninput for up/down keys */'>
<pre id=O>


당신은 대체하여 몇 바이트를 저장할 수 있습니다 (' ')` ` ('@')`@`
Arnauld

@Arnauld Array (2) .fill``==> [ Array[1], Array[1] ], while Array(2).fill(' ')==>[' ',' ']
usandfriends

@usandfriends-맞습니다. 그러나 일단 가입하면 아무런 차이가 없습니다.
Arnauld

@Arnauld는 처음에 usandfriends와 동의했지만 실제로 작동합니다. 감사합니다
edc65

@TravisJ Chrome에서는 작동하지 않지만 Firefox는 작동하는 것 같습니다.
Adnan

3

자바 스크립트 (ES7), 200 바이트

(n,s=(n*4+1)**.5|0,i=+`1201`[s%4],d=i=>`-`.repeat(i))=>[...Array(s-2>>2)].reduce(s=>`/-${d(i)}\\
${s.replace(/^|$/gm,`|`)}
|\\${d(i,i+=2)}/`,[`/\\
|@`,`/-\\
|@/`,`@`,`/@`][s%4])+`
\\${d(n-(s*s>>2))}>`

손쉬운 테스트를위한 ES6 버전 :

f=(n,s=Math.sqrt((n*4+1))|0,i=+`1201`[s%4],d=i=>`-`.repeat(i))=>[...Array(s-2>>2)].reduce(s=>`/-${d(i)}\\
${s.replace(/^|$/gm,`|`)}
|\\${d(i,i+=2)}/`,[`/\\
|@`,`/-\\
|@/`,`@`,`/@`][s%4])+`
\\${d(n-(s*s>>2))}>`;
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>


흥미로운 구현. 나는 그렇게 생각하지 않았다. 기여해 주셔서 감사합니다.
jacksonecac

3

펄, 111110 바이트

에 +1 포함 -p

STDIN에 크기를주십시오

snake.pl:

#!/usr/bin/perl -p
s%> %->%+s%\^ %/>%||s/
/  
/g+s%.%!s/.$//mg<//&&join"",//g,$/%seg+s/ /^/+y%/\\|>-%\\/\-|%for($\="/
\@
")x$_}{

대박! 좋은 작업! 기여해 주셔서 감사합니다!
jacksonecac

0

배치, 563 바이트

@echo off
if %1==1 echo /@&echo v&exit/b
set w=1
:l
set/ah=w,a=w*w+w
if %a% gtr %1 goto g
set/aw+=1,a=w*w
if %a% leq %1 goto l
:g
call:d
set r=/%r%\
set/ae=h%%2,w=%1-h*w+2
for /l %%i in (1,1,%h%)do call:r
call:d
echo \%r%^>
exit/b
:d
set r=
for /l %%i in (3,1,%w%)do call set r=%%r%%-
exit/b
:r
echo %r:!=^|%
if %e%==0 set r=%r:@!=\/%
set r=%r:@/=\/%
set r=%r:!\=\-%
set r=%r:/@=\/%
set r=%r:/!=-/%
set r=%r:@!=\/%
set r=%r:/\=!@%
set r=%r:/-=!/%
if %e%==1 set r=%r:/\=@!%
set r=%r:/\=@/%
set r=%r:-\=\!%
if %e%==1 set r=%r:/\=/@%

설명 : 코드의 나머지 부분 인 특수 케이스 1에는 최소 2 개의 뱀 너비가 필요합니다. 다음으로, 면적이 뱀의 길이보다 작은 가장 큰 4 분의 1 제곱 (정확한 정사각형 또는 1보다 넓은 직사각형)을 계산합니다. 뱀은 왼쪽 하단 모서리에서 시작하여 중간에서 꼬리로 끝나는이 사각형으로 감겨지고 나머지 길이는 사각형의 아래쪽에서 이어집니다. 사각형은 실제로 간단한 문자열 대체로 생성됩니다. 대부분의 시간은 대각선을 1 단계 이동하여 이전 줄에서 각 줄을 생성하지만 꼬리를 처리해야하며 직사각형의 높이가 짝수인지 홀수인지에 따라 약간의 차이가 있습니다.


대박! 기여해 주셔서 감사합니다!
jacksonecac

-1

파이썬 2.7, WHOPPING 1230 바이트

나는 파이썬과 코드 골프에 익숙하지 않지만 나는 내 자신의 질문에 대답하고 사실 후에 부끄러워해야한다고 느꼈다. 그래도 많은 재미가 있습니다!

def s(n):
x = []
l = 0
if n % 2 == 1:
    l = n
else:
    l = n + 1
if l < 3:
    l = 3
y = []
matrix = [[' ' for x in range(l)] for y in range(l)] 
slash = '\\'
newx = l/2
newy = l/2
matrix[l/2][l/2] = '@'
newx = newx-1
matrix[newx][newy] = slash
#newx = newx-1
dir = 'West'

for i in range(0, n-1):    
    newx = xloc(newx, dir)
    newy = yloc(newy, dir)
    sdir = dir
    dir = cd(matrix, newx, newy, dir)
    edir = dir

    if (sdir == 'West' or sdir == 'East') and sdir != edir:
        matrix[newx][newy] = '/'
    else:
        if (sdir == 'North' or sdir == 'South') and sdir != edir:
            matrix[newx][newy] = '\\'
        else:
            if dir == 'East' or dir == 'West':
                matrix[newx][newy] = '-'
            else:
                matrix[newx][newy] = '|'
newx = xloc(newx, dir)
newy = yloc(newy, dir)
sdir = dir
dir = cd(matrix, newx, newy, dir)
edir = dir
print 'eDir: ' + dir
if dir == 'North':
    matrix[newx][newy] = '^'
if dir == 'South':
     matrix[newx][newy] = 'v'
if dir == 'East':
     matrix[newx][newy] = '>'
if dir == 'West':
     matrix[newx][newy] = '<'    


p(matrix, l)

def cd(matrix, x, y, dir):    
if dir == 'North':
    if matrix[x][y-1] == ' ':
        return 'West'
if dir == 'West':
    if matrix[x+1][y] == ' ':
        return 'South'
if dir == 'South':
    if matrix[x][y+1] == ' ':    
        return 'East'
if dir == 'East':
    if matrix[x-1][y] == ' ':        
        return 'North'
return dir

def p(a, n):
for i in range(0, n):
    for k in range(0, n):
        print a[i][k],
    print ' '

def xloc(x, dir):
if dir == 'North':
    return x -1
if dir == 'West':
    return x
if dir == 'East':
    return x 
if dir == 'South':
    return x + 1
 def yloc(y, dir):
if dir == 'North':
    return y
if dir == 'West':
    return y - 1
if dir == 'East':
    return y + 1
if dir == 'South':
    return y

s(25)

https://repl.it/Dpoy


5
이는 대규모 단지 등 불필요한 공백, 줄 바꿈, 의견, 기능 .. 제거함으로써 줄일 수있다
애디슨 크럼프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.