Ordinamento rotazione matrice


12

Consente di definire una matrice non vuota, non ordinata e finita con numeri univoci come segue:

N={457136}

Consente di definire 4 mosse della matrice come:

  • ↑ * (su): sposta una colonna verso l'alto
  • ↓ * (giù): sposta una colonna verso il basso
  • → * (destra): sposta una riga a destra
  • ← * (sinistra): sposta una riga a sinistra

L'asterisco (*) rappresenta la colonna / riga interessata dallo spostamento (può essere indicizzata 0 o 1 indicizzata. A te. Indica quale nella tua risposta).


La sfida è, usando le mosse sopra, ordinare la matrice in ordine crescente (essendo l'angolo in alto a sinistra il più basso e l'angolo in basso a destra il più alto).

Esempio

N={423156}
↑0↓0


N={231456}
→0


N={457136}
↑0↑1←1↑2


N={596824173}
↑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}


Appunti

  • Possono esserci diversi output corretti (non è necessario che siano necessariamente gli stessi dei casi di test o di quelli più brevi)
  • Puoi presumere che sarà sempre un modo per ordinare la matrice
  • Edges si connette (come pacman: v)
  • Non ci sarà una matrice con più di 9 colonne o / e righe
  • Supponiamo che la matrice contenga solo numeri interi univoci positivi diversi da zero
  • È possibile utilizzare 4 valori distinti diversi dai numeri per rappresentare le mosse (in tal caso, si prega di dichiararlo nella risposta)
  • La colonna / riga può essere 0 o 1 indicizzata
  • Criteri vincenti

Casi di prova extra sono sempre ben accetti


5
Ecco un sito Web in cui è possibile risolvere questi puzzle da soli.
Maniglia della porta

1
@Doorknob Sarebbe stato utile quando stavo scrivendo la sfida Dx. Grazie comunque!
Luis felipe De jesus Munoz,

Non credo che tu dica da nessuna parte che la soluzione fornita deve essere la più breve possibile. È intenzionale? Ad esempio è ←0←0una soluzione valida per il secondo esempio in cui è stata fornita una soluzione come →0. Se lo è, penso che metà delle opzioni di spostamento probabilmente non verranno utilizzate.
FryAmTheEggman,


1
Inoltre alcune persone potrebbero voler provare openprocessing.org/sketch/580366 realizzato da uno youtuber chiamato carykh. Si chiama "loopover"
Gareth Ma

Risposte:


3

JavaScript (ES6),  226  219 byte

Ricerca della forza bruta, usando le mosse destra ( "R") e giù ( "D").

Restituisce una stringa che descrive le mosse o una matrice vuota se la matrice di input è già ordinata. Le colonne e le righe nell'output sono indicizzate 0.

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)

Provalo online!

Commentate

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

Bella risposta. Sai se esiste un algoritmo efficiente per questo, o se è possibile determinare il numero massimo di mosse che una soluzione può fare senza forzare brutalmente?
Giona

1
@Jonah Ecco un documento che descrive una soluzione e fornisce un limite superiore del numero di mosse. (Vedi anche questa sfida che è fondamentalmente lo stesso compito con un diverso criterio vincente.)
Arnauld

Wow, grazie @Arnauld
Giona

2

Python 2 , 296277245 Python 3 , 200 194 byte

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

Provalo online!

-19: non erano necessarie le frecce unicode ...
-32: leggermente rielaborate, ma prestazioni molto più lente in media.
-45: ha preso ispirazione dalla risposta di @ Arnauld. Passato a Python 3 per f''(-4 byte)
-6: range( )r_[: ] , diff(ravel( ))ediff1d( )


Cerca esaustivamente combinazioni di tutte le mosse possibili e →0. Timeout sul terzo caso di test.

Since →nè equivalente a

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

dove re csono i numeri di righe e colonne, queste mosse sono sufficienti per trovare ogni soluzione.


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

>vcorrisponde rispettivamente a →↓. (altri non definiti)


0

Gelatina , 35 byte

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

Provalo online!

Programma completo. Le uscite si spostano su STDOUT usando L per sinistra e R per destra. Continua a provare mosse casuali fino a quando la matrice non viene ordinata, quindi non molto efficiente in termini di velocità o complessità algoritmica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.