Hitung Matriks Kotak Optimal

13

The matrix yang optimal (untuk lingkup yang agak sempit tantangan ini) diperoleh dengan "zipping" unsur-unsur dari yang sesuai baris dan kolom dari matriks persegi dan mendapatkan maksimum masing-masing pasangan.

Misalnya, diberikan matriks berikut:

4 5 6
1 7 2
7 3 0

Anda dapat menggabungkan dengan transposnya untuk mendapatkan: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. Jika Anda zip setiap pasangan daftar, Anda mendapatkan berikut: [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]. Langkah terakhir adalah untuk mendapatkan maksimum dari setiap pasangan untuk mendapatkan matriks yang optimal:

4 5 7
5 7 3
7 3 0

Tugas Anda adalah untuk menghasilkan matriks optimal dari matriks persegi yang diberikan sebagai input. Matriks hanya akan berisi bilangan bulat. I / O dapat dilakukan dalam format apa pun yang wajar. Kode terpendek dalam byte (baik dalam UTF-8 atau dalam pengkodean kustom bahasa) menang!

Tes

[[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
sumber
Bisakah kita mengeluarkan versi datar dari matriks? misalnya [1,2,3,4]bukan [[1,2],[3,4]]? Akan menghemat ~ 33%
wastl

Jawaban:

7

Jelly , 2 byte

»Z

Cobalah online!

Bagaimana itu bekerja

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

 Z  Zip the rows of M, transposing rows and columns.
»   Take the maxima of all corresponding integers.
Dennis
sumber
Ya ampun ... Kenapa di dunia ini »berperilaku seperti itu ?!
5
Cukup standar untuk bahasa manipulasi array. Oktaf maxmelakukan hal yang sama.
Dennis
5

Haskell , 40 byte

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

Cobalah online!

Saya akan ungolf ini sebagai:

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

... yang jauh lebih elegan.

benar-benar manusiawi
sumber
2
Saya merasa lucu bahwa yang terbaik yang saya bisa bermain golf di Clean identik dengan Haskell yang tidak ungolfed Anda.
Surous
5

Sekam , 5 4 byte

Whoop, tidak pernah bisa digunakan sebelumnya (atau ):

S‡▲T

Cobalah online!

Penjelasan

S  T -- apply the function to itself and itself transposed
 ‡▲  -- bi-vectorized maximum
ბიმო
sumber
4

MATL , 6 byte

t!2$X>

Cobalah online!

Penjelasan:

t        % Duplicate the input.
!        % Transpose the duplicate.
2$X>     % Elementwise maximum of the two matrices.
Steadybox
sumber
3
Juga 6 byte: _t!Xl_dan tt!&Xl.
Sanchises
3

APL (Dyalog Unicode) , 3 byte

Fungsi awalan diam-diam anonim.

⊢⌈⍉

Cobalah online!

 argumen

 langit-langit dengan

 argumen yang dialihkan

Adm
sumber
2

JavaScript (ES6), 48 byte

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

Uji kasus

Arnauld
sumber
2

J , 4 byte

Fungsi awalan Tacit.

>.|:

Cobalah online!

>. langit-langit [argumen] dengan

|: argumen yang dialihkan

Adm
sumber
Um, saya pikir Anda tidak perlu memasukkan f=:. : P pada awalnya saya pikir Anda mengurangi bytecount oleh 3 byte ...
Erik the Outgolfer
<.seharusnya>.
FrownyFrog
@FrownyFrog Memang.
Adám
@EriktheOutgolfer Tidak, saya tidak.
Adám
2

Japt, 12 10 8 bytes

Look, Ma, no transposing or zipping!

£XËwUgEY

Try it

Shaggy
sumber
1

CJam, 8 bytes

{_z..e>}

Anonymous block (function) that takes the input from the stack and replaces it by the output.

Try it online! Or verify all test cases.

Explanation

{      }    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
Luis Mendo
sumber
1

R, 23 bytes

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

Try it online!

This is equivalent to most other answers. However, R has two distinct max functions for the two common scenarios:

max and min return the maximum or minimum of all the values present in their arguments, as integer if all are logical or integer, as double if all are numeric, and character otherwise.

pmax and pmin take one or more vectors (or matrices) as arguments and return a single vector giving the ‘parallel’ maxima (or minima) of the vectors. The first element of the result is the maximum (minimum) of the first elements of all the arguments, the second element of the result is the maximum (minimum) of the second elements of all the arguments and so on. Shorter inputs (of non-zero length) are recycled if necessary.

Giuseppe
sumber
1

Clean, 58 bytes

import StdEnv,StdLib
@l=zipWith(zipWith max)(transpose l)l

I don't think this needs an explanation.

Try it online!

Οurous
sumber
1

C (gcc), 79 77 bytes

  • Saved two bytes thanks to Steadybox; only taking in one matrix dimension parameter as all matrices in this challenge are square.
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]);}

Try it online!

Takes a flat integer array A and the matrix dimension n (as the matrix has to be square) as input. Outputs a flat integer array string representation to stdout.

Jonathan Frech
sumber
1

Julia 0.6, 13 bytes

max. applies the function max elementwise to it's arugments.

a->max.(a,a')

Try it online!

gggg
sumber
0

05AB1E, 7 bytes

ø‚øεøεà

Try it online!

Explanation

ø         # 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
sumber