রান-লেংথ রেসার


18

আপনাকে দুটি টুকরো ইনপুট দেওয়া হবে: চলমান ট্র্যাককে সংজ্ঞায়িত করে রান-লেংথ এনকোডযুক্ত বিন্যাসের একটি স্ট্রিং এবং যেটি শুরু করার জন্য লেনটি উপস্থাপন করছে একটি মূলধন পত্র। উদাহরণস্বরূপ, "3a4A6b5B" স্ট্রিংটি "aaaAAAbbbbbBBBBB" তে প্রসারিত হয়েছে। তারপরে আপনি ট্র্যাক তৈরি করতে প্রসারিত স্ট্রিং ব্যবহার করুন, যেমন:

 A) aaaAAAA
 B) bbbbbbBBBBB

এটি দুটি লেন সহ একটি ট্র্যাক। ছোট হাতের অক্ষর বায়ুর প্রতিনিধিত্ব করে। আপনি বিমান চালাতে পারবেন না! বড় হাতের অক্ষরগুলি আপনি চালাতে পারেন এমন রাস্তার প্রতিনিধিত্ব করে। এই চ্যালেঞ্জের জন্য আপনার লক্ষ্যটি হ'ল বড় বড় চিঠি দেওয়া, সেই লেনে শুরু হওয়া কোনও রেসার কতদূর চালাতে পারে output তাদের উপরে বা নীচে সরাসরি কোনও টুকরো রাস্তা থাকলে রেসগুলি লেনে স্যুইচ করার অনুমতি দেয়। তাদের পিছনে দৌড়ানোর অনুমতিও রয়েছে! এই নির্দিষ্ট ট্র্যাকের উপর কোনও অক্ষরের ইনপুট জন্য আউটপুট 0 হয় , কারণ ট্র্যাকগুলির কোনওটিরই অবস্থান 1 এ চলমান রাস্তা নেই।

উদাহরণ:

ইনপুট: "4A5B4c3C", "এ"

এই কোডটি এমন ট্র্যাকটিতে প্রসারিত যা দেখে মনে হচ্ছে:

A) AAAA
B) BBBBB
C) ccccCCC

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

ইনপুট: "4A2B3D", "ডি"

ট্র্যাক:

A) AAAA
B) BB
C)
D) DDD

আউটপুটটি 3 , কারণ লেন ডি থেকে শুরু হওয়া কোনও রানার লেন বি বা এ যাওয়ার কোনও উপায় নেই

ইনপুট: "4A4a4A3b6B5C", "এ"

ট্র্যাক:

A) AAAAaaaaAAAA
B) bbbBBBBBB
C) CCCCC

আউটপুটটি 12 , কারণ A তে রানার বি তে স্যুইচ করতে পারে এবং তারপরে শেষে A তে ফিরে আসতে পারে। "সি" এর জন্য সর্বোচ্চ দূরত্বও 12 "" বি "এর জন্য এটি 0 হয় is

ইনপুট: "12M4n10N11O", "এম"

ট্র্যাক:

M) MMMMMMMMMMMM
N) nnnnNNNNNNNNNN
O) OOOOOOOOOOO

মাল্টি-ডিজিট রান-লেন্থ সহ সাধারণ উদাহরণ। আউটপুট 14

ইনপুট: "4A5B1b2B4c3C", "এ"

ট্র্যাক:

A) AAAA
B) BBBBBbBB
C) ccccCCC

আউটপুটটি 8 , কারণ এ-তে রানার নীচে বি-তে, তারপরে সি-তে চলে যেতে পারে, তারপরে বি-তে ফিরে আসবে (এই উদাহরণের জন্য FryAmTheEggmanকে ধন্যবাদ))

ইনপুট: "1a2A2a2B1c1C1d3D", "বি"

ট্র্যাক:

A)aAAaa
B)BB
C)cC
D)dDDD

আউটপুট 4 হয় । রানারকে দুটি পাথ দুটি পরীক্ষা করতে হবে যা আরও এগিয়ে যায়। (এই উদাহরণের জন্য ব্যবহারকারী 81655 ধন্যবাদ।)

ইনপুট: "2A1b1B2C1D3E", "এ"

ট্র্যাক:

A) AA
B) bB
C) CC
D) D
E) EEE

আউটপুট 3 । দূরতম গন্তব্যে পৌঁছতে আপনাকে পিছন দিকে দৌড়াতে হবে। (আবারও, উদাহরণস্বরূপ ব্যবহারকারী 81655 কে ধন্যবাদ।)

