Вычислить оптимальную квадратную матрицу

13

Матрица оптимальной (для довольно узкой рамки данной задачи) получаются «сжать» элементы из соответствующих строк и столбцов квадратной матрицы и получать максимум из каждой пары.

Например, с учетом следующей матрицы:

4 5 6
1 7 2
7 3 0

Вы можете комбинировать его с транспонированной получить: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. Если вы пронестись каждую пару списков, вы получите следующее: [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]. Последний шаг - получить максимум каждой пары, чтобы получить оптимальную матрицу:

4 5 7
5 7 3
7 3 0

Ваша задача - вывести оптимальную матрицу квадратной матрицы, заданную в качестве входных данных. Матрица будет содержать только целые числа. Ввод / вывод может быть выполнен в любом разумном формате. Самый короткий код в байтах (либо в UTF-8, либо в пользовательской кодировке языка) выигрывает!

тесты

[[172,29], [29,0]] -> [[172,29], [29,0]]
[[4,5,6], [1,7,2], [7,3,0]] -> [[4,5,7], [5,7,3], [7,3,0 ]]
[[1,2,3], [1,2,3], [1,2,3]] -> [[1,2,3], [2,2,3], [3,3,3 ]]
[[4,5, -6], [0,8, -12], [- 2,2,4]] -> [[4,5, -2], [5,8,2], [- 2,2,4]]
Steadybox
источник
Можем ли мы вывести плоскую версию матрицы? например [1,2,3,4]вместо [[1,2],[3,4]]? Сохранить бы ~ 33%
Wastl

Ответы:

7

Желе , 2 байта

»Z

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

Как это устроено

»Z  Main link. Argument: M (integer matrix)

 Z  Zip the rows of M, transposing rows and columns.
»   Take the maxima of all corresponding integers.
Деннис
источник
О боже ... Почему в мире так »себя ведут ?!
5
Довольно стандартный для языка манипулирования массивами. Октава maxделает то же самое.
Деннис
5

Haskell , 40 байт

z(z max)<*>foldr(z(:))e
e=[]:e
z=zipWith

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

Я бы расколол это как:

import Data.List
f m = zipWith (zipWith max) m (transpose m)

... что намного элегантнее

totallyhuman
источник
2
Я нахожу забавным то, что лучшее, что я мог сделать в чистом виде, - это то же самое, что и у твоего беззаботного Хаскелла.
Οurous
4

MATL , 6 байтов

t!2$X>

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

Объяснение:

t        % Duplicate the input.
!        % Transpose the duplicate.
2$X>     % Elementwise maximum of the two matrices.
Steadybox
источник
3
Также 6 байтов: _t!Xl_а tt!&Xl.
Sanchises
2

JavaScript (ES6), 48 байт

m=>m.map((r,y)=>r.map((v,x)=>v>(k=m[x][y])?v:k))

Контрольные примеры

Arnauld
источник
2

J , 4 байта

Функция молчаливого префикса.

>.|:

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

>. потолок [аргумента] с

|: транспонированный аргумент

Адам
источник
Хм, я не думаю, что вам нужно включать f=:. : P сначала я думал, что вы сократили байтовый счет на 3 байта ...
Эрик Outgolfer
<.должен быть>.
FrownyFrog
@FrownyFrog Действительно.
Адам
@EriktheOutgolfer Нет, не знаю.
Адам
1

CJam , 8 байт

{_z..e>}

Анонимный блок (функция), который берет входные данные из стека и заменяет их выходными данными.

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

{      }    e# Define block
 _          e# Duplicate
  z         e# Zip
   .        e# Apply next operator to the two arrays, item by item
            e# (that is, to rows of the two matrices)
    .       e# Apply next operator to the two arrays, item by item
            e# (that is, to numbers of the two rows)
     e>     e# Maximum of two numbers
Луис Мендо
источник
1

R , 23 байта

function(A)pmax(A,t(A))

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

Это эквивалентно большинству других ответов. Тем не менее, R имеет две разные maxфункции для двух общих сценариев:

maxи minвозвращает максимум или минимум всех значений, присутствующих в их аргументах, как целое число, если все логические или целые, как двойное, если все числовые, и символьное в противном случае.

pmaxи pminвзять один или несколько векторов (или матриц) в качестве аргументов и вернуть единственный вектор, дающий «параллельные» максимумы (или минимумы) векторов. Первый элемент результата - это максимум (минимум) первых элементов всех аргументов, второй элемент результата - это максимум (минимум) вторых элементов всех аргументов и так далее. Более короткие входы (ненулевой длины) рециркулируются при необходимости.

Giuseppe
источник
1

C (gcc) , 79 77 байтов

  • Сохранено два байта благодаря Steadybox ; только принимая в один размерный параметр матрицы, поскольку все матрицы в этой задаче являются квадратными.
j,i;f(A,n)int*A;{for(j=0;j<n*n;j++)printf("%d,",A[A[j]>A[i=j/n+j%n*n]?j:i]);}

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

Принимает плоский целочисленный массив Aи размер матрицы n(поскольку матрица должна быть квадратной) в качестве входных данных. Выводит строковое представление массива целых чисел в стандартный вывод.

Джонатан Фрех
источник
0

05AB1E , 7 байтов

ø‚øεøεà

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

объяснение

ø         # transpose input matrix
 ‚        # pair with original matrix
  ø       # zip together
   ε      # apply on each sublist ([[row],[transposed row]])
    ø     # zip
     ε    # apply on each sublist (pair of elements)
      à   # extract greatest element
Emigna
источник