Матрица вращения


12

Давайте определим непустую, несортированную и конечную матрицу с уникальными числами следующим образом:

N={457136}

Давайте определим 4 перемещения матрицы как:

  • ↑ * (вверх): перемещает столбец вверх
  • ↓ * (вниз): перемещает столбец вниз
  • → * (вправо): перемещение строки вправо
  • ← * (влево): перемещение строки влево

Звездочка (*) обозначает столбец / строку, на которую влияет перемещение (может быть 0 или 1. На ваше усмотрение. Укажите, какой из них в вашем ответе).


Задача состоит в том, чтобы, используя вышеприведенные ходы, отсортировать матрицу в порядке возрастания (верхний левый угол - самый нижний, а нижний правый угол - самый высокий).

пример

Ввод: Возможный вывод: или . (Обратите внимание, что любой из этих шагов может отсортировать матрицу, чтобы оба ответа были правильными)

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}


Примечания

  • Могут быть разные правильные выходные данные (они не обязательно должны совпадать с тестовыми примерами или самыми короткими)
  • Вы можете предположить, что это всегда будет способ заказать матрицу
  • Соединяет края (как pacman: v)
  • Не будет матрицы с более чем 9 столбцами и / или строками
  • Предположим, матрица содержит только положительные ненулевые уникальные целые числа
  • Вы можете использовать любые 4 различных значения, кроме чисел, для представления ходов (в этом случае, пожалуйста, укажите это в своем ответе)
  • Столбец / строка могут быть 0 или 1 проиндексированы
  • Критерии победы

Дополнительные тестовые случаи всегда приветствуются


5
Вот сайт, где вы можете решить эти головоломки самостоятельно.
Ручка двери

1
@ Doorknob Это было бы полезно, когда я писал вызов Dx. Спасибо, в любом случае!
Луис Фелипе Де Иисус Муньос

Я не думаю, что вы говорите где-либо, что решение должно быть как можно более коротким. Это намеренно? Например, является ←0←0допустимым решением для второго примера, где вы дали решение как →0. Если это так, я думаю, что половина вариантов перемещения, скорее всего, не будет использована.
FryAmTheEggman


1
Также некоторые люди могут захотеть попробовать openprocessing.org/sketch/580366, созданный ютубером по имени carykh. Это называется "LOOPOVER"
Гарет Ма

Ответы:


3

JavaScript (ES6),  226  219 байт

Поиск грубой силы, используя движения вправо ( "R") и вниз ( "D").

Возвращает либо строку, описывающую ходы, либо пустой массив, если входная матрица уже отсортирована. Столбцы и строки в выводе индексируются 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)

Попробуйте онлайн!

комментарии

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

Хороший ответ. Знаете ли вы, существует ли эффективный алгоритм для этого, или можно ли определить максимальное количество ходов, которое может сделать решение без грубой форсировки?
Иона

1
@Jonah Вот статья, описывающая решение и дающая верхнюю границу числа ходов. (См. Также этот вызов, который по сути является той же задачей с другим критерием победы.)
Арно

Ух ты, спасибо @Arnauld
Jonah

2

Python 2 , 296 277 245 Python 3 , 200 194 байта

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

Попробуйте онлайн!

-19: стрелки в юникоде не требовались ...
-32: немного переработан, но в среднем производительность намного ниже.
-45: черпал вдохновение из ответа @ Arnauld. Переключился на Python 3 для f''(-4 байта)
-6: range( )r_[: ] , diff(ravel( ))ediff1d( )


Исчерпывающий поиск комбинаций всех возможных ходов и →0. Тайм-аут на третий контрольный пример.

Так →nкак эквивалентно

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

где rи cявляются номерами строк и столбцов, этих ходов достаточно, чтобы найти любое решение.


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

>vсоответствуют соответственно →↓. (другие не определены)


0

Желе , 35 байт

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

Попробуйте онлайн!

Полная программа. Выходы перемещаются в STDOUT, используя L для левого и R для правого. Продолжает пробовать случайные движения, пока матрица не отсортирована, поэтому не очень эффективна с точки зрения скорости или алгоритмической сложности.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.