মন্তব্য:

  • যদি কোনও ট্র্যাকের কোনও নির্দিষ্ট অবস্থানে একটি চিঠি না থাকে, তবে এটি বায়ু হিসাবেও গণ্য। যেমন, যদি ইনপুটটি "Q" হয় এবং কোনও রাস্তাটি "Q" তে রাখা হয় না তবে আউটপুট হওয়া উচিত 0
  • ইনপুট দুটি টুকরা আছে। প্রথমটি একটি রান-দৈর্ঘ্যের এনকোডেড স্ট্রিং। দ্বিতীয়টি হ'ল বড় হাতের অক্ষর (আপনি এর জন্য স্ট্রিং বা চর ডেটাটাইপ ব্যবহার করতে পারেন read) পাঠযোগ্যতার জন্য এই ইনপুটগুলির মধ্যে কিছুটা যুক্তিসঙ্গত বিভাজক হওয়া উচিত (স্থান, নতুন লাইন, ট্যাব, কমা, আধা-কোলন)।
  • রান-দৈর্ঘ্যের এনকোডযুক্ত স্ট্রিং সবসময় বর্ণমালার ক্রমে উপাদানগুলি তালিকাভুক্ত করবে
  • একটি লেনের দীর্ঘতম দৈর্ঘ্য 1000 হতে পারে Therefore সুতরাং, সবচেয়ে বড় সম্ভাব্য আউটপুট 1000।

ট্র্যাক জেনারেটর:

আমাদের প্রথম উত্তরের সম্মানে, এখানে একটি ট্র্যাক জেনারেটর রয়েছে। বর্তমানের উত্তরগুলি স্টম্প করার জন্য কিছু নিয়ে আসার চেষ্টা করুন! (দ্রষ্টব্য: জেনারেটরের কোনও ত্রুটি বার্তা না দেখানোর কারণে আপনার ট্র্যাক কোডটি অবশ্যই কার্যকর হবে না proper সঠিক ফর্মের জন্য উপরের উদাহরণগুলি দেখুন))

function reset() {
    var t = document.getElementById("track");
    t.innerHTML = "";
    for(var i = 0;i<26;i++) {
      var c = String.fromCharCode(i+65);
      t.innerHTML += "<div><span>"+c+") </span><span id='"+c+"'></span></div>";
      
    }
  }

function rand() {
  var track = "";
  for(var i = 0;i<26;i++) {
  var blocks = Math.floor(Math.random()*4);
  var start = Math.floor(Math.random()*2);
  for(var j = 0;j<blocks;j++) {
    var letter = String.fromCharCode(65+i+32*((start+j)%2));
    var length = Math.floor(Math.random()*4)+1;
    track += length+letter;
  }
  }
  document.getElementById("code").value = track;
}

  function gen() {
  var s = document.getElementById("code").value;
    var check = s.match(/(\d+[A-Za-z])+/);
    if(check == null || check[0]!=s) {
      alert("Invalid Track");
      return false;
    }
    reset();
  var n = s.match(/\d+/g);
    var o = s.match(/[A-Za-z]/g);
    for(var i = 0;i<n.length;i++) {
      var c = o[i].toUpperCase();
      document.getElementById(c).textContent += o[i].repeat(n[i]);
    }
    return true;
    }
<body onload="reset()">
Track: <input type="text" id="code" size="75%" /><input type="submit" onclick="gen()" /><input type="button" value="Random Track" onclick="rand()" /><code id="track"/>
  </body>


3
স্যুইচ সিদ্ধান্ত এবং পিছনের দিকে চলমান এটি এখন ট্র্যাকের চেয়ে ধাঁধা বেশি: পি
ইউজার 81655

পরীক্ষার ক্ষেত্রে যেমন কেবল একটিই রাস্তা রয়েছে?
রিচিএইচবি

@ রিচিএইচবি একাধিক রুট থাকতে পারে।
জিওকাভেল

কেবল ভাবছেন যে, হয়তো অনুপস্থিত সি হ্যান্ডল করার জটিলতা 4A2B3Dকি সরিয়ে দেওয়া যেতে পারে? উদাহরণস্বরূপ, যোগ 0c? যদি তা না হয়, যখন বলা 1A1Zহয়, তখন কি প্রত্যাশা করা হয়, বাই লেনগুলি বিদ্যমান বলে ধরে নেওয়া হয়েছে (তবে খালি রয়েছে)?
কেনে

1
এছাড়াও, পিছনের দিকে দৌড়ানো একটি বিশাল সমস্যা। 12M4n10N11Oউদাহরণস্বরূপ, আউটপুট 14, তারপর মিথ্যা: M0 এ দীর্ঘতম পথ শুরু হয় এবং C0 এ সমাপ্ত, 25. একটি দৈর্ঘ্যের জন্য
Kenney

উত্তর:


3

পার্ল, 231 219 203 192 189 বাইট

+1 এর জন্য অন্তর্ভুক্ত -p

