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

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
3
Связанный? codegolf.stackexchange.com/questions/172824/…
Sumner18
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
Arnauld
источник
Хороший ответ. Знаете ли вы, существует ли эффективный алгоритм для этого, или можно ли определить максимальное количество ходов, которое может сделать решение без грубой форсировки?
Иона
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соответствуют соответственно →↓. (другие не определены)

attinat
источник
0

Желе , 35 байт

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

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

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

Ник Кеннеди
источник