Napisz program, który określa, czy tabliczka mnożenia danej skończonej magmy reprezentuje grupę. Magma to zbiór z operacją binarną, która jest zamknięta, to znaczy
- dla wszystkich a, bw G, a * b jest ponownie w G (Closedness)
Niech (G, *) będzie magmą. (G, *) to grupa, jeśli
- dla wszystkich a, b, cw G, (a * b) * c = a * (b * c) (asocjatywność)
- istnieje element e w G taki, że e * a = a * e = a dla wszystkich a w G (Istnienie elementu neutralnego)
- dla wszystkich a w G występuje ab w G tak, że a * b = b * a = e gdzie e jest elementem neutralnym (istnienie odwrotności)
Okular
Dane wejściowe składają się z ciągu n ^ 2-1 znaków (jeden znak dla każdego elementu magmy, dozwolone są 0-9, az) i po prostu reprezentują tabelę czytaną wiersz po rzędzie, z pominięciem nazwy operatora. Możesz założyć, że dane wejściowe reprezentują prawidłową magmę (co oznacza, że każdy z elementów występuje dokładnie raz w wierszu / kolumnie nagłówka).
Przykład: oto tabela Z_4
+ | 0 1 2 3
-----------
0 | 0 1 2 3
1 | 1 2 3 0
2 | 2 3 0 1
3 | 3 0 1 2
Ciąg wejściowy będzie 012300123112302230133012
. (Lub jeśli użyjemy symboli, może to być również nezdnnezdeezdnzzdneddnez
). Pamiętaj, że sekwencja elementów w wierszu i kolumnie nie musi być taka sama, więc tabela Z_4 może również wyglądać tak:
+ | 1 3 2 0
-----------
1 | 2 0 3 1
0 | 1 3 2 0
2 | 3 1 0 2
3 | 0 2 1 3
Oznacza to również, że element neutralny niekoniecznie znajduje się w pierwszej kolumnie lub pierwszym rzędzie.
Jeśli jest to grupa, program musi zwrócić znak reprezentujący element neutralny. Jeśli nie, musi zwrócić wartość fałszowania (różną od wartości 0-9 az)
Przypadki testowe
Niegrupowanie można łatwo skonstruować, zmieniając tylko jedną cyfrę ciągu lub sztucznie zmieniając tabele definiujące operację, która jest sprzeczna z jednym z aksjomatów grupy.
Grupy
Trywialny
* | x
-----
x | x
xxx
Neutral Element: x
H (grupa czwartorzędowa)
* | p t d k g b n m
-------------------
m | b d t g k p m n
p | m k g d t n p b
n | p t d k g b n m
b | n g k t d m b p
t | g m n p b k t d
d | k n m b p g d t
k | t b p m n d k g
g | d p b n m t g k
ptdkgbnmmbdtgkpmnpmkgdtnpbnptdkgbnmbngktdmbptgmnpbktddknmbpgdtktbpmndkggdpbnmtgk
Neutral Element: n
D_4
* | y r s t u v w x
-------------------
u | u x w v y t s r
v | v u x w r y t s
w | w v u x s r y t
x | x w v u t s r y
y | y r s t u v w x
r | r s t y v w x u
s | s t y r w x u v
t | t y r s x u v w
yrstuvwxuuxwvytsrvvuxwrytswwvuxsrytxxwvutsryyyrstuvwxrrstyvwxusstyrwxuvttyrsxuvw
Neutral Element: y
Z_6 x Z_2
x | 0 1 2 3 5 7 8 9 a b 4 6
---------------------------
0 | 0 1 2 3 5 7 8 9 a b 4 6
1 | 1 2 3 4 0 8 9 a b 6 5 7
2 | 2 3 4 5 1 9 a b 6 7 0 8
7 | 7 8 9 a 6 2 3 4 5 0 b 1
8 | 8 9 a b 7 3 4 5 0 1 6 2
9 | 9 a b 6 8 4 5 0 1 2 7 3
a | a b 6 7 9 5 0 1 2 3 8 4
b | b 6 7 8 a 0 1 2 3 4 9 5
3 | 3 4 5 0 2 a b 6 7 8 1 9
4 | 4 5 0 1 3 b 6 7 8 9 2 a
5 | 5 0 1 2 4 6 7 8 9 a 3 b
6 | 6 7 8 9 b 1 2 3 4 5 a 0
01235789ab46001235789ab4611234089ab6572234519ab67087789a623450b1889ab7345016299ab684501273aab6795012384bb678a0123495334502ab67819445013b67892a5501246789a3b66789b12345a0
Neutral Element: 0
A_4
* | i a b c d e f g h j k l
---------------------------
i | i a b c d e f g h j k l
a | a b i e c d g h f l j k
b | b i a d e c h f g k l j
c | c f j i g k a d l b e h
d | d h k b f l i e j a c g
e | e g l a h j b c k i d f
f | f j c k i g d l a h b e
g | g l e j a h c k b f i d
h | h k d l b f e j i g a c
j | j c f g k i l a d e h b
k | k d h f l b j i e c g a
l | l e g h j a k b c d f i
iabcdefghjkliiabcdefghjklaabiecdghfljkbbiadechfgkljccfjigkadlbehddhkbfliejacgeeglahjbckidfffjckigdlahbegglejahckbfidhhkdlbfejigacjjcfgkiladehbkkdhflbjiecgalleghjakbcdfi
Neutral Element: i
Non-Groups
Pętla (brak powiązania grupy lub quasi-grupa z elementem neutralnym)
* | 1 2 3 4 5
-------------
1 | 1 2 3 4 5
2 | 2 4 1 5 3
3 | 3 5 4 2 1
4 | 4 1 5 3 2
5 | 5 3 2 1 4
12345112345224153335421441532553214
Neutral Element: 1
(2*2)*3 = 4*3 = 5 != 2 = 2*1 = 2*(2*3)
Pętla IP (z http://www.quasigroups.eu/contents/download/2008/16_2.pdf )
* | 1 2 3 4 5 6 7
-----------------
1 | 1 2 3 4 5 6 7
2 | 2 3 1 6 7 5 4
3 | 3 1 2 7 6 4 5
4 | 4 7 6 5 1 2 3
5 | 5 6 7 1 4 3 2
6 | 6 4 5 3 2 7 1
7 | 7 5 4 2 3 1 6
123456711234567223167543312764544765123556714326645327177542316
Neutral Element: 1
2*(2*4) = 2*6 = 5 != 7 = 3*4 = (2*2)*4
Monoid (dzięki Quincunx, dzięki!)
Monoidy to magmy o skojarzeniu i neutralnym elemencie.
* | 0 1 2 3
-----------
0 | 0 1 2 3
1 | 1 3 1 3
2 | 2 1 0 3
3 | 3 3 3 3
012300123113132210333333
Neutral Element: 0
Kolejny Monoid
(Mnożenie mod 10, bez 5) Oczywiście nie mamy odwrotności, a asocjatywność daje nam mnożenie modulo 10.
* | 1 2 3 4 6 7 8 9
-------------------
1 | 1 2 3 4 6 7 8 9
2 | 2 4 6 8 2 4 6 8
3 | 3 6 9 2 8 1 4 7
4 | 4 8 2 6 4 8 2 6
6 | 6 2 8 4 6 2 8 4
7 | 7 4 1 8 2 9 6 3
8 | 8 6 4 2 8 6 4 2
9 | 9 8 7 6 4 3 2 1
Neutral Element: 1 12346789112346789224682468336928147448264826662846284774182963886428642998764321
0-9a-z
zasadę: ideone.com/vC0ewt10101010
tą samą kolejnością i neutralna jest w ostatnim rzędzie i kolumnieOdpowiedzi:
Oktawa,
298 290 270265 znaków265: Usunięto niepotrzebny uchwyt funkcji.
270: Po tym wszystkim, że czek
e==h
na e zawsze spełniających E · a = a i h zawsze spełniającą się · h = a nie było to konieczne. Nie jest możliwe, aby się różniły ( e · h =? ).Szczegóły z poniższego wyjaśnienia rozwiązania są nadal aktualne.
290:
Pierwsza linia
c=@sortrows;d=a=c(c(reshape(a=[0 s],b=numel(a)^.5,b)')');
po prostu przechowuje dane wejściowe w tabeli nxn (ze znakiem zerowym w miejscu znaku operacji), a następnie leksykograficznie sortuje kolumny i wiersze, aby wiersze i kolumny otrzymały tę samą kolejność:Teraz zmieniam mapowanie
"a","b","t","z"
na standardowe1, 2, 3, 4
, aby móc skutecznie indeksować tabelę. Odbywa się to przez linięfor i=2:b a(a==a(i))=i-1;end;
. Daje tabelę jak, gdzie możemy pozbyć się pierwszego wiersza i kolumny za pomocą
a=a(2:b,2:b--);u=1:b;
:Ta tabela ma podane właściwości:
isscalar
) wiersz i jedna kolumna mają wartość wektora wierszau=[1 2 3 ... number-of-elements]
:s=@isscalar;e=(s(e=find(all(a==u')))&&s(h=find(all(a'==u')'))&&...
jeśli każdy element a ma element odwrotny a ' , zachowują się dwie rzeczy: element neutralny e występuje tylko raz w każdej kolumnie i tylko raz w każdym wierszu (
sum(t=a==e)==1
) oraz, aby spełnić warunek „· a = a · a" , wystąpienia e są symetryczny w odniesieniu do tłumaczeniat==t'
a · b można odzyskać przez proste
t(a,b)
indeksowanie. Następnie sprawdzamy skojarzenie w nudnej pętli:for x=u for y=u for z=u e*=a(a(x,y),z)==a(x,a(y,z));end;end;end;
Funkcja zwraca element neutralny tak, jak wyglądał w oryginalnej tabeli (
e=d(e+1)
) lub znaku zerowym, jeśli tabela nie opisuje grupy.źródło
a(a==a(i))=i-1
? Poza tym możesz użyć(...)^.5
zamiastsqrt(...)
.Rubin,
401... 272To mój pierwszy program rubinowy! Definiuje to funkcję lambda, którą możemy przetestować wykonując
puts f[gets.chomp]
. Wracamfalse
po moją fałszywą wartość. Pierwsza połowa funkcji po prostu analizuje dane wejściowe na mapie, a następnie druga połowa sprawdza możliwości.źródło
nil
jest krótszą wartością fałszowania niżfalse
. Funkcje można zdefiniować jako lambdasq=->{abort'false'}
(jeśli przyjmują parametry, to[]
zamiast tego używaj ich do wywoływania()
). Uważam, że.chars
powinien już dać ci tablicę, więc nie ma takiej potrzeby.to_a
. Jeśli nie potrzebujesz końca nowej linii,$><<
jeden bajt jest krótszy niżputs
spacja.Hash.new
nie potrzebuje nawiasów. To wszystko, co teraz widzę. Tak trzymaj! ;)chars
Rzeczą jest dziwne. Jakiej wersji Ruby używasz?Math.sqrt(...)
z...**0.5
. Ponadto,a if b
może być zapisane:b&&a
uniknąć dwie przestrzenieJavaScript (ES6) 285
243 278Uruchom snippet, aby przetestować (ponieważ ES6 działa tylko w przeglądarce Firefox)
Edytuj 2 Poprawka błędu. Myliłem się, znajdując element neutralny, sprawdzając tylko jeden sposób. (Potrzebujesz lepszych przypadków testowych !!!)
Edytuj Używając prostszej konkatenacji ciągów zamiast podwójnego indeksu (jak @Quincunx), nie wiem, o czym myślałem. Ponadto, uproszczona kontrola odwrotna, powinna nadal działać.
źródło
Haskell 391B
Przeklnij te
import
!Wyjaśnienie
f::String->String
odwzorowuje ciąg znaków nae::Char
element tożsamości lub!
.where
Klauzula tworzy kilka zmiennych i funkcji, które mam skomentował;v::[Int]
jest pionową listą elementów,h::[Int]
poziomą.%::Char->Char->Char
stosuje operację grupy do swoich argumentów.g::[[Int]]
jest tabelą grupy (do używania dereferencji%
)j::Maybe Int
zawiera indeks tożsamości,v
jeśli istnieje, w przeciwnym razieNothing
jestisJust j
to warunekf
tożsamości.źródło
{- -}
to jest komentarz. Czy masz jakieś bardziej szczegółowe pytania, czy to wyjaśnia?