মারিও এই মানচিত্রের শেষে যেতে পারে


13

এমন একটি প্রোগ্রাম তৈরি করুন যা নির্ধারণ করে, পথের একটি ইনপুট দিলে, মারিও প্রান্তে পৌঁছতে পারে কিনা, Eশুরু থেকে চিহ্নিত করে , দ্বারা চিহ্নিত করা হয় S

কোনও পথ দেখতে এরকম কিছু দেখাবে:

S = E
=====

কোনও পথে, বিভিন্ন প্রতীক এবং সেগুলি উপস্থাপন করে:

  • =: প্রাচীর / মেঝে / সিলিং মারিও দেয়াল দিয়ে হাঁটতে পারে না, এবং কোনও মেঝে পেরিয়ে aুকতে পারে না বা ছাদ ছাড়তে পারে না (সে তার মাথায় আঘাত করবে)
  • (স্পেস): বায়ু। মারিও এটির মধ্য দিয়ে চলতে পারে এবং এটির মাধ্যমে লাফিয়ে উঠতে পারে এবং এর মধ্য দিয়ে পড়তে পারে
  • S: বায়ু, যেখানে মারিও শুরু হয় তা দেখানো ছাড়া। এটি সর্বদা ইনপুটটির বাম-কলামে স্থল স্তরে উপস্থিত হবে।
  • E: বায়ু, যেখানে মারিও পেতে চায় তা বাদ দেওয়া। এটি সর্বদা ইনপুটটির ডান-সর্বাধিক কলামে স্থল স্তরে উপস্থিত হবে।

ইনপুটটির যেখানে যেখানে মারিও হাঁটতে পারে সেখানে জায়গাগুলি থাকবে।

মারিও কেবল এগিয়ে যেতে পারে; এই উদাহরণে মারিও লক্ষ্য পেতে পারে না

S
===

 ===
   E
====

না তিনি এই এক করতে পারেন

    E
   ==
== 
  #==
==
   ==
==
S  ==
======

তবে, তিনি চিহ্নিত স্থানটিতে পৌঁছাতে পারেন #(যা ইনপুটটিতে প্রদর্শিত হবে না), কারণ তিনি উচ্চতর চারটি কোষে লাফিয়ে উঠতে পারেন; মারিও অতিমানবীয়। তাঁর অতিমানবীয়তার আরেকটি উদাহরণ হিসাবে:

S
=
=
=
=
=
= #
= =
=
=
=
=     E
=======

মারিও Eদুর্দান্ত দূরত্বটি পড়ে, বেঁচে থাকতে এবং শান্তভাবে হাঁটতে পারে E। মনে রাখবেন যে তিনি পৌঁছাতে পারবেন না #, কারণ মারিও সরাসরি নেমে পড়ে।

মারিও সত্যিই উঁচুতে লাফিয়ে উঠতে পারে , তবে তুলনা করে খুব বেশি এগিয়ে নয়।

S   E
== ==
 = =

মারিও এই ফাঁকটি ছুঁড়ে ফেলার চেষ্টা করতে পারে তবে সে ব্যর্থ হবে এবং সোজা হয়ে পড়বে।

মারিও এই সমস্ত উদাহরণে লক্ষ্যে পৌঁছতে পারে:

 E
 =
 =
 =
S=
==

 =
 =   E
S=   =
==   =
 =   =
 =====

S
=






=  E
====

এটি কোড গল্ফ, তাই খুব কম বাইট জয়!


2
পড়ন্ত উদাহরণে, আপনি উল্লেখ করেছেন যে "তিনি পৌঁছাতে পারবেন না #, কারণ মারিও সরাসরি নীচে পড়ে যান।" আমি যদি এটি সঠিকভাবে দেখছি তবে সে কি সোজা নীচে নেমে যাবে না #? এছাড়াও, জাম্পগুলি সর্বোচ্চ 4 স্পেস আপ এবং সর্বোচ্চ 1 স্পেস ডান হিসাবে সংজ্ঞায়িত করা হয়?
গিটারপিকার

4
@ গুইটারপিকার আমি ভেবেছিলাম প্রথমে পাশাপাশি তবে আপনি যদি ঘনিষ্ঠভাবে তাকান তবে দেখতে পাবেন যে এর সাথে কলামের আগে স্পেসের আর একটি কলাম রয়েছে #। দ্বিতীয় প্রশ্ন হিসাবে: আমি ওপি নই তবে আমি অনুমান করছি যে আপনি ঠিক আছেন। (
এটিই

