Właściwości funkcji binarnych

14

Wiele ważnych tematów w algebrze abstrakcyjnej obejmuje funkcję binarną działającą na zbiorze. W badaniu takich tematów określono szereg właściwości takich funkcji.

Twoim wyzwaniem będzie ustalenie, czy dana funkcja binarna w danej domenie ma pięć z tych właściwości.

Nieruchomości

Zamknięcie

Funkcja binarna jest zamykana, jeśli każde możliwe wyjście znajduje się w domenie.

Stowarzyszenie

Funkcja binarna jest asocjacyjna, jeśli kolejność, w jakiej funkcja jest zastosowana do szeregu danych wejściowych, nie wpływa na wynik. Oznacza to, że $jest asocjacyjny, jeśli (a $ b) $ czawsze jest równy a $ (b $ c). Zauważ, że ponieważ wartość (a $ b)jest używana jako dane wejściowe, funkcje asocjacyjne muszą być zamknięte.

Przemienność

Funkcja binarna jest przemienna, jeśli zamiana kolejności danych wejściowych nie zmienia wyniku. Innymi słowy, jeśli a $ bzawsze jest równy b $ a.

Tożsamość

Funkcja binarna ma element tożsamości, jeśli istnieje jakiś element ew domenie, taki jak a $ e = a = e $ adla wszystkich aw domenie.

Idempotencja

Funkcja binarna jest idempotentna, jeśli zastosowanie jej do dwóch identycznych danych wejściowych daje tę liczbę jako wynik. Innymi słowy, jeśli a $ a = adla wszystkich aw domenie.

Wejście

Otrzymasz funkcję w postaci macierzy, a domeną funkcji będą liczby 0 ... n-1, gdzie njest długość boku matrycy.

Wartość (a $ b)jest zakodowana w macierzy jako ath- bty element wiersza . Jeśli macierzą wejściową jest Q, to a $ b=Q[a][b]

Na przykład funkcja wykładnicza ( **w języku Python) w domenie [0, 1, 2]jest kodowana jako:

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

Domeny lewa i prawa są takie same, więc macierz zawsze będzie kwadratowa.

Możesz użyć dowolnego wygodnego formatu macierzy jako danych wejściowych, takiego jak lista list, pojedyncza lista w kolejności rzędów lub kolumn, rodzimy obiekt macierzy języka itp. Jednak nie możesz przyjąć funkcji bezpośrednio jako danych wejściowych.

Dla uproszczenia wszystkie wpisy w macierzy będą liczbami całkowitymi. Możesz założyć, że pasują one do rodzimej liczby całkowitej twojego języka.

Wynik

Możesz wskazać, które z powyższych właściwości przechowują w dowolnym wybranym formacie, w tym listę wartości logicznych, ciąg znaków z innym znakiem dla każdej właściwości itp. Jednak musi istnieć odrębny, unikalny wynik dla każdego z 24 możliwych podzbiorów właściwości. To wyjście musi być łatwe do odczytania przez człowieka.

Przykłady

Maksymalna funkcja w domenie n = 4:

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

Ta funkcja ma właściwości zamknięcia, asocjatywności, przemienności, tożsamości i idempotencji.

Funkcja potęgowania w domenie n = 3:

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

Ta funkcja nie ma żadnej z powyższych właściwości.

Funkcja dodawania w domenie n = 3:

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

Ta funkcja ma właściwości przemienności i tożsamości.

Kombinator K w domenie n = 3:

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

Ta funkcja ma właściwości zamknięcia, asocjatywności i idempotencji.

Funkcja różnicy absolutnej w domenie n = 3:

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

Ta funkcja ma właściwości zamknięcia, przemienności i tożsamości.

Średnia funkcja, w zaokrągleniu do parzystej, w dziedzinie n = 3:

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

Ta funkcja ma właściwości zamknięcia, komutatywności, tożsamości i idempotencji.

Funkcja równości w domenie n = 3:

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

Ta funkcja ma właściwości zamknięcia i przemienności.

Wyzwanie

