Matrice eremitica?


18

Nota che questa sfida non richiede la gestione o la comprensione di numeri complessi.

Data una matrice quadrata non vuota in cui ogni elemento è un elenco intero a due elementi (Re, Im), determinare (fornendo qualsiasi valore di verità / falsità o due valori coerenti) se questo rappresenta una matrice eremitica.

Si noti che l'input è un array 3D di numeri interi; non una matrice 2D di numeri complessi. Se la tua lingua non può prendere direttamente un array 3D, puoi prendere un elenco semplice (e la forma n × n o n × n × 2 se ciò aiuta).

Una matrice è eremitica se è uguale alla sua trasposizione coniugata . In altre parole, se lo capovolgi attraverso la diagonale superiore sinistra a quella inferiore destra e annulli il secondo elemento di tutte le liste foglia a due elementi, è identico alla matrice di input. Nota che l'ordine di capovolgere e negare è irrilevante, quindi puoi prima negare e poi capovolgere.

Esempio di guida

Questo esempio usa JSON con spazi vuoti superflui per facilitare la lettura:

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

Trasposizione (capovolgi diagonale NO - SE):

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

Annulla i secondi elementi delle liste foglia:

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

Poiché questo è identico all'input, la matrice è eremitica.

Casi test

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

Non-Hermitiana

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


@LuisMendo Sto ancora pensando. Qualche idea?
Adám,

Per la cronaca, un nuovo Meta-post . (Non ho votato per chiudere, ma vedo che qualcuno ha, quindi sono curioso di sapere cosa ne pensi la comunità).
Stewie Griffin,

5
@Adám Lo renderei il più esplicito possibile, ma dipende da te. La flessibilità nei formati di input e output è generalmente desiderata, ma non può essere dedotta per impostazione predefinita, specialmente quando si dice che l'input è un array 3D di numeri reali; non una matrice 2D di numeri complessi . Non è chiaro quanto sia ampio il tuo concetto di formato di input di array 3D
Luis Mendo,

3
@ Adám È possibile prendere come input una coppia di matrici 2D (una per la parte reale, una per la parte immaginaria)?
dylnan,

1
@dylnan No. L'input deve essere una singola struttura che rappresenta una sorta di tridimensionalità in cui la dimensione foglia contiene le coppie Re-Im.
Adám,

Risposte:


10

R, 71 48 47 byte

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

Prende una matrice 3D di numeri reali, crea una matrice 2D di numeri immaginari, traspone, coniuga e confronta.

Grazie a @Giuseppe per aver ridotto il numero di byte di 23 byte sorprendenti e a @Vlo per l'1 finale!

Provalo online!

Esempio:

> 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

1
B=A[,,1]+A[,,2]*1idovrebbe salvare qualche byte.
Giuseppe,

@GIuseppe arf Pensavo di averlo provato ma apparentemente no. Grazie!
plannapus,

1
Inoltre, isSymmetricesiste e funziona per matrici complesse eremitiche, ma il 1x1caso è complicato poiché lascia [cadere gli attributi e si traduce in un complexanziché in unmatrix
Giuseppe,

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)L'assegnazione in linea salva 1.
Vlo,

7

Ottava , 39 34 31 byte

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

Provalo online!

Salvato 3 byte grazie a Luis Mendo che mi ha informato dei chiarimenti nel testo della sfida.

Spiegazione:

In MATLAB e Octave, 'il complesso coniugato è trasposto, non il recepimento "normale".

Creiamo una variabile in ylinea che è il primo strato della matrice 3D più il secondo strato moltiplicato per l'unità complessaj , ovvero una matrice complessa in cui il termine reale è il primo "livello" e l'immaginario è il secondo "livello". Quindi controlliamo se è uguale a se stesso coniugato complesso trasposto.

Questo produrrà una matrice contenente solo 1se vera e una matrice contenente almeno una 0se falsa. Questi sono considerati veri e falsi in Octave (Proof) .



5

APL (Dyalog Unicode) , 22 15 9 7 byte

⍉≡⊢∘-

Provalo online!

Funzione prefisso tacita.

Grazie ad Adám per 7 byte sul Dfn e ad Adám ed ErikTheOutgolfer per aver sopportato la mia stupidità aiutandomi a trovare la versione tacita.

