길을 따라


18

도전은 경로를 따라가는 것입니다.

  • ^n -n 줄 위로
  • vn -n 줄 아래로
  • >n -n 자 위치 바로
  • <n -왼쪽으로 n 자 위치

  • n0보다 큰 정수입니다 (예 :와 같은 명령을 수신 할 수 없음 >-2).
  • 명령 사이에 구분 기호가 없으며 올바른 형식의 입력은 다음과 같습니다. >5v8<10^3, 다른 형식의 입력은 허용되지 않습니다.
  • 명령의 수는 무제한입니다.
  • 더 이상 문자가 입력으로 들어오지 않아야합니다.

예.

  1. 입력은 빈 문자열이며 출력은 다음과 같습니다.

    *
    
  2. 입력은 >3또는입니다 <3: 이것은 출력에 아무런 영향을 미치지 않습니다.

    ****
    
  3. 유사위한 ^3v3:

    *
    *
    *
    *
    
  4. 입력 : >1v2출력 :

    **
     *
     *
    
  5. 입력 : ^4>3v2<1출력 :

    ****
    *  *
    * **
    *
    *
    
  6. 되돌아 가서 같은 길을 사용한다면 새로운 것을 그리지 마십시오. 예 :>5<5

    ******
    
  7. ... 새로운 것을 그리지는 않지만 분명히 위치를 바꾸십시오. 따라서 입력이 다음과 같은 >4<2v3경우 출력은 다음과 같습니다 .

    *****
      *
      *
      *
    
  8. 이것은 좀 더 복잡한 예입니다. 1) 경로가 자체적으로 교차 할 수 있습니다. 2) 마지막 명령의 마지막 3 단계는 전체 경로를 오른쪽으로 이동합니다. 입력 : v6>4^3<7출력 :

       *
       *
       *
    ********
       *   *
       *   *
       *****
    
  9. 입력 :

    ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1
    

    산출:

    *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
    *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
    *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
    *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **
    *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
    *******************************************************************************************
    

6
오늘이 챌린지를 게시 했으므로 이것이 올바른 테스트 사례라고 생각합니다 ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1.
insertusername 여기

참조 구현을 제공 할 수 있습니까?
LegionMammal978

실제로는 속하지 않습니까? 결정하십시오 : D
nicael

@nicael : 그렇지 않다고 말하고 싶습니다. I / O는 다르며 다른 경로에서는 경로를 넘을 수 없습니다. 나는 이것이 다른 골프 전략을 허용 할 수있는 방법으로 더 단순하다고 생각합니다. 그러나 나는 갑자기 이것들을 모두 스스로 재개 할 수 있다는 것을 몰랐다. 나는 단지 투표를하고 있다고 생각했다.
marinus

@marinus 좋아요. 그래서 관련 : Yarr! 숨겨진 보물에 대한지도! .
nicael

답변:


2

MATL , 71 바이트

1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c

사용하여 현재 릴리스 (6.0.0) 언어 / 컴파일러를. Matlab과 Octave에서 작동합니다.

편집 (2016 년 6 월 21 일) : 언어 변경으로 인해 현재 릴리스 (16.0.0)에서 실행하려면 코드를 약간 수정해야합니다. 필요한 수정 사항을 포함하여 온라인으로 시도 할 수 있습니다 .

>> matl
 > 1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c
 > 
> ^4>3v2<1
    ****
    *  *
    * **
    *   
    *  

>> matl
 > 1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c
 > 
> ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1
  *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
  *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
  *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
  *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **   
  *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
  ******************************************************************************************* 

설명

이 프로그램에는 4 가지 주요 단계가 있습니다.

  1. 입력 문자열을 읽고 구성 요소로 분할하십시오.
  2. 각 행이 적절한 방향의 단위 변위를 나타내는 2 열 행렬을 만듭니다. 예를 들어, [0 -1]왼쪽에 한 단계를 나타냅니다. 첫 번째 행은 경로의 원점입니다.[1 1]
  3. 첫 번째 차원을 따라 해당 행렬의 누적 합계를 계산합니다. 이제 각 행은의 좌표를 설명합니다 *. 최소값으로 정규화1
  4. 13 단계의 행렬이 나타내는 좌표에 포함 된 새 행렬을 작성하십시오 0. 그런 다음 char 행렬로 변환됩니다.

암호:

1th                         % row vector [1 1]. Initiallize matrix of step 2
j                           % (step 1) read input string 
'.\d+'XX                    % split into components. Creates cell array of substrings
"                           % (step 2) for each component
   @Z)XK                    % unbox to obtain substring and copy
   6L)U:                    % obtain number and build vector of that size
   "                        % repeat as many times as that number
      K1)                   % paste substring. Get first character: '^', 'v', '>', '<'
      XK118=K94=-           % vertical component of unit displacement: -1, 0 or 1
      K62=K60=-             % horizontal component of unit displacement: -1, 0 or 1
      h                     % concatenate horizontally
      v                     % append vertically to existing matrix
   ]                        % end
]                           % end
Ys                          % (step 3) cumulative sum along first dimension
tY)X<1--                    % normalize to minimum value 1
lqg                         % (step 4) build matrix with 0/1
10*32+c                     % replace 0 by space and 1 by asterisk