1
তৃতীয় উদাহরণে (মারিওর জাম্পের উচ্চতা প্রদর্শন Eকরে ), ডান-সর্বাধিক কলামে উপস্থিত হবে না কারণ স্থল স্তরটি মানচিত্রের বাকী অংশ থেকে ডানদিকে এক প্রসারিত।
টেলর লোপেজ

1
@ জোফান:Mario cannot walk through wall , and cannot fall past a floor, or jump past a ceiling
টাইটাস

1
@ টিটাস আমি মারিওকে পরিষ্কার বাতাসে ঝাঁপিয়ে পড়া এবং বিভিন্ন ফ্লোরের অবতরণের জন্য পছন্দ করার কথা ভাবছি - সে কি নীচের দিকে যেতে পারবে?
জোফান

উত্তর:


11

স্লিপ , 38 27 25 বাইট

S>(`=<<`P{1,5}>`P>`P*)+#E

একটি আয়তক্ষেত্রটি প্যাড করার জন্য ইনপুটটির প্রয়োজন হয় যাতে প্রতিটি ঘরে মারিওকে ফাঁক করে দেওয়ার প্রয়োজন হয় (সম্ভাব্যভাবে একটি স্পেসে পূর্ণ একটি শীর্ষস্থানীয় রেখা সহ)। ছাপে পারেন (যার মধ্যে একটি স্ট্রিং বৈধ পথ প্রতিনিধিত্বমূলক S, Eএবং সমস্ত =গত ব্যতীত পদচারণা) অথবা কিছুই যদি কোনো পথ বিদ্যমান।

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

স্লিপটি আমাদের 2 ডি প্যাটার্নের সাথে মিলিত ভাষা নকশার চ্যালেঞ্জটিতে এসপি 3000 এর প্রবেশ ছিল । এটি কিছুটা রেগেক্সের 2 ডি-এক্সটেনশনের মতো যেখানে আপনি যখন বাম বা ডানদিকে বাঁক দেওয়ার অনুমতি দেওয়া বা প্রয়োজন হয় তখন আপনি ইঞ্জিনের কার্সরকে নির্দেশনা দিতে পারেন। এটিতে একটি সুবিধাজনক বৈশিষ্ট্য রয়েছে যেখানে আপনি কার্সারকে অগ্রসর হওয়া থেকে আটকাতে পারবেন, যা আপনাকে একক অবস্থানের সাথে পরপর দু'বার (বিভিন্ন নিদর্শন সহ) মেলাতে দেয়।

রিজেক্সে লুকের সাথে তুলনা করার মতো কিছু নেই স্লিপে, তবে যেহেতু আপনি যে কোনও অবস্থানের উপরে একাধিকবার যেতে পারেন, কেউ কেবল শর্তটি পরীক্ষা করতে পারে এবং তারপরে ফিরে আসতে পারে। আমরা প্রতিটি পদক্ষেপের পরে গ্রাউন্ড টাইলের মধ্যে দিয়ে কেবল যখন মাটিতে পড়ে যাই তা নিশ্চিত করতে এটি ব্যবহার করি।

S           Match the starting position S.
>           Turn right, so that the cursor points south.
(           One or more times... each repetition of this group represents
            one step to the right.
  `=          Match a = to ensure we've ended up on ground level before.
  <<          Turn left twice, so that the cursor points north.
  `P{1,5}     Match 1 to 5 non-punctuation characters (in our case, either space,
              S or E, i.e. a non-ground character). This is the jump.
  >           Turn right, so that the cursor points east.
  `P          Match another non-ground character. This is the step to the right.
  >           Turn right, so that the cursor points south.
  `P*         Match zero or more non-ground characters. This is the fall.
)+
#           Do not advance the cursor before the next match.
E           Match E, ensuring that the previous path ended on the exit.

9

জাভা 234 230 221 216 208 207 205 179 বাইটস

দেখো, আমি সি এবং অজগরকে মারলাম? আমি মানুষের মধ্যে সত্য অতিক্রম করেছি! সমস্ত কৌতুক একপাশে, এটি একটি মজাদার চ্যালেঞ্জ ছিল। নিম্নলিখিত ফাংশন একই দৈর্ঘ্য সহ প্রতিটি কলাম স্ট্রিংয়ের অ্যারের হিসাবে ইনপুট নেয়। এটি যদি নিয়মের বিরুদ্ধে হয় তবে দয়া করে আমাকে জানান। এটি একটি সফল মারিও রান অর্থ 1 এবং আউটপুট একটি ব্যর্থ মেরিও রান বোঝায় অন্য কোনও মান।

