나선 프로그래밍


14

단일 정수 N을 받아들이고 아래 나선의 첫 번째 N 막대를 인쇄 (문자열로)하거나 문자열로 반환하는 명명 된 함수 또는 프로그램을 작성합니다 (중앙의 세로 막대에서 시작하여 시계 방향으로 바깥쪽으로 나선형).

        _______________
       / _____________ \
      / / ___________ \ \
     / / / _________ \ \ \
    / / / / _______ \ \ \ \
   / / / / / _____ \ \ \ \ \
  / / / / / / ___ \ \ \ \ \ \
 / / / / / / / _ \ \ \ \ \ \ \
/ / / / / / / / \ \ \ \ \ \ \ \
| | | | | | | | | | | | | | | |
\ \ \ \ \ \ \___/ / / / / / / /
 \ \ \ \ \ \_____/ / / / / / /
  \ \ \ \ \_______/ / / / / /
   \ \ \ \_________/ / / / /
    \ \ \___________/ / / /
     \ \_____________/ / /
      \_______________/ /

0 <N <= 278이라고 가정 할 수 있습니다. 나선의 가장 왼쪽 문자 앞에 공백을 포함 할 수 없습니다. 선택적으로 단일 후행 줄 바꿈을 인쇄 할 수 있습니다.

10의 입력에 대한 올바른 출력은

   _
  / \ 
  | | 
\___/

2의 입력에 대해 올바른 출력은

/
|

입력 20의 경우 올바른 출력은

  ___
 / _ \
/ / \ \ 
| | | |
\___/ /

가장 왼쪽 문자 앞에 공백이 있기 때문에 잘못된 출력은 다음과 같습니다.

       ___
      / _ \
     / / \ \ 
     | | | |
     \___/ /

우승자는 가장 짧은 제출 (바이트)입니다.


이것은 이상한 나선이며, 6/8면이 회 전당 커지고 2 개 크기는 1로 유지됩니다.
Devon Parsons

1
이 수직 바 (육각형 나선형,이 중 @DevonParsons는 생각 |) 단지의 회의 나타낼 수있는 가장 가까운 캐릭터입니다 /\.
mbomb007

답변:


5

CJam-156/147

L{[W1]{:I0'|{IIW*:J'/}X*[0J'_]X2*I+*[J0_]I1={\}*{J_'\}X*0I0}%L*3/{~_{[UV@]a3$+}{;@}?V@+:V;U@+:U;}/}A,1>fX]ri=_z::e<2<f{[\\]z::-}$_W=0=)S50*a*\{~3$3$=\tt}/N*

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

1에서 378까지의 입력에서 작동합니다 (필요한 것보다 100 이상).

이 과제가 게시 될 당시 최신 커밋 (공개 hg)이지만 공개되지 않은 CJam 코드를 사용하여 솔루션을 147 자로 단축 할 수 있습니다.

L{[W1]{:I0'|{IIW*:J'/}X*[0J'_]X2*I+*[J0_]I1={\}*{J_'\}X*0I0}%L*3/{~_{[UV@]a3$+}{;@}?V@+:V;U@+:U;}/}A,1>fX]ri=_:.e<2<f.-$_W=0=)S50*a*\{~3$3$=\tt}/N*

설명:

