प्लेटफार्मों को स्थानांतरित करें!


9

चुनौती

या तो एक स्ट्रिंग (नए अंक हो सकते हैं), या एक दो आयामी सरणी, और एक सकारात्मक पूर्णांक दिया जाता है n, आउटपुट से प्लेटफ़ॉर्म की nस्थिति प्रारंभिक स्थिति के बाद बदल जाती है।


U, D, R, L प्लेटफ़ॉर्म हैं।

^, v, >, < प्लेटफ़ॉर्म की दिशाओं को बदलने वाले तीर हैं।

U, D, R, Lक्रमशः ऊपर, नीचे, दाएं और बाएं घूमें। जब एक तीर एक मंच के सामने होता है, तो यह दिशा बदलता है।

प्लेटफ़ॉर्म को प्रभावित करता है:

R<

D
^

v
U

>L

>L
 <

(शीर्ष तीर शीर्ष को प्रभावित करेगा L, लेकिन निचला तीर शीर्ष को प्रभावित नहीं करेगा 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: इस चुनौती के बारे में क्या स्पष्ट नहीं है?
लीकी नून

इसके आधार पर एक गूढ़ प्रोग्रामिंग भाषा बनाने का समय।
DanTheMan

इसके अलावा, यदि प्लेटफ़ॉर्म ग्रिड से दूर चला जाए तो क्या होगा?
Quelklef

@Quelklef आप मान सकते हैं कि प्लेटफ़ॉर्म nमुड़ने के बाद ग्रिड से दूर नहीं जाएंगे ।
acrolith

जवाबों:


2

सी #, 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");
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.