#Python 2, 297 215 bytes
from itertools import*
T=input()
G=T[0]
print sum(all(T[y][x]in g for x,y in product(g,g))*all(any(T[y][x]==G[0]==T[x][y]for y in g)for x in g)*(G[0]in g)for g in chain(*[combinations(G,n)for n in range(len(G)+1)]))
This program works for the example group without ==T[x][y]
, but I'm still pretty sure it's necessary. Negative group elements can be supported at no cost by changing -1
to ''
.
Edit: Now assumes that the identity element of G is always the first.
Ungolfed:
from itertools import*
T=input()
G=T[0]
def f(x,y):return T[y][x] # function
def C(g):return all(f(x,y)in g for x,y in product(g,g)) # closure
def E(g):return[all(f(x,y)==y for y in g)for x in g] # identity
a=E(G)
e=any(a)
e=G[a.index(1)]if e else-1 # e in G
def I(G):return all(any(f(x,y)==e==f(y,x)for y in G)for x in G) # inverse
#print e
#print C(G),any(E(G)),I(G)
#for g in chain(*[combinations(G,n)for n in range(len(G)+1)]): # print all subgroups
# if C(g)and I(g)and e in g:print g
print sum(C(g)*I(g)*(e in g)for g in chain(*[combinations(G,n)for n in range(len(G)+1)]))