이 프로그램은로 시작하는 [xy character]의 배열로 모든 나선을 반복적으로 생성하고, [0 0 '|]요청 된 나선을 가져오고, 최소 x와 y가 0이되도록 좌표를 조정하고, 공간의 행렬을 만듭니다 (올바른 행 수와 열 50 개) 그런 다음 나선에서 문자를 설정하고 행을 줄 바꿈으로 결합합니다.

L                   start with an empty array (spiral no. 0)
{…}A,1>fX           for X in 1..9 (A=10)
                    each X represents a full 360° tour with groups of X /'es and \'es
    [W1]{…}%        transform the array [-1 1] (W=-1) applying the block to each item
                    the block generates a series of triplets dx, dy, character
                    note: dx is down, dy is right; -1 handles ↑↗→↘, 1 handles ↓↙←↖
        :I          store the current item in I
        0'|         add 0 and |, which will form a triplet with the previous I
        {…}X*       repeat X times
            IIW*    add I and -I
            :J'/    also store -I in J, and add /
        [0J'_]      make an array [0 J _]
        X2*I+*      repeat the array X*2+I times
        [J0_]       make an array [J 0 0]
                    (a 0 instead of a character means only changing the position)
        I1={\}*     if I=1, swap the two arrays (the position adjustment is different
                    for the upper and lower horizontal sections)
        {…}X*       repeat X times
            J_'\    add J, J and \
        0I0         add 0, I and 0 (another position adjustment)
    L*              flatten the array (since we added a few inner arrays)
    3/              split into [dx dy char] triplets
    {…}/            for each triplet
        ~_          dump the 3 items on the stack and duplicate the character
        {…}         if the character is not 0
            [UV@]   make an array [U V char] (U and V are initially 0)
                    U represents "x" and V represents "y"
            a3$+    add it as an element to a copy of the previous spiral
        {…}         else
            ;@      pop the character and bring the previous spiral to the top
        ?           end if
        V@+:V;      V+=dy
        U@+:U;      U+=dx
]                   put all the spirals in an array
ri=                 read token, convert to integer and get that spiral
_z::e<              copy the spiral and get a triplet with the minimum values
2<                  keep only the first 2 items (xmin and ymin)
f{…}                for each triplet and the array [xmin ymin]
    [\\]z::-        subtract xmin and ymin from x and y in the triplet
                    (in the latest CJam code this is simply ".-")
$                   sort the spiral (putting the triplets in order by x then y)
_W=0=)              get the maximum (updated) x and increment it
S50*                make a string of 50 spaces
a*                  put it in an array and repeat it xmax+1 times
                    this is the initial matrix of spaces
\                   swap with the spiral
{…}/                for each triplet in the spiral
    ~               dump the 3 items (x y char) on the stack
    3$3$=           copy the matrix and x, and get the x'th row
    \t              swap with the character and put that character in the y'th position
    t               put the modified row in the x'th position in the matrix
N*                  join the matrix rows with newlines

8

파이썬 2, 290 289

아마 정말 나쁘지만 시도했습니다 : D

출력에는 후행 공백이 포함되지만 스펙에서는 금지되지 않습니다.

업데이트 : 로 변경 \n하여 1 바이트를 저장 했습니다 ;.

