Plattformen bewegen!

9

Die Herausforderung

Wenn entweder eine Zeichenfolge (möglicherweise Zeilenumbrüche) oder ein zweidimensionales Array und eine positive Ganzzahl angegeben werden n, wird die Position der Plattformen nnach der Anfangsposition gedreht.


U, D, R, L sind Plattformen.

^, v, >, < sind Pfeile, die die Richtung der Plattformen ändern.

U, D, R, Lbewege dich nach oben, unten, rechts und links. Wenn sich ein Pfeil vor einer Plattform befindet, ändert er die Richtung.

Beeinflusst die Plattform:

R<

D
^

v
U

>L

>L
 <

(Der obere Pfeil wirkt sich auf die Oberseite aus L, der untere Pfeil jedoch nicht auf die Oberseite. L)

Wird nicht beeinflussen:

 <
R

>
 L

v
 U

D
 ^

<R

( Rgeht richtig, hat also <keinen Einfluss auf die R)


Wenn dies beispielsweise die Zeichenfolge wäre:

>R   <

Die Plattform Rwürde sich nach rechts bewegen, bis sie fast den Pfeil berührt:

>   R<

Danach würde es die Richtung ändern und nach links gehen:

>  R <

(Auch wenn es jetzt nach links geht, wird sich der Brief nicht ändern.)

In einigen Fällen bewegt sich die Plattform nicht, z

>R<

oder

v
U
^

Letztes Beispiel:

v   >
D    Rv
   ^U
^    <

Nach einer Runde

v   >
    U v
D  ^ R
^    <

Nach einer Runde

v   >
D    Uv
   ^R
^    <

Und noch eine Runde:

v   >
    R v
D  ^ U
^    <

Sie können davon ausgehen, dass sich die Plattformen nach nAbbiegungen nicht überlappen, dass die Plattformen nicht außerhalb der Grenzen liegen und dass eine Plattform keinen Pfeil berührt, der in die gleiche Richtung wie die Plattform zeigt.


Testfälle

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   <"

Regeln

  • Dies ist , also gewinnt die kürzeste Antwort in Bytes!
  • Standardlücken sind nicht zulässig.
Akrolith
quelle
3
@closevoters: Was ist an dieser Herausforderung unklar?
Undichte Nonne
Zeit, eine darauf basierende esoterische Programmiersprache zu erstellen.
DanTheMan
Was passiert auch, wenn eine Plattform vom Netz geht?
Quelklef
@Quelklef Sie können davon ausgehen, dass die Plattformen nach nKurven nicht vom Netz gehen .
Acrolith

Antworten:

2

C #, 1245 Bytes

(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");};

Anfangs schien es einfacher zu sein, aber dann schrieb ich einfach weiter Code. : D.

LINQ zum Auflisten und Aktualisieren der Karte, wobei das Zeichen geändert wird, um die Bewegungsrichtung anzugeben. Die Zeichen werden vor der Rückkehr zurückgesetzt. Es wird auch davon ausgegangen, dass die Platine quadratisch ist (daher mussten einige der mehrzeiligen Testfälle geändert werden, um dieser Einschränkung zu entsprechen).

Erweitert:

// 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");
};
Milch
quelle