Calcule la matriz cuadrada óptima

13

La matriz óptima (para el alcance bastante limitado de este desafío) se obtiene "comprimiendo" los elementos de las filas y columnas correspondientes de una matriz cuadrada y obteniendo el máximo de cada par.

Por ejemplo, dada la siguiente matriz:

4 5 6
1 7 2
7 3 0

Se puede combinar con su transpuesta para obtener: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. Si usted zip cada par de listas, se obtiene lo siguiente: [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]. El último paso es obtener el máximo de cada par para obtener la matriz óptima:

4 5 7
5 7 3
7 3 0

Su tarea es generar la matriz óptima de una matriz cuadrada dada como entrada. La matriz solo contendrá enteros. La E / S se puede hacer en cualquier formato razonable. ¡El código más corto en bytes (ya sea en UTF-8 o en la codificación personalizada del idioma) gana!

Pruebas

[[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
fuente
¿Podemos generar una versión plana de la matriz? por ejemplo, en [1,2,3,4]lugar de [[1,2],[3,4]]? Ahorraría ~ 33%
wastl

Respuestas:

7

Jalea , 2 bytes

»Z

Pruébalo en línea!

Cómo 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
fuente
Oh mi ... ¿Por qué demonios se »comporta así?
55
Bastante estándar para un lenguaje de manipulación de matriz. Octave's maxhace lo mismo.
Dennis
5

Haskell , 40 bytes

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

Pruébalo en línea!

Me gustaría deshacer esto como:

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

... que es mucho más elegante.

totalmente humano
fuente
2
Me parece curioso que lo mejor que pueda jugar golf en Clean sea idéntico a tu Haskell no golfista.
Οurous
5

Casco , 5 4 bytes

Whoop, nunca tuve que usar antes (o ):

S‡▲T

Pruébalo en línea!

Explicación

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

MATL , 6 bytes

t!2$X>

Pruébalo en línea!

Explicación:

t        % Duplicate the input.
!        % Transpose the duplicate.
2$X>     % Elementwise maximum of the two matrices.
Steadybox
fuente
3
También 6 bytes: _t!Xl_y tt!&Xl.
Sanchises
2

JavaScript (ES6), 48 bytes

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

Casos de prueba

Arnauld
fuente
2

J , 4 bytes

Función de prefijo tácito.

>.|:

Pruébalo en línea!

>. techo [del argumento] con

|: el argumento transpuesto

Adán
fuente
No creo que debas incluirlo f=:. : P al principio pensé que redujiste el bytecount en 3 bytes ...
Erik the Outgolfer
<.se supone que es>.
FrownyFrog
@FrownyFrog De hecho.
Adám
@EriktheOutgolfer No, no lo hago.
Adám
2

Japt , 12 10 8 bytes

¡Mira, mamá, no hay transposición ni compresión!

£XËwUgEY

Intentalo

Lanudo
fuente
1

CJam , 8 bytes

{_z..e>}

Bloque anónimo (función) que toma la entrada de la pila y la reemplaza por la salida.

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

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

R , 23 bytes

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

Pruébalo en línea!

Esto es equivalente a la mayoría de las otras respuestas. Sin embargo, R tiene dos maxfunciones distintas para los dos escenarios comunes:

max y min devuelve el máximo o mínimo de todos los valores presentes en sus argumentos, como entero si todos son lógicos o enteros, como doble si todos son numéricos y caracteres de lo contrario.

pmaxy pmintome uno o más vectores (o matrices) como argumentos y devuelva un solo vector dando los máximos (o mínimos) 'paralelos' de los vectores. El primer elemento del resultado es el máximo (mínimo) de los primeros elementos de todos los argumentos, el segundo elemento del resultado es el máximo (mínimo) de los segundos elementos de todos los argumentos y así sucesivamente. Las entradas más cortas (de longitud distinta de cero) se reciclan si es necesario.

Giuseppe
fuente
1

Limpio , 58 bytes

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

No creo que esto necesite una explicación.

Pruébalo en línea!

Οurous
fuente
1

C (gcc) , 79 77 bytes

  • Guardado dos bytes gracias a Steadybox ; solo tomando un parámetro de dimensión de matriz ya que todas las matrices en este desafío son cuadradas.
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]);}

Pruébalo en línea!

Toma una matriz entera plana Ay la dimensión de la matriz n(ya que la matriz debe ser cuadrada) como entrada. Emite una representación de cadena de matriz entera plana en stdout.

Jonathan Frech
fuente
0

05AB1E , 7 bytes

ø‚øεøεà

Pruébalo en línea!

Explicación

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