Calcular a matriz quadrada ideal

13

A matriz ideal (para o escopo bastante restrito desse desafio) é obtida "compactando" os elementos das linhas e colunas correspondentes de uma matriz quadrada e obtendo o máximo de cada par.

Por exemplo, dada a seguinte matriz:

4 5 6
1 7 2
7 3 0

Você pode combiná-lo com a sua transposição para obter: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. Se você zip cada par de listas, você obter o seguinte: [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]. O último passo é obter o máximo de cada par para obter a matriz ideal:

4 5 7
5 7 3
7 3 0

Sua tarefa é produzir a matriz ideal de uma matriz quadrada fornecida como entrada. A matriz conterá apenas números inteiros. A E / S pode ser feita em qualquer formato razoável. O código mais curto em bytes (em UTF-8 ou na codificação personalizada do idioma) vence!

Testes

[[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
fonte
Podemos produzir uma versão plana da matriz? por exemplo, em [1,2,3,4]vez de [[1,2],[3,4]]? Salvar como ~ 33%
wastl

Respostas:

7

Gelatina , 2 bytes

»Z

Experimente online!

Como funciona

»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
fonte
Oh meu ... Por que no mundo se »comporta assim ?!
5
Bastante padrão para uma linguagem de manipulação de array. Oitava maxfaz o mesmo.
Dennis
5

Haskell , 40 bytes

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

Experimente online!

Eu ungolf isso como:

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

... que é muito mais elegante.

totalmente humano
fonte
2
Acho engraçado que o melhor que eu possa jogar no Clean seja idêntico ao seu Haskell não-destruído.
Οurous
5

Casca , 5 4 bytes

Opa, nunca usei antes (ou ):

S‡▲T

Experimente online!

Explicação

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

MATL , 6 bytes

t!2$X>

Experimente online!

Explicação:

t        % Duplicate the input.
!        % Transpose the duplicate.
2$X>     % Elementwise maximum of the two matrices.
Steadybox
fonte
3
Também 6 bytes: _t!Xl_e tt!&Xl.
Sanchises
3

APL (Dyalog Unicode) , 3 bytes

Função de prefixo tácito anônimo.

⊢⌈⍉

Experimente online!

 argumento

 teto com

 argumento transposto

Adão
fonte
2

JavaScript (ES6), 48 bytes

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

Casos de teste

Arnauld
fonte
2

J , 4 bytes

Função de prefixo tácito.

>.|:

Experimente online!

>. teto [do argumento] com

|: o argumento transposto

Adão
fonte
Não acho que você precise incluir f=:. : P no começo eu pensei que você reduziu o bytecount por 3 bytes ...
Erik as Outgolfer
<.deve ser>.
FrownyFrog
@FrownyFrog De fato.
Adám
@EriktheOutgolfer Não, eu não.
Adám
2

Japonês , 12 10 8 bytes

Olha, mãe, não há transposição ou fechamento!

£XËwUgEY

Tente

Shaggy
fonte
1

CJam , 8 bytes

{_z..e>}

Bloco anônimo (função) que pega a entrada da pilha e a substitui pela saída.

Experimente online! Ou verifique todos os casos de teste .

Explicação

{      }    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
fonte
1

R , 23 bytes

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

Experimente online!

Isso é equivalente à maioria das outras respostas. No entanto, R tem duas maxfunções distintas para os dois cenários comuns:

maxe minretorne o máximo ou o mínimo de todos os valores presentes em seus argumentos, como número inteiro se todos forem lógicos ou números inteiros, como dobro se todos forem numéricos e caracteres caso contrário.

pmaxe pminpegue um ou mais vetores (ou matrizes) como argumentos e retorne um único vetor, fornecendo o máximo (ou mínimo) 'paralelo' dos vetores. O primeiro elemento do resultado é o máximo (mínimo) dos primeiros elementos de todos os argumentos, o segundo elemento do resultado é o máximo (mínimo) dos segundos elementos de todos os argumentos e assim por diante. Entradas mais curtas (de comprimento diferente de zero) são recicladas, se necessário.

Giuseppe
fonte
1

Limpo , 58 bytes

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

Eu não acho que isso precise de uma explicação.

Experimente online!

Furioso
fonte
1

C (gcc) , 79 77 bytes

  • Economizou dois bytes graças ao Steadybox ; tendo apenas um parâmetro de dimensão da matriz, pois todas as matrizes neste desafio são quadradas.
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]);}

Experimente online!

Pega uma matriz inteira plana Ae a dimensão da matriz n(como a matriz precisa ser quadrada) como entrada. Gera uma representação de seqüência de caracteres de matriz inteira plana em stdout.

Jonathan Frech
fonte
1

Julia 0.6 , 13 bytes

max. aplica a função max elementwise a seus argumentos.

a->max.(a,a')

Experimente online!

gggg
fonte
0

05AB1E , 7 bytes

ø‚øεøεà

Experimente online!

Explicação

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