Properti Fungsi Biner

14

Banyak topik penting dalam aljabar abstrak melibatkan fungsi biner yang bekerja pada suatu set. Sejumlah properti dari fungsi-fungsi tersebut telah didefinisikan dalam penyelidikan topik-topik tersebut.

Tantangan Anda adalah menentukan apakah fungsi biner yang diberikan pada domain tertentu memiliki lima properti ini.

Properti

Penutupan

Fungsi biner ditutup jika setiap output yang mungkin ada dalam domain.

Asosiatif

Fungsi biner asosiatif jika urutan fungsi diterapkan ke serangkaian input tidak mempengaruhi hasilnya. Artinya, $asosiatif jika (a $ b) $ cselalu sama a $ (b $ c). Perhatikan bahwa karena nilai (a $ b)digunakan sebagai input, fungsi asosiatif harus ditutup.

Komutatif

Fungsi biner komutatif jika menukar urutan input tidak mengubah hasilnya. Dengan kata lain, jika a $ bselalu sama b $ a.

Identitas

Fungsi biner memiliki elemen identitas jika ada beberapa elemen edi domain sehingga a $ e = a = e $ auntuk semua yang ada adi domain.

Idempotensi

Fungsi biner idempoten jika menerapkannya pada dua input identik memberikan angka sebagai output. Dengan kata lain, jika a $ a = auntuk semua ada adi domain.

Memasukkan

Anda akan diberi fungsi dalam bentuk matriks, dan domain fungsi tersebut adalah angka 0 ... n-1, di mana npanjang sisi matriks.

Nilai (a $ b)dikodekan dalam matriks sebagai elemen ake - th baris b. Jika matriks inputnya adalah Q, maka a $ b=Q[a][b]

Misalnya, fungsi eksponensial ( **dalam Python) pada domain [0, 1, 2]dikodekan sebagai:

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

Domain kiri dan kanan adalah sama, sehingga matriks akan selalu persegi.

Anda dapat menggunakan format matriks yang mudah digunakan sebagai input, seperti daftar daftar, daftar tunggal dalam urutan baris atau kolom, objek matriks asli bahasa Anda, dll. Namun, Anda tidak boleh menggunakan fungsi secara langsung sebagai input.

Untuk kesederhanaan, semua entri matriks akan menjadi bilangan bulat. Anda dapat berasumsi bahwa mereka cocok dengan tipe integer asli bahasa Anda.

Keluaran

Anda dapat menunjukkan properti mana di atas yang menahan format apa pun yang Anda pilih, termasuk daftar boolean, string dengan karakter yang berbeda untuk setiap properti, dll. Namun, harus ada output yang unik dan unik untuk masing-masing dari 24 himpunan bagian yang mungkin dari properti. Output ini harus mudah dibaca manusia.

Contohnya

Fungsi maksimum pada domain n = 4:

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

Fungsi ini memiliki sifat penutupan, asosiatif, komutatif, identitas, dan idempotensi.

Fungsi eksponensial pada domain n = 3:

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

Fungsi ini tidak memiliki properti di atas.

Fungsi penambahan pada domain n = 3:

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

Fungsi ini memiliki sifat komutatif dan identitas.

K Combinator pada domain n = 3:

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

Fungsi ini memiliki sifat closure, associativity dan idempotence.

Fungsi perbedaan mutlak pada domain n = 3:

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

Fungsi ini memiliki sifat penutupan, komutatifitas dan identitas.

Fungsi rata-rata, pembulatan ke genap, pada domain n = 3:

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

Fungsi ini memiliki sifat penutupan, komutatifitas, identitas dan idempoten.

Fungsi kesetaraan pada domain n = 3:

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

Fungsi ini memiliki sifat penutupan dan komutatif.

Tantangan

Ini golf kode. Celah standar berlaku. Paling tidak byte menang.

isaacg
sumber

Jawaban:

4

Pyth, 51 byte

[qKUQ@VQKCIQ}]Km{@RdCBQKJ!-sQK&JqF.bsm@[email protected],sQK

Cobalah online: Demonstrasi atau Test Suite

Ini mencetak daftar 5 nilai boolean. Mereka menunjukkan properti dalam urutan:

[Idempotence, Commutativity, Identity, Closure, Associativity]

Berikut ini adalah format output yang lebih baik: Demonstrasi atau Test Suite

Penjelasan:

Idempotensi:

qKUQ@VQK
   Q       Q = input matrix
  UQ       [0, 1, ..., len(matrix)-1]
 K         assign to K
    @VQK   vectorized lookup of Q and K //gets the diagonal elements
qK         check, if this is equal to K

Komutatif:

CIQ   check if transpose(Q) is equal to Q

Identitas:

}]Km{@RdCBQK
   m       K   map each d in K to:
        CBQ       the list [Q, transpose(Q)]
     @Rd          take the d-th element of each ^
    {             remove duplicates
}]K            check if [K] is in ^

Penutupan:

J!-sQK
   sQ    sum(Q) //all elements of Q
  -  K   remove the elements, that also appear in K
 !       ckeck, if the results in an empty list
J        store the result in J

