플랫폼 이동!


9

도전

문자열 (개행이있을 수 있음) 또는 2 차원 배열과 양의 정수가 주어지면 n플랫폼의 위치가 n초기 위치 다음에 회전합니다.


U, D, R, L 플랫폼입니다.

^, v, >, < 플랫폼의 방향을 변경하는 화살표입니다.

U, D, R, L위, 아래, 오른쪽 및 왼쪽으로 각각 이동합니다. 화살표가 플랫폼 앞에 있으면 방향이 변경됩니다.

플랫폼에 영향을 미칩니다 :

R<

D
^

v
U

>L

>L
 <

(위쪽 화살표는 top L에 영향을 주지만 아래쪽 화살표는 top에 영향을 미치지 않습니다 L)

영향을 미치지 않습니다 :

 <
R

>
 L

v
 U

D
 ^

<R

( R바로 가고 있으므로에 <영향을 미치지 않습니다 R)


예를 들어, 이것이 문자열 인 경우 :

>R   <

플랫폼 R은 거의 화살표에 닿을 때까지 오른쪽으로 움직입니다.

>   R<

그런 다음 방향을 바꾸고 왼쪽으로 이동합니다.

>  R <

(지금은 남지만 문자는 바뀌지 않습니다.)

플랫폼이 움직이지 않는 경우가 있습니다.

>R<

또는

v
U
^

마지막 예 :

v   >
D    Rv
   ^U
^    <

한 차례 후

v   >
    U v
D  ^ R
^    <

한 차례 후

v   >
D    Uv
   ^R
^    <

그리고 한 번 더

v   >
    R v
D  ^ U
^    <

n회전 후 플랫폼이 겹치지 않으며 플랫폼이 범위를 벗어나지 않으며 플랫폼과 플랫폼과 동일한 방향을 가리키는 화살표에 닿지 않는다고 가정 할 수 있습니다.


테스트 사례

Input:
">R   <", 4
Output:
">  R <"

Input:
">R   <", 6
Output:
">R   <"

Input:
">R<", 29
Output:
">R<"

Input:
"v
 U
 ^", 5
Output:
"v
 U
 ^"

Input:
"v

 D
 ^", 1
Output:
"v
 D

 ^"

Input:
"v

 D
 ^", 4
Output:
"v

 D
 ^"

Input:
"v   >
 D    Rv
    ^U
 ^    < ", 2
Output:
"v   >
 D    Uv
    ^R
 ^    <

Input:
">RL<", 3
Output:
">LR<"

Input:
">L  R<", 4
Output:
"> RL <"

Input:
"> RR<
 >L  R <", 6
Ouput:
">RR <
 > RL  <"

Input:
"R   <", 4
Output:
"  R <"

Input:
"R   <", 6
Ouput:
"R   <"

규칙

  • 이것은 바이트 단위의 최단 답변이 이깁니다!
  • 표준 허점은 허용되지 않습니다.

3
@closevoters :이 도전에 대해 분명하지 않은 것은 무엇입니까?
Leaky Nun

이를 바탕으로 밀교 프로그래밍 언어를 만들 시간입니다.
DanTheMan

또한 플랫폼이 그리드에서 벗어나면 어떻게됩니까?
Quelklef

@Quelklef 당신은 n회전 후에 플랫폼이 그리드에서 벗어나지 않을 것이라고 가정 할 수 있습니다 .
acrolith

답변:


2

C #, 1245 바이트

(i,n)=>{string q="RlherLHEfquDFQUd",D="><v^",H="Rlhe",E="LrHE",X="Dufq",Y="UdFQ",S="#v<>";Func<string,char,int>I=(v,L)=>v.IndexOf(L);Func<char,int,char>z=(y,m)=>q[I(q,y)+m*4];Func<string,char,bool>_=(s,F)=>s.Contains(F);var g=((i as char[][])??((string)i).Split('\n').Select(f=>f.ToCharArray())).ToList();int w=g[0].Length,h=g.Count,u;g=g.Select((r,o)=>r.Select((t,p)=>'R'==t&&w>p+1&&0<=(u=I(D,r[p+1]))?z(t,u):'L'==t&&0<=p-1&&0<=(u=I(D,r[p-1]))?z(t,-1+u):'D'==t&&h>o+1&&0<=(u=I(D,g[o+1][p]))?z(t,-2+u):'U'==t&&0<=o-1&&0<=(u=I(S,g[o-1][p]))?z(t,-u):t).ToArray()).ToList();for(var j=0;j<n;j++){bool L,R,T,B;g=g.Select((r,o)=>r.Select((t,p)=>_(D,t)?t:(R=0<=p-1)&&_(H,r[p-1])?w>p+1&&0<=(u=I(D,r[p+1]))?z(r[p-1],u):r[p-1]:(L=w>p+1)&&_(E,r[p+1])?0<=p-1&&0<=(u=I(D,r[p-1]))?z(r[p+1],-1+u):r[p+1]:(B=0<=o-1)&&_(X,g[o-1][p])?h>o+1&&0<=(u=I(D,g[o+1][p]))?z(g[o-1][p],-2+u):g[o-1][p]:(T=h>o+1)&&_(Y,g[o+1][p])?0<=o-1&&0<=(u=I(S,g[o-1][p]))?z(g[o+1][p],-u):g[o+1][p]:(L&&_(H,t)&&!_(D,r[p+1]))||(R&&_(E,t)&&!_(D,r[p-1]))||(B&&_(Y,t)&&!_(D,g[o-1][p]))||(T&&_(X,t)&&!_(D,g[o+1][p]))?' ':t).ToArray()).ToList();}return string.Join("\n",g.Select(s=>new string(s))).ToUpper().Replace("H","U").Replace("E","D").Replace("F","R").Replace("Q","L").Replace("V","v");};