To jest kod golfowy. Obowiązują standardowe luki . Najmniej bajtów wygrywa.

isaacg
źródło

Odpowiedzi:

4

Pyth, 51 bajtów

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

Wypróbuj online: demonstracja pakiet lub testowy

Wyświetla listę 5 wartości logicznych. Wskazują właściwości w kolejności:

[Idempotence, Commutativity, Identity, Closure, Associativity]

Oto lepszy format wyjściowy: Demonstracja lub Test Suite

Wyjaśnienie:

Idempotencja:

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

Przemienność:

CIQ   check if transpose(Q) is equal to Q

Tożsamość:

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

Zamknięcie:

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

Stowarzyszenie:

&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
źródło
5

Haskell, 178 171 bajtów

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

Zwraca listę z pięcioma logicznymi, które są w kolejności zamykania, asocjatywności, przemienności, tożsamości i idempotencji.

Przykład użycia: f [[1, 0, 0],[0, 1, 0],[0, 0, 1]] -> [True,False,True,False,False].

Jak to działa:

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

Edytuj @xnor znalazł bajty do zapisania. Dzięki!

nimi
źródło
Jak o c=all(l>)?
xnor
Również [i%i|i<-b]==b.
xnor
Bardzo czytelny do gry w golfa - miło!
isaacg
4

CJam, 95 bajtów

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*

Wyświetla podsekwencję *AC1I. *jest symbolem zamknięcia , Ajest dla stowarzyszeniowej , Cjest przemienne , 1to dla tożsamości i Ijest dla idempotent .


Tablica wejściowa jest odczytywana q~i zapisywana w A ( :A).

Zamknięcie

Ae_A,:Bf<:*'**

Jeśli wszystkie :*elementy ( ) w macierzy ( Ae_) są mniejsze f<niż B = rozmiar (A) ( A,:B), wydrukuj a *( '**).

Stowarzyszenie

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

Wygeneruj wszystkie trzykrotnie w domenie ( B3m*). Drukujemy, Ajeśli wszystkie spełniają warunek ( {...}%:*'A*).

Warunkiem jest, że dla niektórych potrójnych [i j k], składanie w lewo tej listy za pomocą A ( _{A==}*) i składanie w lewo jej odwrotnej [k j i]( \W%) za pomocą A op ( {Az==}*), odwróconej wersji A, są równe ( =).

Przemienność

Musi być równa jej transpozycję: A_z=. Jeśli tak, drukujemy C( 'C=).

Tożsamość

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.

Tożsamość jest z konieczności unikalna, więc możemy wydrukować tylko jedną 1.

Idempotent

Ae_B)%B,='I*

Sprawdź, czy przekątna jest równa B,. Jeśli tak, wydrukuj I.

Lynn
źródło
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)])

Ważną rzeczą, na którą należy zwrócić uwagę, jest to, że brak zamknięcia oznacza brak powiązania. Wiele z tych właściwości można łatwo sprawdzić za pomocą niektórych właściwości macierzy:

  • Zamknięcie : wszystkie wszystkie wpisy macierzy w danym zakresie?
  • Asocjatywność : jak zawsze najtrudniejsza do sprawdzenia
  • Komutatywność : czy macierz jest symetryczna?
  • Tożsamość : Czy istnieje indeks k taki, że k-ty rząd i k-ta kolumna są dokładnie listą indeksów?
  • Idempotencja : Czy przekątna odpowiada liście indeksów?

Wprowadzanie za pomocą standardowej notacji Matlab: [a,b;c,d]lub [[a,b];[c,d]]lub [a b;c d]itp

Dane wyjściowe to wektor zer zerowych, 1 = prawda, 0 = fałsz dla każdej właściwości w podanej kolejności.

Pełny kod:

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)]);
wada
źródło
3

JavaScript (ES6) 165

Anonimowa funkcja zwracająca tablicę z pięcioma wartościami 0/1, które są w kolejności Zamknięcie, Asocjatywność, Komutatywność, Tożsamość i Idempotencja.

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]

Mniej golfa

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
)

Test

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
źródło