Matris dönüşü sıralaması


12

Boş, sıralanmamış ve sonlu matrisi aşağıdaki gibi benzersiz sayılarla tanımlayalım:

N-={457136}

4 matris hareketini şu şekilde tanımlayalım:

  • ↑ * (yukarı): Bir sütunu yukarı taşır
  • ↓ * (aşağı): Bir sütunu aşağı taşır
  • → * (sağ): Bir satırı sağa taşır
  • ← * (sol): Bir satırı sola taşır

Yıldız işareti (*), hareketten etkilenen sütunu / satırı temsil eder (0 dizinli veya 1 dizinli olabilir. Size kalmış. Lütfen yanıtınızda hangisini belirttiğinizi belirtin).


Meydan , hamle yukarıda (sol üst köşede düşük ve sağ alt köşede en yüksek olmak üzere) bir yükselen sırayla sıralama matrisi kullanılarak vardır.

Misal

Giriş:

N-={423156}
Olası Çıkış: ↑0veya ↓0. (Bu hareketlerden herhangi birinin matrisi sıralayabileceğine dikkat edin, böylece her iki cevap da doğrudur)


Giriş:

N-={231456}
Olası Çıktı:→0


Giriş (Örnek test örneği):

N-={457136}
Olası Çıkış:↑0↑1←1↑2


Giriş:

N-={596824173}
Olası Çıktı: ↑0↑2→0→2↑0→2↑1↑2←1


N-={127282961023451778139151112181426162119203022232425}
↑2↑1←3→0←3↓0←0←2→3↑3↑4


N-={1}


N-={1234}


notlar

  • Farklı doğru çıktılar olabilir (mutlaka test senaryolarıyla veya en kısa olanla aynı olması gerekmez)
  • Her zaman matrisi sipariş etmenin bir yolu olacağını varsayabilirsiniz.
  • Kenarlar bağlanır (pacman gibi: v)
  • 9'dan fazla sütun veya satır içeren bir matris olmayacak
  • Matrisin yalnızca pozitif sıfır olmayan benzersiz tamsayılar içerdiğini varsayın
  • Hareketleri temsil etmek için sayılar dışında 4 farklı değer kullanabilirsiniz (bu durumda lütfen cevabınızda belirtin)
  • Sütun / satır 0 veya 1 dizine eklenebilir
  • Kazanma kriterleri

Ekstra test vakaları her zaman beklerim


5
İşte bu bulmacaları kendiniz çözebileceğiniz bir web sitesi .
Kapı tokmağı

1
@Doorknob Ben Dx meydan okuma yazarken yararlı olurdu. Yine de teşekkürler!
Luis felipe De jesus Munoz

Hiçbir yerde, verilen çözümün mümkün olduğunca kısa olması gerektiğini söylemediğinizi sanmıyorum. Bu kasıtlı mı? Örneğin←0←0 bir çözüm verdiğiniz ikinci örnek için geçerli bir çözümdür →0. Öyleyse, taşıma seçeneklerinin yarısının muhtemelen kullanılmayacağını düşünüyorum.
FryAmTheEggman


1
Ayrıca bazı insanlar carykh adlı bir youtuber tarafından yapılan openprocessing.org/sketch/580366'yı denemek isteyebilir. Buna "loopover" denir
Gareth Ma

Yanıtlar:


3

JavaScript (ES6),  226  219 bayt

Kaba kuvvet arama, sağ ( "R") ve aşağı ( "D") hareketlerini kullanarak.

Hareketleri açıklayan bir dize veya giriş matrisi zaten sıralanmışsa boş bir dizi döndürür. Çıktıdaki sütunlar ve satırlar 0 dizinlidir.

f=(m,M=2)=>(g=(s,m)=>m[S='some'](p=r=>r[S](x=>p>(p=x)))?!s[M]&&m[0][S]((_,x,a)=>g(s+'D'+x,m.map(([...r],y)=>(r[x]=(m[y+1]||a)[x])&&r)))|m[S]((_,y)=>g(s+'R'+y,m.map(([...r])=>y--?r:[r.pop(),...r]))):o=s)([],m)?o:f(m,M+2)

Çevrimiçi deneyin!

Yorumlananlar

