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

↓0↓1...↓(c-1) 	... repeated r-n times
→0
↓0↓1...↓(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.