গ্র্যাভিটি স্যুইচিং


14

চ্যালেঞ্জ

কোনও যুক্তিসঙ্গত পদ্ধতিতে আপনাকে ইনপুট হিসাবে সমতলে অক্ষরের একটি ASCII- শিল্প উপস্থাপনা দেওয়া হয়। এটিতে কেবল এটিই থাকবে:

  • [a-z]চলনযোগ্য অক্ষর উপস্থাপন। প্রতিটি চিঠি বোর্ডে একবারে উপস্থিত হবে।
  • # স্থাবর দেয়াল উপস্থাপন
  • . খালি জায়গা উপস্থাপন

উদাহরণ স্বরূপ:

abcdef.gh#..
.......ij.#.
#..#.......#
...#.#...###
.#.......#q#
.........###

আপনাকে মাধ্যাকর্ষণ পরিবর্তনের প্রতিনিধিত্ব করে একটি স্ট্রিংও দেওয়া হবে। এটিতে কেবল এটিই থাকবে:

  • > ডানদিকের মাধ্যাকর্ষণ পরিবর্তনের প্রতিনিধিত্ব করে
  • < বাম দিকের মাধ্যাকর্ষণ পরিবর্তনের প্রতিনিধিত্ব করে
  • ^ উপরের মাধ্যাকর্ষণ পরিবর্তন প্রতিনিধিত্ব করে
  • v নিম্ন মাধ্যাকর্ষণ পরিবর্তনের প্রতিনিধিত্ব করে

উদাহরণ স্বরূপ:

v>^

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

এই উদাহরণে, শুরুতে সেখানে নিম্নগামী মাধ্যাকর্ষণ আছে ( v), তাই c, e, g, h, i, এবং jবন্ধ মানচিত্রের নীচে পড়া। অন্য সমস্ত অক্ষর কোনও দেয়াল আঘাত না করা পর্যন্ত নীচের দিকে স্লাইড হয়, মানচিত্রটি এভাবে রেখে যায়:

.........#..
a..d......#.
#..#.f.....#
.b.#.#...###
.#.......#q#
.........###

তারপরে, আমরা ডানদিকের মাধ্যাকর্ষণ ( >) -এর দিকে এগিয়ে যাই , যা আমাদের এটিকে রেখে দেয়: নোট করুন কীভাবে aপাশের স্ট্যাকগুলি d।

.........#..
........ad#.
#..#......f#
..b#.#...###
.#.......#q#
.........###

অবশেষে, আমরা উপরের মাধ্যাকর্ষণ ( ^) অনুকরণ করি , যার সময় aএবং bমানচিত্রটি পড়ে যায়।

.........#..
.........d#.
#..#......f#
...#.#...###
.#.......#q#
.........###

আপনার কাজটি মাধ্যাকর্ষণ শিফটের পরে অবশিষ্ট অক্ষরগুলি আউটপুট করা। এগুলি যে কোনও ক্রমে দেওয়া যেতে পারে। এই উদাহরণস্বরূপ, আপনি এর যেকোন অনুক্রমের আউটপুট করতে পারেন dfq।

Testcases

নিম্নলিখিত মানচিত্রের জন্য:

abcde
.....
##.##
v   =  abde
v>  =  <nothing>

নিম্নলিখিত মানচিত্রের জন্য:

######
#....#
abcdef
#.gh..
######
>   = <nothing>
<   = gh
^>  = bcde
v<  = bghef

কীভাবে ইনপুট দেওয়া হয়? স্ট্রিংয়ের তালিকা? ফাংশন যুক্তি? Stdin?
— ফাঁস নুন

@ কেনেনিলাউ এই সমস্ত অপশন ভাল আছে। ইনপুট এবং আউটপুট আপনার ভাষার জন্য উপযুক্ত কিছু হতে পারে be
— জ্রিচ

উত্তর:


4

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

(m,d,r=`replace`)=>[...d].map(c=>[...`<^>v`].map(d=>m=[...(m=(c==d?m[r](/[.\w]+/g,s=>s[r](/\./g,``)+s[r](/\w/g,``))[r](/^\w+/gm,s=>s[r](/./g,`.`)):m).split`
`)[0]].map((_,i)=>m.map(s=>s[i]).join``).reverse().join`
`))&&m[r](/\W/g,``)