sub f{my($l,$p,$m)=@_;map{$m=$_>$m?$_:$m}f($l,$p+1)+1,f($l-1,$p),f($l+1,$p),f($l,$p-1)-1if$L[$l][$p]&&!$V{$l}{$p}++;$m}s/(\d+)(.)\s*/push@{$L[ord$2&~32]},(0|$2lt'a')x$1;()/ge;$_=0|f(ord,0)

কম গল্ফড:

sub f{                          # this is a recursive function, so we need locals.
    my($l,$p,$m)=@_;            # in: lane, position; local: max path length

    map{
      $m = $_ > $m ? $_ : $m    # update max
    }
    f( $l,   $p+1 )+1,          # same lane, forward
    f( $l-1, $p   ),            # left lane, same pos
    f( $l+1, $p   ),            # right lane, same pos
    f( $l,   $p-1 )-1           # same lane, backtrack
    if
        $L[$l][$p]              # check if there's road here
    && !$V{$l}{$p}++            # and we've not visited this point before.
    ;

    $m                          # return the max
}

s/(\d+)(.)\s*/                  # Parse RLE pattern, strip starting lane separator
  push@{ $L[ord$2&~32] }        # index @L using uppercase ascii-code, access as arrayref
  ,(0|$2lt'a')x$1               # unpack RLE as bitstring
  ;()                           # return empty list for replacement
/gex;                           # (x for ungolfing)
                                # $_ now contains trailing data: the start lane.

$_ =                            # assign output for -p
   0|                           # make sure we print 0 instead of undef/nothing
   f(ord,0)                     # begin calculation at start of current lane

চলমান

সঞ্চয় করুন উপরের কোড একটি ফাইলে (বলুন 231.pl)। আকারে ইনপুট (\d+\w)+ *\w। উদাহরণ: ইনপুট ট্র্যাক 4A5B4c3Cএবং গলি A:

echo 4A5B4c3C A | perl -p 231.pl

পরীক্ষা স্যুট

(গল্ফড নয়)

printf "==== Testing %s\n", $file = shift // '231.pl';

sub t{
    my($input,$expect) = @_;
#   $input =~ s/\s//g;
    printf "TEST %-20s -> %-3s: ", $input, $expect;

    $output = `echo $input | perl -p $file`;

    printf "%-3s  %s\n", $output,
    $output == $expect
    ? " PASS"
    : " FAIL: $output != $expect";

}

t("4A5B4c3C A", 7);
t("4A5B4c3C C", 0);
t("4A2B3D D", 3);
t("4A4a4A3b6B5C A", 12);
t("4A4a4A3b6B5C B",  0);
t("4A4a4A3b6B5C C", 12);
t("12M4n10N11O M", 14 );
t("4A5B1b2B4c3C A", 8);
t("1a2A2a2B1c1C1d3D B", 4 );
t("2A1b1B2C1D3E A", 3 );
t("10A9b1B8c2C9D1E11F A", 11);
  • 219 আপডেট করুন অ্যারে সূচকগুলি পুনরায় কাজ করে ।
  • 203 আপডেট পুনরাবৃত্তি পুনরুদ্ধার করে 16 বাইট সংরক্ষণ করুন।
  • বাদ দিয়ে 11 টি বাইট 192 আপডেট করুন@L=map{[/./g]}@Lপোস্ট প্রসেসিংটি সরিয়ে 112 ।
  • পরিবর্তে ifব্যবহার করে পোস্টফিক্সিং করে 189 সেভ 3 বাইট আপডেট করুনmapfor

আমি যদি এটি পার্ল জিনিস হয় না তবে এটি দ্রুত চলে।
জিওকাভেল

6

জাভাস্ক্রিপ্ট (ES6), 298 334 বাইট

(t,s)=>[a=[],t.match(/\d+(.)(\d+\1)*/gi).map(l=>a[c=l.match`[A-Z]`+"",n=c.charCodeAt(),c==s?i=n:n]=l[r="replace"](/\d+./g,p=>(p.slice(-1)<"a"?"1":"0").repeat(parseInt(p))),i=o=-1),...a.join``,a[i]?a[i]=a[i][r](/^1/,2):0].map(_=>a.map((l,y)=>a[y]=l[r](/1/g,(c,x)=>((a[y-1]||s)[x]|(a[y+1]||s)[x]|l[x-1]|l[x+1])>1?(x>o?o=x:0,2):c)))&&o+1

ব্যাখ্যা

মূলত এই সমাধানটি ট্র্যাকটিকে এক ধাঁধা হিসাবে বিবেচনা করে। এটি এটি খুঁজে পায় যেখানে রানার পক্ষে যে টাইলগুলি পৌঁছানো সম্ভব এবং যেখানে এটি পাওয়া গেছে তার সূচকগুলির সর্বাধিক মান প্রদান করে।

