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

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