f =                              // f = main recursive function taking:
(m, M = 2) => (                  //   m[] = input matrix; M = maximum length of the solution
  g =                            // g = recursive solver taking:
  (s, m) =>                      //   s = solution, m[] = current matrix
    m[S = 'some'](p =            // we first test whether m[] is sorted
      r =>                       // by iterating on each row
        r[S](x =>                // and each column
          p > (p = x)            // and comparing each cell x with the previous cell p
        )                        //
    ) ?                          // if the matrix is not sorted:
      !s[M] &&                   //   if we haven't reached the maximum length:
      m[0][S]((_, x, a) =>       //     try all 'down' moves:
        g(                       //       do a recursive call:
          s + 'D' + x,           //         append the move to s
          m.map(([...r], y) =>   //         for each row r[] at position y:
            (r[x] =              //           rotate the column x by replacing r[x] with
              (m[y + 1] || a)[x] //           m[y + 1][x] or a[x] for the last row (a = m[0])
            ) && r               //           yield the updated row
      ))) |                      //
      m[S]((_, y) =>             //     try all 'right' moves:
        g(                       //       do a recursive call:
          s + 'R' + y,           //         append the move to s
          m.map(([...r]) =>      //         for each row:
            y-- ?                //           if this is not the row we're looking for:
              r                  //             leave it unchanged
            :                    //           else:
              [r.pop(), ...r]    //             rotate it to the right
      )))                        //
    :                            // else (the matrix is sorted):
      o = s                      //   store the solution in o
)([], m) ?                       // initial call to g(); if we have a solution:
  o                              //   return it
:                                // else:
  f(m, M + 2)                    //   try again with a larger maximum length

Güzel cevap. Bunun için etkili bir algo olup olmadığını veya bir çözümün kaba zorlama olmadan yapabileceği maksimum hareket sayısını belirlemek mümkün mü biliyor musunuz?
Jonah

1
@Jonah İşte bir çözümü tanımlayan ve hamle sayısının üst sınırını veren bir makale. (Ayrıca , temel olarak farklı bir kazanan kriterle aynı görev olan bu zorluğa bakın .)
Arnauld

Vay be, teşekkür ederim @Arnauld
Jonah

2

Piton 2 , 296 277 245 piton 3 , 200 194 bayt

from numpy import*
def f(p):
 s='';u=[]
 while any(ediff1d(p)<0):u+=[(copy(p),s+f'v{v}',f':,{v}')for v in r_[:shape(p)[1]]]+[(p,s+'>0',0)];p,s,i=u.pop(0);exec(f'p[{i}]=roll(p[{i}],1)')
 return s

Çevrimiçi deneyin!

-19: unicode oklara gerek yoktu ...
-32: biraz elden geçirildi, ancak ortalamada çok daha yavaş performans.
-45: @ Arnauld'un cevabından biraz ilham aldı. f''(-4 bayt)
-6 için Python 3 olarak değiştirildi : range( )r_[: ] , diff(ravel( ))ediff1d( )


Tüm olası kombinasyonları ayrıntılı bir şekilde arar hareketlerin ve →0. Üçüncü test vakasında zaman aşımına uğradı.

Çünkü →neşittir

01...↓(c-1) 	... repeated r-n times
0
01...↓(c-1)	... repeated n times

nerede rve csatır ve sütun sayısı, bu hamle her çözümü bulmak için yeterlidir.


from numpy import*
def f(p):
    s=''                                    #s: sequence of moves, as string
    u=[]                                    #u: queue of states to check
    while any(ediff1d(p)<0):                #while p is not sorted
        u+=[(copy(p),s+f'v{v}',f':,{v}')    #add p,↓v to queue
            for v in r_[:shape(p)[1]]]      # for all 0<=v<#columns
        u+=[(p,s+'>0',0)]                   #add p,→0
        p,s,i=u.pop(0)                      #get the first item of queue
        exec(f'p[{i}]=roll(p[{i}],1)')      #transform it
    return s                                #return the moves taken

>vsırasıyla karşılık gelir →↓. (diğerleri tanımsız)


0

Jöle , 35 bayt

ṙ€LXȮƊ¦1
ÇZÇZƊ⁾ULXȮOịØ.¤?F⁻Ṣ$$¿,“”Ṫ

Çevrimiçi deneyin!

Tam program. Çıktılar sol için L ve sağ için R kullanarak STDOUT'a taşınır. Matris sıralanana kadar rastgele hareketleri denemeyi sürdürür, bu nedenle hız veya algoritmik karmaşıklık açısından çok verimli değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.