В рамках алгоритма сжатия стандарт JPEG разворачивает матрицу в вектор вдоль антидиагоналей переменного направления:
Ваша задача - взять матрицу (не обязательно квадратную) и вернуть ее в развернутом виде. В качестве примера:
[1 2 3 4
5 6 7 8
9 1 2 3]
должен уступить
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
правила
Вы можете предположить, что матричные элементы имеют положительные целые числа меньше, чем 10
.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Входная матрица может быть задана в любом удобном, однозначном, вложенном списке или строковом формате или в виде плоского списка вместе с обоими размерами матрицы. (Или, конечно, как матричный тип, если ваш язык имеет такие.)
Выходной вектор может иметь любой удобный, однозначный, плоский список или строковый формат.
Применяются стандартные правила игры в гольф .
Тестовые случаи
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 3 4] [5 6 7 8] [9 1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 5 9 6 3 4 7 1 2 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Связанные проблемы
- Восстановить зигзагированную матрицу (несколько более хитрое обратное преобразование)
- Поверните анти-диагонали
источник
Ответы:
J,
3130141211 байтYch . Слишком большой.Принимает матрицу в качестве ввода.
объяснение
У J здесь есть преимущество. Есть команда с именем oblique (
/.
), которая по очереди принимает косые линии и применяет к ним глагол. В этом случае я использую герунду для попеременного применения двух глаголов:<
( коробка ) и<@|.
( реверс и коробка). Тогда это просто вопрос распаковки всего, используя;
( raze ).источник
Pyth,
24232120191817 байтАльтернативная 17-байтовая версия:
ssuL_G=!T.T+LaYkQ
Спасибо @FryAmTheEggman за байт, @Jakube за 2 байта и @isaacg за байт!
Объяснение «черной магии», на которое ссылаются выше: по
m_W=!Td
сути, полностью изменяет любой другой подмассив. Это делается путем сопоставления_W=!T
каждого подмассива;W
является условным приложением, поэтому оно_
(переворачивает) все подмассивы, где=!T
true.T
переменная, предварительно инициализированная до десяти (правда), и=!T
означает(T = !T)
. Таким образом, он переключает значение переменной, которая начинается с истинного и возвращает новое значение, что означает, что он будет чередоваться с возвращением ложного, правдивого, ложного, правдивого ... (заслуга Якуба за эту идею)Тестовый набор здесь .
источник
Желе,
2419151311 байтПринимает количество строк, количество столбцов и плоский список в качестве отдельных аргументов командной строки.
Попробуйте онлайн!
Как это работает
источник
⍁
и⍂
? А может и скандинавскиеø
аǿ
?MATL ,
2827 байтАдаптировано из моего ответа здесь . Общая идея заключается в создании двумерного массива того же размера, что и входные данные, заполненного значениями, которые увеличиваются в том же порядке, что и зигзагообразный путь. Затем линеаризованная (уплощенная) версия этого массива сортируется, и индексы этой сортировки сохраняются. Это те индексы, которые необходимо применить к входным данным, чтобы получить зигзагообразный путь.
Ввод в форме
объяснение
Попробуйте онлайн!
источник
Matlab, 134 байта
Я просто старался изо всех сил сократить свой код в Matlab, например, телеграфировать его.
Заметки:
M
этоm×n
матрицаa
иb
обе матрицы имеют одинаковый размерM
, каждая строкаa
состоит из чисел, равных его номеру строки, в то время как каждый столбецb
равен его номеру столбца. Таким образом,a
+b
является матрица, элемент равен сумме его строки и столбца, то естьmatrix(p,q)=p+q
.A(p,q)=p+q-1
; иB(p,q)=p-q
.C
математически указано как уравнение ниже. с помощью уравнения можно сделать зигзагообразно увеличивающуюся матрицу, как показано ниже.C
указывает порядок элементов M в зигзагированных результатах. Затем[~,I]=sort(C(:));
возвращает порядок, т. Е.I
, Таким образом,V=V(I)'
является результатом.источник
JavaScript (SpiderMonkey 30+), 99 байт
Протестировано в Firefox 44. Принимает ввод в виде 2D-массива.
источник
Python 2, 84 байта
Портирование ответа Ними . Принимает плоский массив с заданной шириной и высотой. xsot сохранил байт.
88 байт:
Принимает плоский массив с заданной шириной и высотой. Сортирует соответствующие двухмерные координаты
(i/w,i%w)
в порядке увеличения суммы по зигзагам, чтобы получить диагонали, разбитые путем увеличения или уменьшения значения строки, в зависимости от того, является ли строка плюс столбец нечетной или четной.источник
Haskell,
797873 байтаВвод представляет собой плоский список с количеством строк и столбцов, например
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
->[1,2,5,9,6,3,4,7,1,2,8,3]
.Как это работает: пройтись по координатам x и y матрицы (
h
строки,w
столбцы) в двух вложенных циклах:то есть сверху / справа вниз / влево, пропуская ограниченные индексы (
y
иx
должны удовлетворятьy<h
иx-y<w
). Когдаx
чётно, порядок внутреннего цикла меняется на противоположный:y
идет отx
к0
. Я делаю это, выбирая модифицирующую функцию для диапазона y,[0..x]
который являетсяx
элементом th[reverse,id,reverse,id,...]
.Редактировать: @xnor переупорядочил циклы и сохранил 5 байтов. Благодарность!
источник
g=id:reverse:g
.(y-x)*w
можно отрезать перестановку проблемы:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. Перевод на Python экономит 3 символа по сравнению с тем, что у меня было.Python 2 + NumPy, 122 байта
Я признаю это. Я работал впереди. К сожалению, этот же метод не может быть легко модифицирован для решения двух других проблем ...
Принимает массив numpy в качестве входных данных. Выводит список.
Попробуйте онлайн
Объяснение:
Лямбда такой же длины:
источник
Python 3,
131118115107 байтНа основании того же Принсипе , как мой ответ на вызов Deusovi в
Я предполагаю, что мы не можем иметь ноль во входной матрице
объяснение
как это работает :
Полученные результаты
источник
reverse even line
бытьreverse odd lines
вместо?