int m(String[]a){int l=a.length-1,z=a[l].indexOf(69),m=a[0].indexOf(83),i=1,x;a[l]=a[l].replace("E"," ");for(;i<=l;m=x,i++){if(m-(x=a[i].indexOf('='))>3|x<1)return-1;}return m-z;}

উদাহরণস্বরূপ ব্যবহার এবং আউটপুট সহ এখানে পুরানো যুক্তি (যা বর্তমান সংস্করণের অনুরূপ) is যুক্তি ব্যাখ্যা করে কিছু মন্তব্য

/**
 *
 * @author Rohans
 */
public class Mario {

    int m(String[] a) {
//declare variables for the finish the location of mario and the length
        int z, l = a.length - 1, m = a[0].indexOf("S");
        //treat the exit as a space
        z = a[l].indexOf("E");
        a[l] = a[l].replaceAll("E", " ");
        //go through the map
        for (int i = 1, x, r = 1; i <= l; i++) {
            //if mario can safely jump to the next platform (it picks the highest one)
            if (((x = a[i].indexOf("=")) != 0 && (x = a[i].indexOf(" =")) == -1) || m - x > 4) {
                return 0;
            }
            //adjust marios y location
            m = x;
        }
        //make sure mario made it to the end of the level
        return m == z ? 1 : 0;
    }

    public static void MarioTest(String... testCase) {
        System.out.println(new Mario().m(testCase) == 1 ? "Mario made it" : "Mario did not make it");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MarioTest("   S=", "=====", "     =", "     =", "=   =", "     E=");

    }

}



@ কার্লকাস্টার, আপনি আমাকে পেয়েছেন তবে প্রদত্ত পরীক্ষার কেসটি সঠিক is ইস্যুটি হ'ল এই অপিপটি কোনও পদক্ষেপে মারিও যেতে পারে এমন একাধিক উপায় থাকবে কিনা তা স্পষ্ট করে জানায়নি
রোহান ঝুনঝুনওয়ালা

ঠিক আছে, আমি ধরে নিয়েছি কারণ সেখানে অতিরিক্ত বাধা নির্দিষ্ট না করা থাকলে আমি সবসময় আরও জেনারাল সংস্করণটি ধরে রাখব।
কার্লকাস্টোর

@ কার্লকাস্টোর হ্যাঁ আপনার ডান
রোহান ঝুনঝুনওয়ালা

7

পাইথন, 260 239 222 215 209 206 বাইট,

আইডিয়নে চেষ্টা করুন (পরীক্ষার ক্ষেত্রে)

f=lambda m,y=-1,x=0:f(m,m[0].find("S"))if y<0else y<len(m[0])-1and x<len(m)and m[x][y]!="="and(m[x][y]=="E"or m[x][y+1]=="="and any(f(m,y-i,x+1)for i in range(5)[:(m[x][y::-1]+"=").find("=")])or f(m,y+1,x))

কল করুন: f([' S=', ' E='])

প্যাচ নোট:

এখন, অন্যান্য কয়েকটি সমাধানের মতো, ধরে নিই ইনপুটটি হ'ল কোলমন স্ট্রিংগুলির একটি অ্যারে, প্রতিটি "" দিয়ে শুরু হবে

পুরানো ইনপুট ফর্মের জন্য মোড়ানো: g=lambda x:f(map("".join,zip(*([" "*x.index("\n")]+x.split("\n")))))

এছাড়াও, আমি একটি বাগ স্থির করেছি যেখানে মারিও তার উপরের ব্লকগুলিতে ঝাঁপিয়ে পড়তে পারে।

ব্যাখ্যার সাথে নিরবচ্ছিন্ন সংস্করণ:

fপুনরাবৃত্তভাবে মারিও যে দিকে যেতে পারে সে দিকে সমস্ত কল করে y,x। এটি Trueযখন পৌঁছায় তখন ফিরে আসে "E"nd, যা gশেষ পর্যন্ত ফিরে না আসা পর্যন্ত সমস্ত ফাংশন কলগুলিতে ফিরে যায় True