Asosiatif:

&JqF.bsm@[email protected],sQK
               .p,sQK  all permutations of [sum(Q), K] //all 2 ;-)
    .b                 map each pair (N,Y) of ^ to:
       m      N           map each d of N to:
          @Qd                the row Q[d]
        @L   Y               map each element of Y to the corr. element in ^
      s                   unfold this 2-d list
  qF                   check if they result in identically lists
&J                     and J
Jakube
sumber
5

Haskell, 178 171 byte

import Data.List
f x=[c,c&&and[(m%n)%o==m%(n%o)|m<-b,n<-b,o<-b],x==t,all(elem b)[x,t],b==[i%i|i<-b]]where c=all(l>)(id=<<x);b=[0..l-1];a%b=x!!a!!b;l=length x;t=transpose x

Mengembalikan daftar dengan lima boolean, yang dalam urutan penutupan, asosiatif, komutatif, identitas, dan idempotensi.

Contoh penggunaan: f [[1, 0, 0],[0, 1, 0],[0, 0, 1]]-> [True,False,True,False,False].

Bagaimana itu bekerja:

f x=[
  c,                         -- closure (see below)
  c&&and[(m%n)%o==m%(n%o)|   -- assoc: make sure it's closed, then check the
          m<-b,n<-b,o<-b],   --        assoc rule for all possible combinations
  x==t,                      -- comm: x must equal it's transposition
  all(elem b)[x,t],          -- identity: b must be a row and a column
  b==[i%i|i<-b]              -- idemp: element at (i,i) must equal i
  ]
  where                      -- some helper functions
  c=all(l>)(id=<<x);         -- closure: all elements of the input must be < l 
  b=[0..l-1];                -- a list with the numbers from 0 to l-1
  a%b=x!!a!!b;               -- % is an access function for index (a,b)
  l=length x;                -- l is the number of rows of the input matrix
  t=transpose x

Edit @xn atau temukan beberapa byte untuk disimpan. Terima kasih!

nimi
sumber
Bagaimana dengan c=all(l>)?
xnor
Juga [i%i|i<-b]==b,.
xnor
Sangat mudah dibaca untuk golf kode - bagus!
isaacg
4

CJam, 95 byte

q~:Ae_A,:Bf<:*'**B3m*{_{A==}*\W%{Az==}*=}%:*'A*A_z='C*B{aB*ee_Wf%+{A==}f*B,2*='1*}%Ae_B)%B,='I*

Mencetak selanjutnya dari *AC1I. *adalah simbol untuk penutupan , Auntuk asosiatif , Cuntuk komutatif , 1untuk identitas dan Iuntuk idempoten .


Array input dibaca q~dan disimpan dalam A ( :A).

Penutupan

Ae_A,:Bf<:*'**

