Calcola la matrice quadrata ottimale


13

La matrice ottimale (per lo scopo piuttosto ristretto di questa sfida) si ottiene "zippando" gli elementi dalle corrispondenti righe e colonne di una matrice quadrata e ottenendo il massimo da ciascuna coppia.

Ad esempio, data la seguente matrice:

4 5 6
1 7 2
7 3 0

È possibile combinare con la sua trasposta per ottenere: [[[4,5,6],[4,1,7]],[[1,7,2],[5,7,3]],[[7,3,0],[6,2,0]]]. Se si zip ogni coppia di liste, si ottiene quanto segue: [[(4,4),(5,1),(6,7)],[(1,5),(7,7),(2,3)],[(7,6),(3,2),(0,0)]]. L'ultimo passo è ottenere il massimo da ciascuna coppia per ottenere la matrice ottimale:

4 5 7
5 7 3
7 3 0

Il tuo compito è quello di produrre la matrice ottimale di una matrice quadrata fornita come input. La matrice conterrà solo numeri interi. L'I / O può essere eseguito in qualsiasi formato ragionevole. Vince il codice più breve in byte (in UTF-8 o nella codifica personalizzata della lingua)!

test

[[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]]

Possiamo produrre una versione piatta della matrice? ad es. [1,2,3,4]invece di [[1,2],[3,4]]? Risparmibbe ~ 33%
wastl

Risposte:


7

Gelatina , 2 byte

»Z

Provalo online!

Come funziona

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

 Z  Zip the rows of M, transposing rows and columns.
»   Take the maxima of all corresponding integers.

Oh mio ... Perché nel mondo si »comporta così ?!

5
Piuttosto standard per un linguaggio di manipolazione di array. Octave's maxfa lo stesso.
Dennis,

5

Haskell , 40 byte

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

Provalo online!

Desidero annullare questa impostazione come:

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

... che è molto più elegante.


2
Trovo divertente che il meglio che ho potuto giocare a golf in Clean sia identico al tuo Haskell non golfato.
Οuroso

5

Buccia , 5 4 byte

Whoop, non hai mai usato prima (o ):

S‡▲T

Provalo online!

Spiegazione

S  T -- apply the function to itself and itself transposed
 ‡▲  -- bi-vectorized maximum




2

JavaScript (ES6), 48 byte

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

Casi test


2

J , 4 byte

Funzione prefisso tacita.

>.|:

Provalo online!

>. soffitto [dell'argomento] con

|: l'argomento trasposto


Um, non penso che tu debba includere f=:. : P all'inizio pensavo che avessi ridotto il byte di 3 byte ...
Erik the Outgolfer

<.dovrebbe essere>.
FrownyFrog

@FrownyFrog In effetti.
Adám,

@EriktheOutgolfer No, non lo so.
Adám,


1

CJam , 8 byte

{_z..e>}

Blocco anonimo (funzione) che accetta l'input dallo stack e lo sostituisce con l'output.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

{      }    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 byte

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

Provalo online!

Ciò equivale alla maggior parte delle altre risposte. Tuttavia, R ha due maxfunzioni distinte per i due scenari comuni:

maxe minrestituisce il massimo o il minimo di tutti i valori presenti nei loro argomenti, come numero intero se tutti sono logici o interi, come doppio se tutti sono numerici e carattere altrimenti.

pmaxe pminprendere uno o più vettori (o matrici) come argomenti e restituire un singolo vettore fornendo i massimi (o minimi) "paralleli" dei vettori. Il primo elemento del risultato è il massimo (minimo) dei primi elementi di tutti gli argomenti, il secondo elemento del risultato è il massimo (minimo) dei secondi elementi di tutti gli argomenti e così via. Gli input più brevi (di lunghezza diversa da zero) vengono riciclati se necessario.



1

C (gcc) , 79 77 byte

  • Due byte salvati grazie a Steadybox ; prendendo solo un parametro di dimensione matrice poiché tutte le matrici in questa sfida sono quadrate.
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]);}

Provalo online!

Prende un array di numeri interi piatti Ae la dimensione della matrice n(poiché la matrice deve essere quadrata) come input. Emette una rappresentazione di stringa di array di interi interi su stdout.



0

05AB1E , 7 byte

ø‚øεøεà

Provalo online!

Spiegazione

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





Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.