def g(x):
    #create a array of strings which are the rows of the input
    global m
    m=x.split("\n")
    m=[" "*len(m[0])]+m # because Mario can jump over sometimes
    #Mario starts at the S
    return f([i for i,a in enumerate(m) if a[0]=="S"][0],0)

def f(y,x):
    #print y,x
    if y>len(m)-2 or x>=len(m[0]) or y<0: return False #out of bounds
    if m[y][x]=="E":return True #Reached the goal
    if m[y][x]=="=":return False #We got stuck inside a wall
    if m[y+1][x]=="=": #if you have ground under your feet
        for i in range(5): #jump max 4
            if f(y-i,x+1): #go one forward and try to go further from there
                return True
    return f(y+1,x) ##fall down

জাম্পিং যদি সাহায্য না করে তবে আপনি মাটিতে পড়ে যাবেন। elseফাইনালের আগে একটি যুক্ত করবেন return?
টাইটাস

5

শামুক , 41 37 29 বাইট

ওভারল্যাপিং পাথগুলি এড়ানো এবং 4 বাইট সংরক্ষণের জন্য কিছু সহায়তার জন্য ফেয়ারসামকে ধন্যবাদ।

=\S(^=d=\=u\ ,4(r!\=d.),r),\E

একটি আয়তক্ষেত্রটি প্যাড করার জন্য ইনপুটটির প্রয়োজন হয় যাতে প্রতিটি ঘরে মারিওকে ফাঁক করে দেওয়ার প্রয়োজন হয় (সম্ভাব্যভাবে একটি স্পেসে পূর্ণ একটি শীর্ষস্থানীয় রেখা সহ)।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

শামুকগুলি আমাদের 2 ডি প্যাটার্নের সাথে মিলিত ভাষা নকশার চ্যালেঞ্জটিতে ফেয়ারসামের প্রবেশ ছিল । স্লিপের মতো এটিও রেজেক্সের সাথে সমান, তবে প্রধান পার্থক্যটি হ'ল ক) এই উক্তিগুলি বাদ দিয়ে এই দৃ as়তা (চেহারা) এবং খ) সমর্থন করে, গ্রিডে কোনও কক্ষ দুটি বার অতিক্রম করা সম্ভব নয়। এটি এই সমস্যাটিকে কিছুটা জটিল করে তোলে, যেহেতু এমন কিছু মামলা রয়েছে যেখানে মারিওকে একটি গর্তের মধ্যে পড়ে আবার পিছনে ঝাঁপিয়ে পড়া দরকার, যেমন:

S E
= =
===

এই পার্থক্যগুলি ছাড়াও দুটি ভাষার সিনট্যাক্সও বেশ আলাদা হয়।

এই সমস্যাটি সমাধান করার জন্য যে আমরা কোনও ঘরে দু'বার প্রবেশ করতে পারি না, আমরা সর্বদা একটি উল্লম্ব পদক্ষেপের সাথে একটি অনুভূমিক পদক্ষেপটি বিকল্প করে থাকি। যাইহোক, এর অর্থ এই যে আমরা খতিয়ে নেওয়ার আগে আমাদের একটি পতন পরিচালনা করতে হবে। সুতরাং ফলসটি প্রযুক্তিগতভাবে গ্রাউন্ড টাইলগুলির মধ্য দিয়ে যাবে তবে আমরা নিশ্চিত করব যে এটি কেবল খোলার জায়গার পাশেই হবে।

=\S        Ensure that the match starts on an S, without actually matching it.
(          This group matches zero or more steps to the right (with a potential
           vertical step after each one).
  ^=         Match a non-ground cell, stepping right (on the first iteration,
             there is no step yet, so this matches the S).
  d=\=       Ensure that there's a ground tile below, so that the step ends on
             a valid position.
  u\ ,4      Match 0 to 4 spaces going up. This the optional jump.
  (          This group matches zero or more steps down, if a fall is valid here.
    r!\=       Ensure that there is no ground-tile right of the current cell.
    d.         Take one step down onto any character.
  ),
  r          Reset the direction to right for the next iteration.
),
\E        Match the exit.

4

সি, 256 236 213 197 বাইট

"এটি সর্বদা ইনপুটটির বাম-কলামে উপস্থিত হবে" দ্বারা 20 টি বাইট সংরক্ষিত হয়েছে "
23 বাইট সংরক্ষণ করেছেন @ রোহানঝুনঝুনওয়ালার কলাম-ভিত্তিক সিস্টেমের জন্য

