Matryca hermitowska?

18

Pamiętaj, że to wyzwanie nie wymaga obsługi ani zrozumienia liczb zespolonych.

Biorąc pod uwagę niepustą kwadratową macierz, gdzie każdy element jest dwuelementową (Re, Im) listą całkowitą, ustal (podając dowolne wartości prawda / fałsz lub dowolne dwie spójne wartości), czy reprezentuje to matrycę hermitowską.

Zauważ, że wejściem jest tablica liczb całkowitych 3D; nie tablica 2D liczb zespolonych. Jeśli twój język nie może bezpośrednio pobrać tablicy 3D, możesz wziąć płaską listę (i kształt n × n lub n × n × 2, jeśli to pomoże).

Macierz jest pustelnikiem, jeśli równa się jej własnej transpozycji sprzężonej . Innymi słowy, jeśli odwrócisz go od jego górnej lewej do prawej dolnej przekątnej i negujesz drugi element wszystkich dwuelementowych list liści, będzie on identyczny z macierzą wejściową. Pamiętaj, że kolejność przewracania i negowania nie ma znaczenia, więc możesz najpierw negować, a potem odwrócić.

Przykład chodzenia

W tym przykładzie zastosowano JSON z niepotrzebną białą spacją, aby ułatwić czytanie:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

Transpozycja (odwrócenie po przekątnej NW – SE):

[[ [2, 0] , [2,-1] , [4, 0] ],
 [ [2, 1] , [3, 0] , [0,-1] ],
 [ [4, 0] , [0, 1] , [1, 0] ]]

Neguj drugie elementy list liści:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

Ponieważ jest to identyczne z wejściem, macierz jest pustelnikiem.

Przypadki testowe

Hermitian

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,0]]]

[[[1,0],[2,0]],[[2,0],[1,0]]]

[[[1,0],[2,-3]],[[2,3],[1,0]]]

[[[42,0]]]

Nie-pustelnik

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,-1]]]

[[[0,1],[0,2]],[[0,2],[0,1]]]

[[[1,0],[2,3]],[[2,3],[1,0]]]

[[[3,2]]]

Adám
źródło
@LuisMendo Nadal myślę. Jakieś pomysły?
Adám
Dla przypomnienia, nowy Meta-post . (Nie głosowałem za zamknięciem, ale widzę, że ktoś to zrobił, więc jestem ciekawy, co społeczność o tym myśli).
Stewie Griffin
5
@ Adám Chciałbym wyrazić to tak jasno, jak to możliwe, ale to zależy od ciebie. Elastyczność formatów wejściowych i wyjściowych jest zwykle pożądana, ale nie można jej domyślnie wywnioskować, szczególnie gdy mówisz, że dane wejściowe to tablica 3D liczb rzeczywistych; nie tablica 2D liczb zespolonych . Nie jest jasne, jak szeroka jest twoja koncepcja formatu wejściowego macierzy 3D
Luis Mendo,
3
@ Adám Czy para matryc 2D (jedna dla części rzeczywistej, druga dla części urojonej) może zostać pobrana jako dane wejściowe?
dylnan
1
@dylnan Nie. Wejście musi być pojedynczą strukturą reprezentującą pewien rodzaj trójwymiarowości, w której wymiar liścia zawiera pary Re-Im.
Adám

Odpowiedzi:

10

R, 71 48 47 bajtów

function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)

Bierze tablicę 3D liczb rzeczywistych, tworzy tablicę 2D liczb urojonych, transponuje, koniuguje i porównuje.

Dzięki @Giuseppe za zmniejszenie liczby bajtów o zdumiewające 23 bajty oraz @Vlo za końcowy 1!

Wypróbuj online!

Przykład:

> A <- array(c(2,2,4,2,3,0,4,0,1,0,-1,0,1,0,-1,0,1,0),dim=c(3,3,2))
> A
, , 1

     [,1] [,2] [,3]
[1,]    2    2    4
[2,]    2    3    0
[3,]    4    0    1

, , 2

     [,1] [,2] [,3]
[1,]    0    1    0
[2,]   -1    0    1
[3,]    0   -1    0

> f <- function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)
> f(A)
[1] TRUE
plannapus
źródło
1
B=A[,,1]+A[,,2]*1ipowinien zaoszczędzić kilka bajtów.
Giuseppe
@GIuseppe arf Myślałem, że spróbowałem, ale najwyraźniej nie. Dzięki!
plannapus
1
Ponadto, isSymmetricistnieje i działa na hermitowskich złożonych matrycach, ale 1x1sprawa jest trudna, ponieważ [atrybuty krople, skutkuje on complexzamiastmatrix
Giuseppe
2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)
Przypisywanie w
7

Oktawa , 39 34 31 bajtów

@(x)(y=x(:,:,1)+j*x(:,:,2))==y'

Wypróbuj online!

Zaoszczędziłem 3 bajty dzięki Luisowi Mendo, który poinformował mnie o wyjaśnieniach w tekście wyzwania.

Wyjaśnienie:

