Produkt punktowy przekątnych

10

To wyzwanie jest bardzo proste. Otrzymujesz jako dane wejściowe macierz kwadratową, reprezentowaną w dowolny rozsądny sposób, i musisz wyprowadzić iloczyn iloczynu przekątnych macierzy.

Konkretne przekątne to przekątna biegnąca od górnego lewego do prawego dolnego i od prawego górnego do lewego dolnego.

Przypadki testowe

[[-1, 1], [-2, 1]]  ->  -3
[[824, -65], [-814, -741]]  ->  549614
[[-1, -8, 4], [4, 0, -5], [-3, 5, 2]]  ->  -10
[[0, -1, 0], [1, 0, 2], [1, 0, 1]]  ->  1
Maltysen
źródło

Odpowiedzi:

3

MATL , 8 bajtów

t!P!*Xds

Format wejściowy to

[-1, -8, 4; 4, 0 -5; -3, 5, 2]

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

t       % Take input matrix implicitly. Duplicate
!P!     % Flip matrix horizontally
*       % Element-wise product
Xd      % Extract main diagonal as a column vector
s       % Sum. Display implicitly
Luis Mendo
źródło
2

Python, 47 bajtów

lambda x:sum(r[i]*r[~i]for i,r in enumerate(x))

Przetestuj na Ideone .

Dennis
źródło
2

J, 21 19 bajtów

[:+/(<0 1)|:(*|."1)

Proste podejście.

Zaoszczędzono 2 bajty dzięki @ Lynn .

Stosowanie

Tablica wejściowa jest kształtowana za pomocą dimensions $ values.

   f =: [:+/(<0 1)|:(*|."1)
   f (2 2 $ _1 1 _2 1)
_3
   f (2 2 $ 824 _65 _814 _741)
549614
   f (3 3 $ _1 _8 4 4 0 _5 _3 5 2)
_10
   f (3 3 $ 0 _1 0 1 0 2 1 0 1)
1

Wyjaśnienie

[:+/(<0 1)|:(*|."1)    Input: matrix M
              |."1     Reverse each row of M
             *         Multiply element-wise M and the row-reversed M
    (<0 1)|:           Take the diagonal of that matrix
[:+/                   Sum that diagonal and return it=
mile
źródło
[:+/(<0 1)|:(*|."1)ma 19 bajtów
Lynn
1

JavaScript (ES6), 45 bajtów

a=>a.reduce((r,b,i)=>r+b[i]*b.slice(~i)[0],0)
a=>a.reduce((r,b,i)=>r+b[i]*b[b.length+~i],0)
Neil
źródło
1

R, 26 bajtów

sum(diag(A*A[,ncol(A):1]))
Edgar Rokjān
źródło
1

Mathematica, 17 bajtów

Tr[#~Reverse~2#]&
Lynn
źródło
1

APL (Dyalog) , 15 9 bajtów

+/1 1⍉⌽×⊢

Wypróbuj online!

W jaki sposób?

+/ - suma

1 1⍉ - przekątna

⌽×⊢ - elementowe mnożenie macierzy z jej odwrotnością

Uriel
źródło
0

Clojure, 57 bajtów

#(apply +(map(fn[i r](*(r i)(nth(reverse r)i)))(range)%))
NikoNyrh
źródło
0

Haskell , 80 48 bajtów

Bardziej podobało mi się moje poprzednie rozwiązanie, ale jest ono znacznie krótsze (w zasadzie robi to samo co rozwiązanie Python):

f m=sum[r!!i*r!!(length m-i-1)|(i,r)<-zip[0..]m]

Wypróbuj online!

ბიმო
źródło
0

J, 18 bajtów

<:@#{+//.@:(*|."1)

Wyjaśnienie:

           (     ) | Monadic hook
            *      | Argument times...
             |."1  | The argument mirrored around the y axis
     +//.@:        | Make a list by summing each of the diagonals of the matrix
    {              | Takes element number...
<:@#               | Calculates the correct index (size of the array - 1)
Bolce Bussiere
źródło
0

05AB1E , 5 bajtów

í*Å\O

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

í        # Reverse each row of the (implicit) input-matrix
         #  i.e. [[-1,-8,4],[4,0,-5],[-3,5,2]] → [[4,-8,-1],[-5,0,4],[2,5,-3]]
 *       # Multiply it with the (implicit) input-matrix (at the same positions)
         #  i.e. [[-1,-8,4],[4,0,-5],[-3,5,2]] and [[4,-8,-1],[-5,0,4],[2,5,-3]]
         #   → [[-4,64,-4],[-20,0,-20],[-6,25,-6]]
  Å\     # Get the diagonal-list from the top-left corner towards the bottom-right
         #  i.e. [[-4,64,-4],[-20,0,-20],[-6,25,-6]] → [-4,0,-6]
    O    # Sum it (and output implicitly)
         #  i.e. [-4,0,-6] → -10
Kevin Cruijssen
źródło