처음에는 더 단순 해 보였지만 더 많은 코드를 계속 작성했습니다. :디

LINQ는 보드를 열거하고 업데이트하여 캐릭터가 움직이는 방향을 나타내도록 변경합니다. 문자는 돌아 오기 전에 되돌아갑니다. 또한 보드가 정사각형이라고 가정합니다 (따라서이 제한 사항에 맞게 여러 줄 테스트 사례를 수정해야했습니다).

넓히는:

// Casts to Func<object, int, string> so as to accept both string and char[][] input
(i, n) =>{
    // Shorten constants/functions
    string q = "RlherLHEfquDFQUd", D = "><v^", H = "Rlhe", E = "LrHE", X = "Dufq", Y = "UdFQ",S="#v<>";
    Func<string, char, int> I = (v, L) => v.IndexOf(L);
    Func<char, int, char> z = (y, m) => q[I(q,y) + m * 4]; // Updates the direction of the platform
    Func<string, char, bool> _ = (s, F) => s.Contains(F);

    // Convert either string or char[][] input into common format
    var g = ((i as char[][]) ?? ((string)i).Split('\n').Select(f => f.ToCharArray())).ToList();

    // Get board dimensions
    int w = g[0].Length,h = g.Count,u;

    // Update platforms to reflect the direction they're initially moving
    g = g.Select((r, o) => r.Select((t, p) =>
        'R' == t &&w>p+1&&0<=(u=I(D,r[p+1]))?z(t,u):
        'L' == t &&0<=p-1&&0<=(u= I(D, r[p-1]))?z(t,-1+u):
        'D' == t &&h>o+1&&0<=(u= I(D, g[o+1][p]))?z(t,-2+u):
        'U' == t &&0<=o-1&&0<=(u= I(S,g[o-1][p]))?z(t,-u):t
    ).ToArray()).ToList();

    // Go through each timestep
    for (var j=0;j<n;j++)
    {
        bool L,R,T,B;
        g = g.Select((r, o) => r.Select((t, p) => 
            // Don't change <>^v characters
            _(D,t) ? t :

            // Move platforms going right
            (R=0 <= p - 1) && _(H,r[p-1]) ? w > p+1 && 0<=(u= I(D, r[p+1])) ? z(r[p-1],u) : r[p - 1] :

            // Move platforms going left
            (L=w > p + 1) && _(E,r[p+1]) ? 0 <= p-1 && 0<=(u= I(D, r[p-1])) ? z(r[p+1],-1+u) : r[p + 1] :

            // Move platforms going down
            (B=0 <= o - 1) && _(X,g[o-1][p]) ? h > o+1 && 0<=(u= I(D, g[o+1][p])) ? z(g[o - 1][p],-2+u) : g[o-1][p] :

            // Move platforms going up
            (T=h > o + 1) && _(Y,g[o+1][p]) ? 0<=o-1&&0<=(u= I(S, g[o-1][p]))?z(g[o + 1][p],-u) :g[o+1][p]:

            // Erase platforms that moved
            (L&&_(H,t)&&!_(D,r[p+1]))||
            (R&&_(E,t)&&!_(D,r[p-1]))||
            (B&&_(Y,t)&&!_(D,g[o-1][p]))||
            (T&&_(X,t)&&!_(D,g[o+1][p]))
            ? ' ':

            // Maintain whatever character this was
            t
            ).ToArray()).ToList();
    }

    // Replace direction characters with platform label and join into string return value.
    return string.Join("\n",g.Select(s=>new string(s))).ToUpper().Replace("H", "U").Replace("E", "D").Replace("F", "R").Replace("Q", "L").Replace("V", "v");
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.