W MATLAB i Octave 'transpozycja złożonego sprzężonego, a nie „zwykła” transpozycja.

Tworzymy zmienną ywstawkę, która jest pierwszą warstwą matrycy 3D plus drugą warstwę pomnożoną przez jednostkę złożoną j, tj. Złożoną matrycę, w której rzeczywistym terminem jest pierwsza „warstwa”, a urojonym jest druga „warstwa”. Następnie sprawdzamy, czy transponowany jest koniugat złożony.

Spowoduje to wygenerowanie macierzy zawierającej tylko wartość 1true i macierz zawierającą co najmniej jedną wartość 0false. Są one uważane za prawdziwe i fałszywe w Octave (dowód) .

Stewie Griffin
źródło
5

APL (Dyalog Unicode) , 22 15 9 7 bajtów

⍉≡⊢∘-

Wypróbuj online!

Funkcja ukrytego przedrostka.

Podziękowania dla Adama za 7 bajtów na Dfn oraz zarówno dla Adama, jak i Erika TheOutgolfer za znoszenie mojej głupoty za pomoc w znalezieniu milczącej wersji.

Dzięki ngn za 2 bajty w wersji ukrytej.

W jaki sposób?

⍉≡⊢∘- Anonymous tacit function.
      ¨  Apply to each element of the argument:
     \   Cumulative reduction, using
  ⊢∘-    Ignore the first element, then negate the second
        And match
        To the argument's transposition.
J. Sallé
źródło
5

Wolfram Language (Mathematica) , 45 34 33 26 21 18 bajtów

#==#&[#.{1,I}]&

Wypróbuj online!

Jonathan Frech
źródło
34 bajty: Wypróbuj online!
JungHwan Min
@alephalpha Wielkie dzięki; Wiem, że 0xf3c7to operator transpozycji, ale co to jest 0xf3c8?
Jonathan Frech
1
@alephalpha Jest też 0xf3c9( Dokumentacja Wolframa ).
Jonathan Frech
4

Java 8, 137 136 134 126 119 116 bajtów

m->{int r=1,l=m.length,i=l*l,j,k;for(;i-->0;)r=m[j=i/l][k=i%l][0]!=m[k][j][0]|m[j][k][1]!=-m[k][j][1]?0:r;return r;}

-3 bajty dzięki @ceilingcat .

Zwraca 1jeśli Hermitian,0 przeciwnym razie.

Wyjaśnienie:

Wypróbuj online.

m->{                 // Method with 3D integer-array as parameter and boolean return-type
  int r=1,           //  Flag-integer `r`, starting at 1
      l=m.length,    //  The size of the 3D input array
      i=l*l,j,k;     //  Index-integers
  for(;i-->0;)       //  Loop over the rows and columns
    r=m[j=i/l][k=i%l][0]!=m[k][j][0]
                     //   If the first numbers diagonally aren't equal,
      |m[j][k][1]!=-m[k][j][1]?
                     //   or the second numbers aren't negatives of each other:
       0             //    Set the flag `r` to 0
      :              //   Else:
       r;            //    Leave the flag `r` the same
  return r;}         //  Return the flag `r`
Kevin Cruijssen
źródło
3

J , 14 bajtów