সম্পাদনা: 18 ওয়াটিংটনগুয়েডসকে ধন্যবাদ 18 বাইট সংরক্ষণ করা হয়েছে।

প্রতিটি দিকনির্দেশক চরিত্রের জন্য ইনপুট গ্রিডটি চারবার আবর্তিত করে কাজ করে, তবে দিকনির্দেশক চরিত্রটি লুপ চরিত্রের সাথে যেদিকে মেলে সেদিকে আমরা বাম মাধ্যাকর্ষণ জিনিসটি করি। সুডোকোড:

function slideleft(map) {
    map = map.replace(/[.\w+]/g, match=>movedotstoend(match));
    map = map.replace(/^\w+/gm, match=>changetodots(match));
}
function rotate(map) {
    return joinrows(reverse([for each (column of rows(map)[0])
            joinrow([for each (row of rows(map)) row[column]])
           ]));
}
function gravity(map, directions) {
    for each (direction of directions) {
        for each (angle of '<^>v') {
            if (direction == angle) map = slideleft(map);
            map = rotate(map);
        }
    }
    return letters(map);
}

3

জাভাস্ক্রিপ্ট (ES6), 199

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

x=>y=>(x=>{for(d of y){R='';for(e of'^>v<')x=[...x[0]].map((c,i)=>e!=d?x.map(r=>r[i]).join``:x.map(r=>(c=r[i])<'.'?(q+=p+c,p=''):c>'.'&&q?(q+=c,R+=c):p+='.',q=p='')&&q+p).reverse();}})(x.split`
`)||R

F=x=>y=>(x=>{for(d of y){R='';for(e of'^>v<')x=[...x[0]].map((c,i)=>e!=d?x.map(r=>r[i]).join``:x.map(r=>(c=r[i])<'.'?(q+=p+c,p=''):c>'.'&&q?(q+=c,R+=c):p+='.',q=p='')&&q+p).reverse();}})(x.split`
`)||R

// Less golfed

U=(x,y)=>
{
  x = x.split`\n`;
  for(d of y)
  {
    R = '';
    for(e of '^>v<')
      x = [...x[0]].map( 
        (c,i) => e != d
        ? x.map( r => r[i] ).join`` // basic rotation
        : x.map( // rotation with gravity shift
          r=> (c=r[i])<'.' ? (q+=p+c,p='') : c>'.'&&q?(q+=c,R+=c) : p+='.', q=p=''
        ) && q+p
      ).reverse();
  }
  return R
}

console.log=x=>O.textContent+=x+'\n'

;[
  ['abcdef.gh#..\n.......ij.#.\n#..#.......#\n...#.#...###\n.#.......#q#\n.........###',
   [['v>^','dfq']]
  ],
  ['abcde\n.....\n##.##',[['v','abde'],['v>','']]],
  ['######\n#....#\nabcdef\n#.gh..\n######',[['>',''],['<','gh'],['^>','bcde'],['v<','befgh']]]
].forEach(t => {
  var i=t[0]
  console.log(i)
  t[1].forEach(([d,k])=>{
    var r=F(i)(d),ok=[...r].sort().join``==k
    console.log((ok?'OK ':'KO ')+d+' : '+r+(ok?'':' (expected '+k+')'))
  })
  console.log('')
})
<pre id=O></pre>


2

পাইথ, 143 বাইট

(আমাদের কি আসলেই এতটা বাইট দরকার?)

JhQKeQMe.u:N+"\."H+H"."G;DybVkI}NG=gkN;D'bVlJ=k@JNykVkI}HG=:kH\.).?B)=XJNk;VKIqN\<'J)IqN\v=C_J'J=_CJ)IqN\>=C_CJ'J=C_CJ)IqN\^=CJ'J=CJ;VJVNI}HGpH

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

কিভাবে এটা কাজ করে

আমরা একটি ফাংশন সংজ্ঞায়িত করি leftযা বাম দিকের মাধ্যাকর্ষণ জিনিসটি করে।

তারপরে, অন্যান্য দিকগুলি অ্যারের সাথে জগাখিচু করে প্রয়োগ করা হয় যাতে কাঙ্ক্ষিত দিকটি বাম দিকে থাকে, তারপরেও left।