পরীক্ষার কেস সহ এটি আদর্শে চেষ্টা করুন ...

k,y,x,h;f(v,l)char**v;{h=strlen(*v);x=strcspn(*v,"S");while(y<l&x<h)if(v[y][x]==69)return 0;else if(v[y][x+1]^61)x++;else{if(v[y+1][x]==61)while(k<4)if(v[y+1][x-++k]^61){x-=k;break;}y++;}return 1;}

ব্যবহার:

$ ./mario "S=" " =" " =" " =" "E="
main(c,v)char**v;{printf("%s",f(v+1,c-1)==0?"true":"false");}

ব্যাখ্যার সাথে নিরবচ্ছিন্ন:

k,y,x,h; //omitting int for saving 4 bytes, global variables initialize as 0 by default
f(v,l)char**v;{ //saving 2 bytes
    h=strlen(v[0]); //get height of map
    x=strcspn(v[0],"S"); //where is start point?
    while(y<l&&x<h) //while not out of bounds
        if(v[y][x]==69)return 0; //if we hit end return 0 (69 is ASCII E)
        else if(v[y][x+1]!=61)x++; //we fall one block if there isn't floor underneath us (61 is ASCII =)
        else{
            if(v[y+1][x]==61) //if there is a wall in front of us
                while(k<4) //start counting
                    if(v[y+1][x-++k]!=61){ //if found a way
                        x-=k; //go to there
                        break; //we don't want to jump multiple times
                    }
            y++; //finally, walk one block forwards
        }
    return 1; //if out of bounds
}

আইডিয়োন বলছেন যে একটি রানটাইম ত্রুটি আছে
টুকসক্রাফটিং

6
অপেক্ষা করুন, আপনি মোবাইলে কোডিং করছেন ಠ_ಠ
টুকসক্রাফটিং

4
হ্যাঁ, আমি আমার ল্যাপটপে কোক স্পিল করেছি: পি
বিটেসেগ

1
( কেবলমাত্র নিখরচতা নিশ্চিত করার জন্য বেটসেকের অর্থ নয় ) @ টেক্সক্রাফট্যাগ: এই সমাধানটি কি আপনার চ্যালেঞ্জের সাথে সামঞ্জস্যপূর্ণ কারণ এটি স্ট্রিংগুলির একটি অ্যারে নেয় (ইতিমধ্যে "\ n" এ বিভক্ত) এবং এতে ইনপুট হিসাবে দৈর্ঘ্য এবং প্রস্থও রয়েছে মানচিত্র (আপনার চ্যালেঞ্জের ইনপুট অংশ নয়)?
কার্লকাস্টোর


2

পিএইচপি, 399 338 284 265 251 বাইট

