Calcul de la matrice carrée optimale

13

La matrice optimale (pour la portée plutôt étroite de ce défi) est obtenue en «zippant» les éléments des lignes et colonnes correspondantes d'une matrice carrée et en obtenant le maximum de chaque paire.

Par exemple, étant donné la matrice suivante:

4 5 6
1 7 2
7 3 0

Vous pouvez le combiner avec sa transposition pour obtenir: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. Si vous zip chaque paire de listes, vous obtenez ce qui suit: [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]. La dernière étape consiste à obtenir le maximum de chaque paire pour obtenir la matrice optimale:

4 5 7
5 7 3
7 3 0

Votre tâche consiste à sortir la matrice optimale d'une matrice carrée donnée en entrée. La matrice ne contiendra que des entiers. Les E / S peuvent être effectuées dans n'importe quel format raisonnable. Le code le plus court en octets (soit en UTF-8 ou dans l'encodage personnalisé du langage) gagne!

Les tests

[[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
la source
Pouvons-nous produire une version plate de la matrice? par exemple [1,2,3,4]au lieu de [[1,2],[3,4]]?
Économiserait

Réponses:

7

Gelée , 2 octets

»Z

Essayez-le en ligne!

Comment ça fonctionne

»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
la source
Oh mon ... Pourquoi dans le monde »se comporte comme ça?!
5
Assez standard pour un langage de manipulation de tableaux. Octave's maxfait de même.
Dennis
5

Haskell , 40 octets

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

Essayez-le en ligne!

Je dégoulerais ceci comme:

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

... qui est tellement plus élégant.

totalement humain
la source
2
Je trouve drôle que le meilleur que je puisse jouer au golf dans Clean est identique à votre Haskell non golfé.
Janurous
5

Husk , 5 4 octets

Whoop, jamais utilisé auparavant (ou ):

S‡▲T

Essayez-le en ligne!

Explication

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

MATL , 6 octets

t!2$X>

Essayez-le en ligne!

Explication:

t        % Duplicate the input.
!        % Transpose the duplicate.
2$X>     % Elementwise maximum of the two matrices.
Steadybox
la source
3
Aussi 6 octets: _t!Xl_et tt!&Xl.
Sanchises
2

JavaScript (ES6), 48 octets

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

Cas de test

Arnauld
la source
2

J , 4 octets

Fonction de préfixe tacite.

>.|:

Essayez-le en ligne!

>. plafond [de l'argument] avec

|: l'argument transposé

Adam
la source
Je ne pense pas que vous ayez besoin de l'inclure f=:. : P au début, je pensais que vous avez réduit le bytecount de 3 octets ...
Erik the Outgolfer
<.est censé être>.
FrownyFrog
@FrownyFrog En effet.
Adám
@EriktheOutgolfer Non, je ne le fais pas.
Adám
2

Japt , 12 10 8 octets

Regardez, Ma, pas de transposition ou de fermeture éclair!

£XËwUgEY

Essayez-le

Hirsute
la source
1

CJam , 8 octets

{_z..e>}

Bloc anonyme (fonction) qui prend l'entrée de la pile et la remplace par la sortie.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

{      }    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
la source
1

R , 23 octets

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

Essayez-le en ligne!

Cela équivaut à la plupart des autres réponses. Cependant, R a deux maxfonctions distinctes pour les deux scénarios courants:

maxet minrenvoyer le maximum ou le minimum de toutes les valeurs présentes dans leurs arguments, comme entier si tous sont logiques ou entiers, comme double si tous sont numériques, et caractère sinon.

pmaxet pminprendre un ou plusieurs vecteurs (ou matrices) comme arguments et renvoyer un seul vecteur donnant les maxima (ou minima) "parallèles" des vecteurs. Le premier élément du résultat est le maximum (minimum) des premiers éléments de tous les arguments, le deuxième élément du résultat est le maximum (minimum) des seconds éléments de tous les arguments et ainsi de suite. Des entrées plus courtes (de longueur non nulle) sont recyclées si nécessaire.

Giuseppe
la source
1

Nettoyer , 58 octets

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

Je ne pense pas que cela nécessite une explication.

Essayez-le en ligne!

Οurous
la source
1

C (gcc) , 79 77 octets

  • Enregistré deux octets grâce à Steadybox ; n'acceptant qu'un seul paramètre de dimension de matrice, car toutes les matrices de ce défi sont carrées.
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]);}

Essayez-le en ligne!

Prend un tableau entier plat Aet la dimension nde la matrice (car la matrice doit être carrée) en entrée. Génère une représentation de chaîne de tableau d'entiers plats vers stdout.

Jonathan Frech
la source
1

Julia 0,6 , 13 octets

max.applique la fonction maxélément par élément à ses arugments.

a->max.(a,a')

Essayez-le en ligne!

gggg
la source
0

05AB1E , 7 octets

ø‚øεøεà

Essayez-le en ligne!

Explication

ø         # 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
la source