এর অ্যালগরিদম leftএখানে:

  • আদর্শহীন অবধি নিম্নলিখিতটি করুন:
  • প্রতিস্থাপন ".X"সঙ্গে "X.", যেখানে Xএকটি চিঠি প্রতিনিধিত্ব করে।

পুরো প্রোগ্রামটি নিম্নলিখিত 6 বিভাগে বিভক্ত:

JhQKeQ
Me.u:N+"\."H+H"."G;
DybVkI}NG=gkN;
D'bVlJ=k@JNykVkI}HG=:kH\.).?B)=XJNk;
VKIqN\<'J)IqN\v=C_J'J=_CJ)IqN\>=C_CJ'J=C_CJ)IqN\^=CJ'J=CJ;
VJVNI}HGpH

প্রথম বিভাগ

JhQKeQ     Q auto-initialized to evaluate(input())
JhQ        J = Q[0]
   KeQ     K = Q[len(Q)-1]

দ্বিতীয় বিভাগ

Me.u:N+"\."H+H"."G;   @memoized
M                 ;   def g(G,H):
  .u             G      repeat_until_idempotent(start:G, as N):
    :Nxxxxxxyyyyy         return N.replace(xxxxxx,yyyyy)
      +"\."H                               "\."+H
            +H"."                                 H+"."

তৃতীয় বিভাগ

DybVkI}NG=gkN;    @memoized
Dyb          ;    def y(b):
   Vk               for N in k:     --TAKES GLOBAL VARIABLE k
     I}NG             if N in G:    --G pre-initialized to "abcde...z"
         =gkN           k = g(k,N)

চতুর্থ বিভাগ

D'bVlJ=k@JNykVkI}HG=:kH\.).?B)=XJNk;  @memoized
D'b                                ;  def single_quote(b):
   VlJ                       )          for N in range(len(J)): --TAKES GLOBAL VARIABLE J
      =k@JN                               k = J[N] --SETS GLOBAL VARIABLE k
           yk                             y(k) --returns nothing, but MODIFIES GLOBAL VARIABLE k
             Vk                           for H in k:
               I}HG      )                  if H in G:
                   =:kH\.                     k = k.replace(H,".")
                          .?                else:
                            B                 break
                              =XJNk     J[N] = k --MODIFIES GLOBAL VARIABLE J

পঞ্চম বিভাগ

VKIqN\<'J)IqN\v=C_J'J=_CJ)IqN\>=C_CJ'J=C_CJ)IqN\^=CJ'J=CJ;
VK                                                       ; for N in K:
  IqN\<  )                                                   if N == '<':
       'J                                                      single-quote(J)
          IqN\v          )                                   if N == 'v':
               =C_J                                            J = transpose(reverse(J))
                   'J                                          single-quote(J)
                     =_CJ                                      J = reverse(transpose(J))
                          IqN\>            )                 if N == '>':
                               =C_CJ                           J = transpose(reverse(transpose(J)))
                                    'J                         single-quote(J)
                                      =C_CJ                    J = transpose(reverse(transpose(J)))
                                            IqN\^            if N == '^':
                                                 =CJ           J = transpose(J)
                                                    'J         single-quote(J)
                                                      =CJ      J = transpose(J)

ষষ্ঠ বিভাগ

VJVNI}HGpH
VJ           for N in J:
  VN           for H in N:
    I}HG         if H in G: --G = "abc...z"
        pH         print(H)

1

রুবি, 306 বাইট

বেনামে ফাংশন। বেশিরভাগ সার্কিটাস প্রযুক্তি যা সম্ভবত অনুকূলিত হতে পারে।

->s,d{w=[];x=y=0;m={}
s.chars.map{|c|c>?!?(c<?A?c<?.?w<<[x,y]:0:m[c]=[x,y]
x+=1):(x=0;y+=1)}
d.chars.map{|c|q=[c<?=?-1:c<?A?1:0,c>?a?1:c>?A?-1:0];e=1
(n=m.clone.each{|k,v|z=[v[0]+q[0],v[1]+q[1]]
w.index(z)||m.value?(z)?0:m[k]=z}
m.reject!{|k,v|i,j=v;i<0||i>=x||j<0||j>y}
e=(m!=n ?1:p))while e}
m.keys.join}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.