마지막 예에서 작동합니까?
nicael

멋지다! 그렇습니다. 나는 그것을 포함하기 위해 내 대답을 편집했다
Luis Mendo

8

자바 스크립트 (ES6), 204211 210

편집 1 버그 수정-공백 입력에 대한 출력 '*'
편집 2 x 및 y diff 방향의 간단한 디코딩

사양을 이행하기 위해 수정 된 보물지도에 대한 나의 대답은 다음과 같습니다 .

F=m=>(m.replace(/\D(\d+)/g,(d,z)=>{for(;z--;r=[...r],r[x]=m,p[y]=r.join``)for(d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0),r=p[y]||'';!r[x];)r+=' '},x=y=0,p=[m='*']),p.join`
`)

덜 골프 와 더 많거나 적은 설명

f=m=>(
  x=y=0, // starting position
  p=['*'], // output string array (initialized with minimum output)
  m.replace( /\D(\d+)/g, 
  (d,z) => // execute the following for each group direction/length. Length in z, direction in d[0]
  {
    while( z--)  // repeat for the len
    {
      // check d to change values of x and y
      // all the comparison are with > and <, not equal
      // so that they work with the whole d, not just d[0]
      d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,
      // now if x or y are < 0 then p must be adjusted  
      p = ~x 
        ? ~y
          ? p // both x and y are >= 0, p is not changed
          : [y = 0, ...p] // y < 0, shift p by on adding a 0 element and set y to 0
        : p.map(r=> ' ' + r, x = 0); // x < 0, add a space to the left for each row in p and set x to 0
      r = p[y] || ''; // get current row in r
      for( ; !r[x]; ) // if the current row is empty or too short
        r += ' '; // ... add spaces up to position x
      // set character in x position
      r = [...r], // the shorter way is converting to array ...
      r[x] = '*', // setting the element
      p[y] = r.join`` // and the back to string using join
    }
  }),
  p.join`\n` // return output array as a newline separated string
}

테스트

F=m=>(m.replace(/\D(\d+)/g,(d,z)=>{for(;z--;r=[...r],r[x]='*',p[y]=r.join``)for(d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0),r=p[y]||'';!r[x];)r+=' '},x=y=0,p=['*']),p.join`
`)

// TEST
console.log = x => O.textContent += x + '\n';

console.log(F('')+'\n')

console.log(F('v6>4^3<7')+'\n')

console.log(F('^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1'))
<pre id=O></pre>


완벽하게 작동하는 것 같습니다.
nicael

단 하나의 예외가 있습니다 : 입력이 비어있는 경우 요구 사항은 write *입니다.
nicael

: 브라우저가 해석 ES6에 문제가있는 것 것들 jsfiddle.net/2vrrd1wt .
nicael

@nicael 감사합니다. 1 바이트 수정
edc65

1

펄, 174 바이트

@M=(['*']);pop=~s/(.)(\d+)/($z=ord$1)&64?($y+=$z&8?-1:1)<0&&unshift@M,[$y++]:($x+=($z&2)-1)<0?@M=map{[$x=0,@$_]}@M:0,$M[$y][$x]='*'for1..$2/gre;print map{map{$_||$"}@$_,$/}@M

명령 줄 인수로 입력을 예상합니다. 논쟁을 인용하십시오!
예:perl 177.pl "<1^2>3v4<5^6>7v8<9^10>11"

다소 읽기 쉬운 :

@M=(['*']);                                 # output origin/starting position

pop=~                                       # apply regex to cmdline arg
s!(.)(\d+)!                                 # match $1=direction, $2=count

    ($z=ord$1)                              # get ASCII code for char
    &64                                     # 'v^' have this bit set, '<>' don't

        ?                                   # adjust y:
            ($y += $z&8 ? -1 : 1)           # '^' has bit set, 'v' doesn't
            < 0 &&                          # negative y?
            unshift @M, [$y++]              # prepend row; abuse [] for $y++ saving 3 bytes

        :                                   # adjust x:
            ($x+= ($z&2) -1 )               # '>' has bit set: 2-1=1, '<' hasn't: 0-1=-1
            < 0 ?                           # negative x?
                @M = map{ [$x=0,@$_] } @M   # prepend column, reset x
                :0                          # '?:0' shorter than '&&()'
        ,                                   # oh, and also:
        $M[$y][$x]='*'                      # output current position.

    for 1..$2                               # iterate count
!grex;                                      

print map{ map{$_||$"} @$_, $/ } @M         # iterate rows/cols, print '*' or space

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