<?function w($m,$p){$w=strpos($m,"
")+1;if($p>strlen($m)|($p%$w)>$w-2|$p<0|'='==$m[$p])return 0;if('E'==$m[$p])die(1);if('='!=$m[$p+$w])return w($m,$p+$w);else for(;$z<5&'='!=$m[$q=$p-$w*$z];$z++)if(w($m,$q+1))die(1);}die(w($m=$argv[1],strpos($m,S)));

ইউনিক্স স্টাইল লাইন বিরতি এবং প্রতিটি লাইনে ফাঁকা স্থান সহ কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট প্রত্যাশা করে 1, 0ব্যর্থতার জন্য সাফল্যের জন্য প্রস্থান কোড ফেরত দেয়

ক্রিয়াকলাপ ভাঙ্গা

function w($m,$p) // function walk
{
    $w=strpos($m,"\n")+1;
    if($p<0|$p>strlen($m)|($p%$w)>$w-2  // too high / too low / too far right
        | '='==$m[$p]                   // or inside a wall
    )return 0;
    if('E'==$m[$p])return 1;            // Exit found
    if('='!=$m[$p+$w])return w($m,$p+$w); // no wall below: fall down
    else for($z=0;$z<5                  // else: jump
        & '='!=$m[$q=$p-$w*$z]          // do not jump through walls
        ;$z++)
        if(w($m,$q+1))                  // try to walk on from there
            return 1;
    // no success, return failure (NULL)
}
function m($i){$argv=[__FILE__,$i];
    return w($m=$argv[1],strpos($m,S));     // walk through map starting at position of S
}

পরীক্ষা (ফাংশন এম)

$cases=[
    // examples
    "S = E\n=====",0,
    "S   \n=== \n    \n ===\n   E\n====",0,
    "    E \n   == \n==    \n   == \n==    \n   == \n==    \nS  == \n======",0,
    "S      \n=      \n=      \n=      \n=      \n=      \n=      \n= =    \n=      \n=      \n=      \n=     E\n=======",1,
    "S   E\n== ==\n = = ",0,
    " E\n =\n =\n =\nS=\n==",1,
    "      \n =    \n =   E\nS=   =\n==   =\n =   =\n =====",1,
    "S   \n=   \n    \n    \n    \n    \n    \n    \n=  E\n====",1,
    // additional cases
    "S \n= \n=E",1,
    " == \n == \n    \nS==E\n==  ",1
];
echo'<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>';
while($cases)
{
    $m=array_shift($cases);
    $e=array_shift($cases);
    $y=m($m);
    $w=strpos($m,"\n");
    echo"<tr><td><div style=background-color:yellow;width:",$w*8,"px><pre>$m</pre></div>width=$w</td>
        <td>$y</td><td>$e</td><td>",$e-$y?'N':'Y',"</td></tr>";
}
echo'</table>';

1
যে কারও কাছে: আপনি দয়া করে আমাকে জানান যে আপনি এটিকে কেন বাদ দিয়েছেন?
টাইটাস

2

রুবি, 153 147 বাইট

দুঃখিত, জাভা ... আপনার কাজের জন্য সেরা নন-গল্ফ ল্যাং হিসাবে স্থানটি দখল করা হচ্ছে!

ইনপুট হ'ল কলামের স্ট্রিংগুলির একটি তালিকা, স্লিপ এবং শামুক সমাধানগুলি কীভাবে খালি জায়গার আয়তক্ষেত্রের সাহায্যে তাদের ইনপুটগুলিকে প্যাড করতে হবে তার স্টাইলে একক স্পেস সহ প্রেন্টড।

এটি অনলাইন চেষ্টা করুন!

f=->m,j=0,s=p{c,n=m[j,2]
s||=c=~/S/
e=c=~/E/
s+=1 while(k=c[s+1])&&k!=?=
s==e||(0..4).any?{|i|k&&s>=i&&c[s-i,i]!~/=/&&n&&n[s-i]!=?=&&f[m,j+1,s-i]}}

নুওও .... তবে আপনি কলামার স্ট্রিংয়ের আমার পদ্ধতিটি "ধার" করেছিলেন
রোহান ঝুনঝুনওয়ালা

1
আমি বলতে চাই, শীতল বাচ্চারা ইতিমধ্যে এটি করছিল। পরে একটি সারি-ভিত্তিক সমাধান ক্র্যাফট করুন, আমার বর্তমান কোডটি আপনার জাভাতে 10 বাইটের কাছে হারাতে রাখতে কলামগুলিতে সারিগুলিকে সংশোধন করার জন্য "দ্রুত ফিক্স" করুন, তবে একটি আসল সমাধান নির্বিশেষে সংক্ষিপ্ত হতে পারে
মান ইঙ্ক

2

গ্রিম, 46 বাইট (প্রতিদ্বন্দ্বী)

A=\E|[S ]&<\ {,-4}/0/./* \ /*/A/\=/./*>
n`\S&A

এই চ্যালেঞ্জ পোস্ট হওয়ার পরে আমি গ্রিমকে বেশ কয়েকবার আপডেট করেছি, সুতরাং এই উত্তরটি জয়ের পক্ষে উপযুক্ত নয়। কিছু পরিবর্তন এতো নতুন যে আমি সেগুলি টিআইওতে আনতে পারিনি, তবে একবার আমি করার পরে আপনি প্রোগ্রামটি চেষ্টা করে দেখতে পারেন । যাইহোক , আমার সংগ্রহস্থলটিতে একটি সংস্করণ রয়েছে যা এই কোডটি সঠিকভাবে পরিচালনা করে।

প্রোগ্রামটি মুদ্রিত করে 1যদি মারিও লক্ষ্যে পৌঁছতে পারে, এবং 0না হয়। ইনপুটটিতে মারিওতে যে জায়গাগুলি ঘুরে দেখার প্রয়োজন সেখানে সমস্ত জায়গাগুলি থাকতে হবে। সাধারণ ইনপুটগুলির জন্য, আমার কাছে নিম্নলিখিত 57-বাইট সমাধান রয়েছে:

A=\E|[ \bS]&<[ \b]{,-4}/0/[]/* [ \b]/*/A/\=/[]/*>
nb`\S&A

ব্যাখ্যা

উচ্চ স্তরের ব্যাখ্যাটি হ'ল Aপ্রথম লাইনে সংজ্ঞায়িত ননটার্মিনাল ইনপুটটির 1 × 1 উপ-আয়তক্ষেত্রের সাথে মেলে যেখানে মারিও লক্ষ্যে পৌঁছতে পারে। Aহয় আক্ষরিক হিসাবে সংজ্ঞায়িত করা হয়েছে E(মারিও ইতিমধ্যে লক্ষ্যে রয়েছে), বা একটি 1 × 1 প্যাটার্ন হিসাবে যা কিছু 2 × n এর আয়তক্ষেত্রের বাম কলামে একটি বৈধ মারিও যুক্ত Aকরে ডান কলামের অন্য ম্যাচে যায় containing দ্বিতীয় লাইনটি Aশুরুর চরিত্রটি ধারণ করে এমন মিলগুলির সংখ্যা গণনা করে Sএবং তা মুদ্রণ করে।

কোডটির ব্রেক-ডাউন এখানে দেওয়া হয়েছে:

A=\E|[ S]&<\ {,-4}/0/./* \ /*/A/\=/./*>
A=                                       Define A as
  \E|                                    a literal E, or
     [ S]&                               a literal space or S
          <                           >  contained in a larger rectangle
                                         that this bracketed expression matches.
           \ {,-4}/0/./*                 Left half of the bracketed expression:
           \ {,-4}                        Rectangle of spaces with height 0-4,
                  /                       below that
                   0                      the 1x1 rectangle we're currently matching,
                    /.                    below that any 1x1 rectangles
                      /*                  stacked any number of times vertically.
                         \ /*/A/\=/./*   Right half of the bracketed expression:
                         \ /*             Spaces stacked vertically,
                             /A           below that another match of A,
                               /\=        below that a literal =,
                                  /./*    below that 1x1 rectangles stacked vertically.

ধারণাটি হ'ল \ {,-4}বাম দিকের অংশটি সেই জায়গার সাথে মেলে যা দিয়ে মারিও উপরের দিকে লাফ \ /*দেয় এবং ডান দিকের অংশটি স্পেস ট্রিটের সাথে মেলে যা তার পরে নীচে পড়ে। আমাদের প্রয়োজন যে তিনি একটি ম্যাচে A(যেহেতু আমরা লক্ষ্যে পৌঁছাতে চাই) একটি ম্যাচে নেমেছি যা এটির শীর্ষে রয়েছে =। উভয় কলামের নীচে উল্লম্ব স্ট্যাকগুলি কেবল গ্যারান্টি দিবে যে কলামগুলির একই উচ্চতা রয়েছে, তাই আমরা সেগুলি সংমিশ্রণ করতে পারি (এটি মাঝের একক স্থানটি কী করে)। এখানে পূর্বোক্ত আয়তক্ষেত্রগুলিতে বিভক্ত উদাহরণস্বরূপ লাফের একটি ASCII আর্ট ডায়াগ্রাম রয়েছে এবং *এর দ্বারা ফাঁকা স্থানগুলি রয়েছে :

Left column:     Right column:   +---+---+
a = \ {,-4}      d = \ /*        | * | * |
b = 0            e = A           +   +   + d
c = ./*          f = \=          | * | * |
                 g = ./*       a +   +---+
                                 | * | * | e
                                 +   +---+
                                 | * | = | f
                                 +---+---+
                               b | S | = |
                                 +---+   | g
                               c | = | * |
                                 +---+---+

দ্বিতীয় লাইনে, বিকল্পটি nপ্রথম ম্যাচটি সন্ধান করার পরিবর্তে সমস্ত ম্যাচের গণনা ট্রিগার করে। সাধারণ সমাধানে, স্পেসগুলি ইনপুট অক্ষরের বাইরেও বিশেষ হতে পারে এবং বিকল্পের bফলে ইনপুটটিকে আউট-অফ-ইনপুট অক্ষর দিয়ে প্যাড করা হয়।

আমি আশা করি এই সমস্তটি বোধগম্য হয়!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.