[:(+-:|:)j./"1

Wypróbuj online!

Wyjaśnienie

[:(+-:|:)j./"1  Input: 3d array
         j./"1  Reduce by complex combine at rank 1
[:              Cap, operate on the 2d array of complex values
   +              Conjugate
      |:          Transpose
    -:            Match?
mile
źródło
Również 14:-:0 2|:(,-)/"1
FrownyFrog
3

Haskell , 50 bajtów

-7 bajtów dzięki H.PWiz.

(==)<*>map(map((0-)<$>)).foldr(zipWith(:))e
e=[]:e

Wypróbuj online!

całkowicie ludzki
źródło
3

Galaretka ,  6  5 bajtów

Z×Ø+⁼

Monadyczny link zwracający 1dane wejściowe hermitowskie i 0nie tylko.

Wypróbuj online!

W jaki sposób?

Z×Ø+⁼ - Link: list of lists of lists, M
Z     - transpose
  Ø+  - literal = [1,-1]
 ×    - multiply (vectorises)
    ⁼ - equal to M?
Jonathan Allan
źródło
Wierzę, że współczesna Jelly ma Ø+.
lirtosiast
@lirtosiast rzeczywiście masz rację, zaktualizowany do korzystania z niego; dzięki!
Jonathan Allan,
2

05AB1E , 9 bajtów

øεεX®‚*]Q

Wypróbuj online!

Wyjaśnienie

ø           # transpose
 ε          # apply to each 2-d array
  ε         # apply to each pair
   X®‚*     # multiply by [1,-1]
       ]    # end apply(s)
        Q   # compare to input for equality
Emigna
źródło
1

Perl 5 , -a0 48 bajtów

Stare liczenie: 50 bajtów (+2 dlaa0 ). Nieźle jak na język, który nie ma wbudowanej transpozycji (wcale nie jestem zazdrosny, nie ma sirree)

Podaj macierz wejściową na STDIN ,pomiędzy częścią rzeczywistą a urojoną, np .:

2,0 2,1 4,0
2,-1 3,0 0,1
4,0 0,-1 1,0

Wydrukuje 1dla pustelnika, nic innego

#!/usr/bin/perl -a0
say@F~~[map/(\S+,)(\S+)/gc?$1.-$2:(),(/.+/g)x@F]

Wypróbuj online!

Ton Hospel
źródło
1

Łuska , 7 bajtów

=¹mmṀ_T

Wypróbuj online!

W jaki sposób?

Zauważ, że powinno działać zamiast mm , ale jest irytujący błąd który uniemożliwia mi jego użycie :(

= ¹mmṀ_T - Pełny program. Pobiera dane wejściowe z argumentów wiersza poleceń jako listę list krotek.
  m T - Dla każdej listy w transpozycji danych wejściowych ...
   mṀ_ - ... Neguj ostatnią wartość każdej zawartej w nich krotki.
= ¹ - Sprawdź, czy jest to to samo co wejście.
Pan Xcoder
źródło
1

JavaScript (ES6), 53 bajty

Zaoszczędź 2 bajty dzięki @Neil

Zwraca falsedla pustelnika lub truenie-pustelnika.

m=>m.some((r,y)=>r.some(([a,b],x)=>m[x][y]!=a+[,-b]))

Wypróbuj online!

Arnauld
źródło
Zaoszczędź 3 bajty na codegolf.stackexchange.com/a/156714 - f=([c,...s],p='')=>c?p+c+f(s,p+'🍹'):p.
Neil
1

C (gcc) , 107 103 100 bajtów

j,k,r;f(A,s)int***A;{for(r=0,j=s;j--;)for(k=s;k--;)r|=*A[j][k]-*A[k][j]|A[j][k][1]+A[k][j][1];A=!r;}

Wypróbuj online!

Jonathan Frech
źródło
103 bajty
Steadybox
@Steadybox Bardzo dziękuję. Zabawne ... Kilka godzin temu miałem na myśli właśnie ten golf - dereferencje zamiast indeksowania - ale po prostu zapomniałem ...
Jonathan Frech
@ceilingcat Dziękuję.
Jonathan Frech
0

Właściwie 13 bajtów

┬⌠⌠Çá╫k⌡M⌡Mß=

Wypróbuj online!

Jak to działa?

To zgłoszenie faktycznie wykorzystuje liczby zespolone. Jeśli dozwolone jest przyjmowanie danych wejściowych jako macierzy złożonych wpisów, wówczas będzie to 8 bajtów .

┬⌠⌠Çá╫k⌡M⌡Mß=  –> Full program.
┬              –> Transpose.
 ⌠       ⌡M    –> For each list in the input's transpose do the following:
  ⌠    ⌡M         –> For each two-element list of the form [a, b]...
   Ç              –> Turn it into a complex number (a+bi).
    á             –> Find its complex conjugate: Push (a-bi).
     ╫k           –> Push [Re(N), Im(N)], so [a, -b].
           ß=  –> Check whether the result equals the input.
Pan Xcoder
źródło
0

Pyth, 9 bajtów

qCmm,hk_e

Wyjaśnienie:

qCmm,hk_ekdQQ  Autofill variables
    ,hk_ek     [a,-b]...
  mm      dQ    ...for each [a,b] in the input (m...Q)'s rows (m...d).
 C             Transpose.
q           Q  Is this result equal to the original?

Zestaw testowy .

Steven H.
źródło
Twoja odpowiedź jest rzeczywiście 9 bajtów ... 9-bajtowy alternatywa: qCmm*V_B1.
Pan Xcoder
Grałem w golfa o jeden bajt podczas przesyłania, od qCmm.e_Fbk... najwyraźniej zapomniałem edytować liczbę bajtów w ostatnim zgłoszeniu. @ Mr.Xcoder Naprawiłem to niezależnie, dzięki za haczyk!
Steven H.,
0

C,  111   110  108 bajtów

Dzięki @Jonathan Frech za uratowanie bajtu i dzięki @ceilingcat za uratowanie dwóch bajtów!

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;return!r;}

Wypróbuj online!

C (gcc) ,  106  104 bajtów

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;A=!r;}

Wypróbuj online!

Steadybox
źródło
Myślę, że r|=...|...działa również r+=...||....
Jonathan Frech
@JathanathanFrech Tak, to prawda. Dzięki!
Steadybox
0

Właściwie 13 bajtów

;┬⌠⌠d±@q⌡M⌡M=

Wypróbuj online!

Wyjaśnienie:

;┬⌠⌠d±@q⌡M⌡M=
;              make a copy
 ┬             transpose copy
  ⌠⌠d±@q⌡M⌡M   for each row:
   ⌠d±@q⌡M       for each cell in row:
    d              remove last element from list
     ±             swap sign
      @q           insert at end of list
            =  compare equality with original
Mego
źródło