m=x=y=c=0
l,f=1,[31*[' ']for t in[0]*31]
for i in[0]*input():
 k=m%4;f[14+y+(2<m<6)][14+x-(m>3)],x,y,c='|/_\\'[k],x+(k>0)*(2*(4>m)-1),y+(k!=2)*(2*(2<m<6)-1),c+1
 if(c==l)*(m%2)+(k==0)+(k==2)*(c==2*l-1+m//3):m,c,l=(m+1)%8,0,l+m//7
print'\n'.join(''.join(e[16-l*2:])for e in f if[' ']*31!=e)

후행 공백은 좋습니다. 나는 이것을 테스트했다. 좋은 작업!
Rainbolt

4

자바 스크립트 (ES6) 257 288 321

단계 편집이 병합되었습니다. 더 많은 숯을 자르기 위해 골프 코드를
편집하십시오.

현재 x 및 y 위치와 현재 방향을 추적하면서 출력을 r 배열에 반복적으로 빌드합니다. x 또는 y 위치가 0보다 작 으면 전체 r 배열이 재조정됩니다.

주요 변수 :

  • r 결과 배열
  • x, y 현재 위치.
  • s 현재 방향 (0..7) (또는 현재 상태)
  • d 그릴 현재 기호 (0..3)-> '| \ _ /'
  • l 현재 시퀀스에서 런 니그 위치 (아래로 0)
  • w 현재 나선 반경
F=n=>
  (w=>{
    for(r=b=[],s=y=x=d=0;n--;
      d&&--l||((s=s+1&7,d=s&3)?l=d-2?w:s/2-2+w+w:w+=!s))
      s>0&s<4?++x:s>4?x?--x:r=r.map(v=>' '+v):b+='  ',
      q=r[s>2&s<6?++y:y]||b,
      r[y]=(q+b).slice(0,x)+'|/_\\'[d]+q.slice(x+1),
      s<2|s>6?y?--y:r=[,...r]:x+=!d*2,x-=!d
  })(1)||r.join('\n')

언 골프

F=n=>{
  var r=[], s,x,y,d,w,l, q
  for(l=w=1, s=x=y=d=0; n--;)
  {
    if (s>2 && s<6) ++y; // right side, inc y before drawing

    if (x < 0) // too left, adjust
    {
      r = r.map(v=>' '+v) // shift all to right
      ++x; // move current position to right
    }
    if (y < 0) // too up
    {
      r = [q='',...r] // shift all to bottom
      ++y; // move current position to bottom
    }
    q = r[y] || ''; // current row, if undefined convert to empty string
    r[y] = (q+' '.repeat(x)).slice(0,x) + '|/_\\'[d] + q.slice(x+1); // add current symbol in the x column

    if (s<2 || s>6) --y; // left side, dec y after drawing

    if (s>0 && s<4) // always change x after drawing
      ++x;
    else if (s > 4)
      --x;

    --l; // decrement current run
    if (l == 0) // if 0, need to change direction
    {
      s = (s+1) % 8; // change direction
      d = s % 4; // change symbol
      if (d == 0)
      { 
        // vertical direction, adjust x and if at 0 increase radius
        l = 1 // always 1 vertical step
        if (s == 0)
          ++x, ++w
        else
          --x
      }
      else
      {
        if (d != 2)
        {
          l = w; // diaagonal length is always w
        }
        else if (s == 2)
        {
          l = w+w-1 // top is radius * 2 -1
        }
        else
        {
          l = w+w+1 // bottom is radius * 2 +1
        }
      }
    }
  }    
  return r.join('\n')
}  

Firefox / FireBug 콘솔 (또는 JSFiddle thx @Rainbolt)에서 테스트

;[1, 2, 10, 20, 155, 278].forEach(x=>console.log(F(x)))

산출

|

/
|

   _
  / \
  | |
\___/

  ___
 / _ \
/ / \ \
| | | |
\___/ /

      ___________
     / _________ \
    / / _______ \ \
   / / / _____ \ \ \
  / / / / ___ \ \ \ \
 / / / / / _ \ \ \ \ \
/ / / / / / \ \ \ \ \ \
| | | | | | | | | | | |
\ \ \ \ \___/ / / / /
 \ \ \ \_____/ / / /
  \ \ \_______/ / /
   \ \_________/ /
    \___________/

        _______________
       / _____________ \
      / / ___________ \ \
     / / / _________ \ \ \
    / / / / _______ \ \ \ \
   / / / / / _____ \ \ \ \ \
  / / / / / / ___ \ \ \ \ \ \
 / / / / / / / _ \ \ \ \ \ \ \
/ / / / / / / / \ \ \ \ \ \ \ \
| | | | | | | | | | | | | | | |
\ \ \ \ \ \ \___/ / / / / / / /
 \ \ \ \ \ \_____/ / / / / / /
  \ \ \ \ \_______/ / / / / /
   \ \ \ \_________/ / / / /
    \ \ \___________/ / / /
     \ \_____________/ / /
      \_______________/ /

나는 이것을 테스트했고 작동한다. 다음 은 답변이 작동하는 것을 보여주는 jsfiddle 입니다. 답변에 자유롭게 포함하십시오.
Rainbolt

2

피스, 166 165

방금 Pyth 기술이 아닌 Python 답변 을 Pyth로 번역했습니다 . 결과 구토는 다음과 같습니다.

Jm*31]d*31dK0=G0=H0=Y1VQ X@J++14H&<2K<K6+14-G<3K@"|/_\\"%K4~G*<0%K4-*2>4K1~H*n2%K4-*2&<2K>6K1~Z1I||&qZY%K2!%K4&q2%K4qZ+-*2Y1/K3~Y/K7=K%+1K8=Z0;jbmj>d-16*2Ykfn*31]dTJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.