এটি প্রথম কাজটি হ'ল ইনপুট স্ট্রিংটিকে লাইনের একটি অ্যারেতে ডিকোড করা। অক্ষর যদিও ব্যবহার না করে পরিবর্তে এটি একটি মূল অক্ষরকে একটি 1এবং একটি ছোট হাতের অক্ষরে পরিণত করে 0। ফলস্বরূপ মানচিত্রটি এরকম কিছু দেখবে:

11100011
0011100
100111

এর পরে এটি প্রারম্ভিক ট্র্যাকের প্রথম টাইলটি তৈরি করে 2(কেবল এটি ইতিমধ্যে যদি থাকে 1) এবং এগুলির জন্য প্রতিটি টাইল চেক করে সংলগ্ন টাইলগুলি পরীক্ষা করে 2। যদি একটি 1সংলগ্ন থাকে 2এটি হয়ে যায় 2। রানার প্রথম লাইনে শুরু হলে উপরের মানচিত্রটি এটি হয়ে যাবে:

22200011
0022200
100222

একটির জন্য সর্বোচ্চ এক্স সূচক 2ফলাফল হয়।

আমি এটির প্রাথমিক সংস্করণটি যখন করেছি তখন আমি খুব ছোটখাট নজরদারি করেছি এবং এটি কাজ না হওয়া পর্যন্ত এটিতে হ্যাক করতে আমার 36 বাইট খরচ হয়েছে, সুতরাং সম্ভবত এখানে অনেক উন্নতি হতে পারে। *দীর্ঘশ্বাস*

Ungolfed

(t,s)=>
  [

    // Decode run-length encoded string into an array of track lanes
    a=[],                           // a = array of track line strings, 0 = air, 1 = tiles
    t.match(/\d+(.)(\d+\1)*/gi)     // regex magic that separates pairs by their letter
    .map(l=>                        // for each line of pairs
      a[                            // add the tiles to the array
        c=l.match`[A-Z]`+"",        // c = pair character
        n=c.charCodeAt(),           // n = index of line
        c==s?i=n:n                  // if this line is the starting line, set i
      ]=l[r="replace"](/\d+./g,p=>  // match each pair, p = pair
        (p.slice(-1)<"a"
          ?"1":"0").repeat(         // repeat 0 for air or 1 for ground
            parseInt(p)             // cast of match would return NaN because of the
          )                         //     letter at the end but parseInt works fine
      ),
        i=                          // i = index of starting line, initialise as invalid
          o=-1                      // o = output (max value of x)
    ),

  // Find all positions that are possible for the runner to get to
    ...a.join``,                   // add every letter of the track lines to an array
    a[i]?a[i]=a[i][r](/^1/,2):0    // set the starting tile to 2 if it is already 1
  ].map(_=>                        // loop for the amount of tiles, this is usually way
                                   //     more than necessary but allows for hard to reach
                                   //     tiles to be parsed
    a.map((l,y)=>                  // for each line l at index y
      a[y]=l[r](/1/g,(c,x)=>       // for each character c at index x

        // Replace a 1 with 2 if there is a 2 to above, below, left or right of it
        ((a[y-1]||s)[x]|(a[y+1]||s)[x]|l[x-1]|l[x+1])>1?
          (x>o?o=x:0,2):c          // set o to max value of x for a 2 tile
      )
    )
  )
  &&o+1                            // return o + 1

পরীক্ষা

বোনাস: আউটপুট পার্স করা মানচিত্র অন্তর্ভুক্ত!

var solution = (t,s)=>[a=[],t.match(/\d+(.)(\d+\1)*/gi).map(l=>a[c=l.match`[A-Z]`+"",n=c.charCodeAt(),c==s?i=n:n]=l[r="replace"](/\d+./g,p=>(p.slice(-1)<"a"?"1":"0").repeat(parseInt(p))),i=o=-1),...a.join``,a[i]?a[i]=a[i][r](/^1/,2):0].map(_=>a.map((l,y)=>a[y]=l[r](/1/g,(c,x)=>((a[y-1]||s)[x]|(a[y+1]||s)[x]|l[x-1]|l[x+1])>1?(x>o?o=x:0,2):c)))&&o+1
function generateMap() { var start = 0; a.some((l, i) => l ? start = i : 0); var end = 0; a.map((l, i) => l && i <= 90 ? end = i : 0); for(var output = "", i = start; i < end + 1; i++) output += String.fromCharCode(i) + ") " + (a[i] || "") + "\n"; return output; }
Track = <input type="text" id="track" value="2A1b1B2C1D3E" /><br />
Starting Letter = <input type="text" id="start" value="A" /><br />
<button onclick="result.textContent=solution(track.value,start.value)+'\n\n'+generateMap()">Go</button>
<pre id="result"></pre>

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