Grazie a ngn per 2 byte sulla versione tacit.

Come?

⍉≡⊢∘- 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.

5

Wolfram Language (Mathematica) , 45 34 33 26 21 18 byte

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

Provalo online!



@alephalpha Grazie mille; So che 0xf3c7è l'operatore di trasposizione, ma che cos'è 0xf3c8?
Jonathan Frech,

1
@alephalpha C'è anche 0xf3c9( documentazione Wolfram ).
Jonathan Frech,

4

Java 8, 137 136 134 126 119 116 byte

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 byte grazie a @ceilingcat .

Ritorna 1se Hermitian, 0altrimenti.

Spiegazione:

Provalo 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`

3

J , 14 byte

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

Provalo online!

Spiegazione

[:(+-:|:)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?

Anche 14:-:0 2|:(,-)/"1
FrownyFrog,


3

Gelatina ,  6  5 byte

Z×Ø+⁼

Un collegamento monadico che ritorna 1per un input hermitano e 0non.

Provalo online!

Come?

Z×Ø+⁼ - Link: list of lists of lists, M
Z     - transpose
  Ø+  - literal = [1,-1]
 ×    - multiply (vectorises)
    ⁼ - equal to M?

Credo che lo abbia fatto Jelly moderna Ø+.
lirtosiast,

@lirtosiast in effetti hai ragione, aggiornato per usarlo; Grazie!
Jonathan Allan,

2

05AB1E , 9 byte

øεεX®‚*]Q

Provalo online!

Spiegazione

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


1

Perl 5 , -a0 48 byte

Vecchio conteggio: 50 byte ( +2per a0). Non male per un linguaggio che non ha trasposizione incorporata (non sono affatto geloso, niente sirree)

Fornire la matrice di input su STDIN con , tra la parte reale e quella immaginaria, quindi ad esempio:

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

Stampa 1per l'eremita, nient'altro

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

Provalo online!


1

Buccia , 7 byte

=¹mmṀ_T

Provalo online!

Come?

Nota che dovrebbe funzionare invece di mm , ma c'è un fastidioso bug che mi impedisce di usarlo :(

= ¹mmṀ_T - Programma completo. Prende input dagli arg della riga di comando, come un elenco di elenchi di tuple.
  m T - Per ogni elenco nella trasposizione dell'ingresso ...
   mṀ_ - ... Nega l'ultimo valore di ogni tupla che contengono.
= ¹ - Controlla se è uguale all'input.


1

C (gcc) , 107 103 100 100 byte

  • Quattro byte salvati grazie a Steadybox ; golf A[0]a *Adue volte.
  • Salvato tre byte grazie a ceilingcat .
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;}

Provalo online!



@Steadybox Grazie mille. Divertente ... Alcune ore fa avevo in mente esattamente questo golf - dereferenziare invece di indicizzare - ma semplicemente dimenticavo ...
Jonathan Frech,

@ceilingcat Grazie.
Jonathan Frech,

0

In realtà , 13 byte

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

Provalo online!

Come funziona?

Questa presentazione fa effettivamente uso di numeri complessi. Se fosse consentito prendere l'input come matrice di voci complesse, allora sarebbe di 8 byte .

┬⌠⌠Çá╫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.

0

Pyth, 9 byte

qCmm,hk_e

Spiegazione:

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?

Suite di test .


La vostra risposta è in realtà 9 byte ... A 9 byte alternativa: qCmm*V_B1.
Mr. Xcoder,

Ho golfato un byte mentre stavo facendo l'invio, da qCmm.e_Fbk... a quanto pare ho dimenticato di modificare il conteggio dei byte nell'invio finale. @ Mr.Xcoder l'ho risolto a prescindere, grazie per la cattura!
Steven H.

0

C,  111   110  108 108 byte

Grazie a @Jonathan Frech per aver salvato un byte e grazie a @ceilingcat per aver salvato due byte!

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;}

Provalo online!

C (gcc) ,  106  104 byte

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;}

Provalo online!


Penso che r|=...|...funzioni anche r+=...||....
Jonathan Frech,

@JonathanFrech Sì, lo fa. Grazie!
Steadybox,

0

In realtà , 13 byte

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

Provalo online!

Spiegazione:

;┬⌠⌠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
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.