Ермітова матриця?


18

Зауважте, що цей виклик не потребує обробки чи розуміння складних чисел.

З огляду на не порожню квадратну матрицю, де кожен елемент є двоелементним цілим списком (Re, Im), визначте (даючи будь-які значення truthy / falesy або будь-які два послідовні значення), чи є це ермітовою матрицею.

Зауважте, що вхід - це тривимірний масив цілих чисел; не 2D масив складних чисел. Якщо ваша мова не може приймати 3D-масив безпосередньо, ви можете взяти плоский список (і форма n × n або n × n × 2, якщо це допомагає).

Матриця є ермітовою, якщо вона дорівнює її власному кон'юговому транспозиту . Іншими словами, якщо перевести його вгору ліворуч до нижньої правої діагоналі та заперечувати другий елемент усіх двоелементних аркушів листів, він ідентичний вхідній матриці. Зауважте, що порядок перегортання та заперечення не має значення, тому ви можете спробувати заперечити спочатку, а потім - згортати.

Приклад ходу

У цьому прикладі використовується JSON із зайвим пробілом для полегшення читання:

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

Транспонируйте (переверніть діагональ NW — SE):

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

Негативні другі елементи листів:

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

Оскільки це ідентично вводу, матриця є гермітською.

Тестові справи

Ермітик

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

Неермітинець

[[[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 Я все ще думаю. Якісь ідеї?
Adám

Для запису - новий Meta-post . (Я не голосував за закриття, але я бачу, що хтось має, тому мені цікаво, що громада думає з цього приводу).
Стюі Гріффін

5
@ Adám Я зробив би це максимально чітко, але це залежить від вас. Гнучкість у форматах введення та виведення зазвичай бажана, але не може бути зроблена за замовчуванням, особливо якщо ви говорите, що вхід - це 3D-масив реальних чисел; не 2D масив складних чисел . Незрозуміло, наскільки широка ваша концепція формату введення 3D-масиву
Луїс Мендо,

3
@ Adám Чи можна взяти за вхід пару двовимірних матриць (одну для реальної частини, одну для уявної частини)?
dylnan

1
@ dylnan No. Вхід має бути єдиною структурою, що представляє якусь тривимірність, де розмірність листа містить пари Re-Im.
Адам

Відповіді:


10

R, 71 48 47 байт

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

Бере 3D-масив реальних чисел, складає 2D масив уявних чисел, переносить, сполучує та порівнює.

Завдяки @Giuseppe за зменшення кількості байтів на приголомшливі 23 байти, а @Vlo - на остаточний 1!

Спробуйте в Інтернеті!

Приклад:

> 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]*1iмає зберегти кілька байт.
Джузеппе

@GIuseppe arf Я думав, що я спробував це, але, мабуть, ні. Спасибі!
планування

1
Крім того, isSymmetricіснує і працює для складних матриць Ермітій, але 1x1справа хитра, оскільки [атрибути крапель призводять до того, complexа неmatrix
Джузеппе,

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)
Лінійне

7

Октава , 39 34 31 байт

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

Спробуйте в Інтернеті!

Збережено 3 байти завдяки Луїсу Мендо, який повідомив мені про уточнення в тексті виклику.

Пояснення:

У MATLAB та Octave, ' - це сполучений комплекс транспозиції, а не "регулярний" транспозит.

Ми створюємо змінну y вбудовану, що є першим шаром тривимірної матриці плюс другим шаром, помноженим на складну одиницю j, тобто складну матрицю, де реальним терміном є перший "шар", а уявний - другий "шар". Потім ми перевіряємо, чи він дорівнює самому складному транспонованому кон'югату.

Це дозволить вивести матрицю, що містить лише 1якщо істинну, і матрицю, що містить щонайменше одну, 0якщо помилкова. Вони вважаються істинними та хибними в Октаві (Доказ) .



5

APL (Dyalog Unicode) , 22 15 9 7 байт

⍉≡⊢∘-

Спробуйте в Інтернеті!

Мовчазна префіксальна функція.

Дякуємо Адаму за 7 байт на Dfn, а також Адаму та ЕрікуТутОфергольфер для те, що з моєю дурістю допомагаючи мені знайти негласну версію.

Завдяки ngn за 2 байти у мовчазній версії.

Як?

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

Мова Вольфрама (Mathematica) , 45 34 33 26 21 18 байт

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

Спробуйте в Інтернеті!



@alephalpha Дякую велике; Я знаю, що 0xf3c7це оператор транспонування, але що це 0xf3c8?
Джонатан Фрех


4

Java 8, 137 136 134 126 119 116 байт

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 байти завдяки @ceilingcat .

Повертається, 1якщо Ермітій, 0інакше.

Пояснення:

Спробуйте в Інтернеті.

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

Желе ,  6  5 байт

Z×Ø+⁼

Монадійне посилання, що повертається 1для введення гермітів і в 0іншому випадку.

Спробуйте в Інтернеті!

Як?

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

Я вірю, що сучасне желе має Ø+.
ліртосіаст

@lirtosiast дійсно ви праві, оновлені, щоб ним користуватися; Спасибі!
Джонатан Аллан



1

Perl 5 , -a0 48 байт

Старий підрахунок: 50 байт ( +2дляa0 ). Непогано для мови, яка не має вбудованого перенесення (я взагалі не ревную, немає серрі)

Дайте вхідну матрицю на STDIN з ,між реальною та уявною частиною, наприклад:

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

Буде надруковано 1для гермітика, нічого іншого

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

Спробуйте в Інтернеті!


1

Лушпиння , 7 байт

=¹mmṀ_T

Спробуйте в Інтернеті!

Як?

Зауважте, що це має працювати замість mm , але є прикрою помилкою яка заважає мені його використовувати :(

= ¹mmṀ_T - Повна програма. Вводить дані з аргументів командного рядка як список списків кортежів.
  m T - для кожного списку транспорту введення ...
   mṀ_ - ... Зазначте останнє значення кожного кортежу, який вони містять.
= ¹ - Перевірте, чи це те саме, що вхід.


1

C (gcc) , 107 103 100 байт

  • Збережено чотири байти завдяки Steadybox ; гольф A[0]до *Aдва рази.
  • Збережено три байти завдяки плафоні .
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;}

Спробуйте в Інтернеті!



@Steadybox Спасибі велике. Смішно ... Кілька годин тому я мав на увазі саме цей гольф - перенаправлення замість індексації - але просто забув ...
Джонатан Фрех

@ceilingcat Дякую
Джонатан

0

Власне , 13 байт

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

Спробуйте в Інтернеті!

Як це працює?

Це подання фактично використовує складні числа. Якщо дозволено приймати введення як матрицю складних записів, то це було б 8 байт .

┬⌠⌠Çá╫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 байт

qCmm,hk_e

Пояснення:

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?

Тестовий набір .


Ваш відповідь насправді 9 байт ... 9-байтовий альтернатива: qCmm*V_B1.
Містер Xcoder

Коли я робив подання, я гольфував на один байт, qCmm.e_Fbkмабуть, я, мабуть, забув редагувати кількість байтів у остаточному поданні. @ Mr.Xcoder Я виправив це незалежно, дякую за улов!
Стівен Х.

0

C,  111   110  108 байт

Дякуємо @Jonathan Frech за збереження байту та спасибі @ceilingcat за збереження двох байтів!

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

Спробуйте в Інтернеті!

C (gcc) ,  106  104 байт

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

Спробуйте в Інтернеті!


Я думаю r|=...|..., що добре працює r+=...||....
Джонатан Фрех

@JonathanFrech Так, це так. Спасибі!
Steadybox

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.