Jika semua ( :*) elemen dalam matriks ( Ae_) lebih kecil f<dari B = ukuran (A) ( A,:B), cetak a *( '**).

Asosiatif

B3m*{_{A==}*\W%{Az==}*=}%:*'A*

Hasilkan semua tiga kali lipat dalam domain ( B3m*). Kami mencetak Ajika mereka semua memenuhi persyaratan ( {...}%:*'A*).

Syaratnya adalah, untuk beberapa tripel [i j k], melipat kiri daftar dengan A ( _{A==}*) dan melipat kiri kebalikannya [k j i]( \W%) dengan A op ( {Az==}*), versi terbalik A, sama ( =).

Komutatif

Sebuah harus sama transposnya: A_z=. Jika demikian, kami mencetak C( 'C=).

Identitas

B{                         }%   For each element X in the domain (0..N-1):
  aB*                           Make N copies.
     ee                         [[0 X] [1 X] ...]
       _Wf%+                    [[0 X] [1 X] ... [X 0] [X 1] ...]
            {A==}f*             [A(0, X) A(1, X) ... A(X, 0) A(X, 1)]
                   B,2*=        This list should equal the domain list repeated twice.
                        '1*     If so, X is an identity: print a 1.

Identitas itu tentu unik, jadi kami hanya bisa mencetaknya 1.

Idempoten

Ae_B)%B,='I*

Periksa apakah diagonal sama dengan B,. Jika demikian, cetak sebuah I.

Lynn
sumber
3

Matlab, 226

a=input('');n=size(a,1);v=1:n;c=all(0<=a(:)&a(:)<n);A=c;for i=v;for j=v(1:n*c);for k=v(1:n*c);A=A&a(a(i,j)+1,k)==a(i,a(j,k)+1);end;end;b(i)=all(a(i,:)==v-1 & a(:,i)'==v-1);end;disp([c,A,~norm(a-a'),any(b),all(diag(a)'==v-1)])

Satu hal penting untuk diperhatikan adalah bahwa non-tertutup menyiratkan non-asosiatif. Banyak dari properti tersebut dapat dengan mudah diperiksa menggunakan beberapa properti dari matriks:

  • Penutupan : Semua semua entri matriks dalam rentang yang diberikan?
  • Asosiatif : Seperti yang selalu paling sulit untuk diperiksa
  • Commutativity : Apakah matriksnya simetris?
  • Identitas : Apakah ada indeks k sedemikian rupa sehingga baris ke-k dan kolom ke-k adalah persis daftar indeks?
  • Idempotensi : Apakah diagonal sesuai dengan daftar indeks?

Input melalui notasi Matlab standar: [a,b;c,d]atau [[a,b];[c,d]]atau [a b;c d]dll

Output adalah vektor dari yang nol, 1 = benar, 0 = salah, untuk masing-masing properti dalam urutan yang diberikan.

Kode lengkap:

a=input('');
n=size(a,1);
v=1:n;
c=all(0<=a(:)&a(:)<n);               %check for closedness
A=c;
for i=v;
   for j=v(1:n*c); 
      for k=v(1:n*c);
          A=A&a(a(i,j)+1,k)==a(i,a(j,k)+1);   %check for associativity (only if closed)
      end;
   end;
   b(i)=all(a(i,:)==v-1 & a(:,i)'==v-1);      %check for commutativity
end
%closure, assoc, commut, identity, idempotence
disp([c,A,~norm(a-a'),any(b),all(diag(a)'==v-1)]);
cacat
sumber
3

JavaScript (ES6) 165

Fungsi anonim mengembalikan array dengan lima nilai 0/1, yang dalam urutan Penutupan, Asosiasi, Komutatif, Identitas dan Idempotensi.

q=>q.map((p,i)=>(p.map((v,j)=>(w=q[j][i],v-w?h=C=0:v-j?h=0:0,q[v]?A&=!q[v].some((v,k)=>v-q[i][q[j][k]]):A=K=0),h=1,p[i]-i?P=0:0),h?I=1:0),A=P=K=C=1,I=0)&&[K,A,C,I,P]

Kurang golf

f=q=>(
  // A associativity, P idempotence, K closure, C commuativity
  // assumed true until proved false
  A=P=K=C=1, 
  I=0, // Identity assumed false until an identity element is found
  q.map((p,i)=> (
      h=1, // assume current i is identity until proved false
      p[i]-i? P=0 :0, // not idempotent if q[i][i]!=i for any i
      p.map((v,j)=> (
          w=q[j][i], // and v is q[i][j]
          v-w // check if q[j][i] != q[i][j]
          ? h=C=0 // if so, not commutative and i is not identity element too
          : v-j // else, check again for identity
            ? h=0 // i is not identity element if v!=j or w!=j
            : 0,
          q[v] // check if q[i][j] in domain
            ? A&=!q[v].some((v,k)=>v-q[i][q[j][k]]) // loop for associativity check
            : A=K=0 // q[i][j] out of domain, not close and not associative
        )
      ),
      h ? I=1 : 0 // if i is the identity element the identity = true
    )
  ),
  [K,A,C,I,P] // return all as an array
)

Uji

f=q=>
  q.map((p,i)=>(
    p.map((v,j)=>(
      w=q[j][i],
      v-w?h=C=0:v-j?h=0:0,
      q[v]?A&=!q[v].some((v,k)=>v-q[i][q[j][k]]):A=K=0
    ),h=1,p[i]-i?P=0:0),
    h?I=1:0
  ),A=P=K=C=1,I=0)
  &&[K,A,C,I,P]

// test

console.log=x=>O.textContent+=x+'\n';

T=[
 [
  [[0, 1, 2, 3],
   [1, 1, 2, 3],
   [2, 2, 2, 3],
   [3, 3, 3, 3]]
 ,[1,1,1,1,1]] // has the properties of closure, associativity, commutativity, identity and idempotence.
,[ // exponentiation function on domain n=3:
  [[1, 0, 0],
   [1, 1, 1],
   [1, 2, 4]]
 ,[0,0,0,0,0]] // has none of the above properties.
,[ // addition function on domain n=3:
  [[0, 1, 2],
   [1, 2, 3],
   [2, 3, 4]] 
 ,[0,0,1,1,0]] // has the properties of commutativity and identity.
,[ // K combinator on domain n=3:
  [[0, 0, 0],
   [1, 1, 1],
   [2, 2, 2]]
 ,[1,1,0,0,1]] // has the properties of closure, associativity and idempotence.
,[ // absolute difference function on domain n=3:
  [[0, 1, 2],
   [1, 0, 1],
   [2, 1, 0]]
 ,[1,0,1,1,0]] // has the properties of closure, commutativity and identity.
,[ // average function, rounding towards even, on domain n=3:
  [[0, 0, 1],
   [0, 1, 2],
   [1, 2, 2]]
 ,[1,0,1,1,1]] // has the properties of closure, commutativity, identity and idempotence.
,[ // equality function on domain n=3:
  [[1, 0, 0],
   [0, 1, 0],
   [0, 0, 1]]
 ,[1,0,1,0,0]] // has the properties of closure, commutativity,
]  

T.forEach(t=>{
  F=t[0],X=t[1]+'',R=f(F)+'',console.log(F.join`\n`+'\n'+R+' (expected '+X+') '+(X==R?'OK\n':'Fail\n'))
  })
<pre id=O></pre>

edc65
sumber