-
Notifications
You must be signed in to change notification settings - Fork 2
/
determinant.py
61 lines (44 loc) · 1.24 KB
/
determinant.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'''
author: Jacob Egner
date: 2015-08-02
island: ice base
puzzle URLs:
http://www.checkio.org/mission/determinant/
https://github.com/Bryukh-Checkio-Tasks/checkio-task-determinant
for latest versions of my solutions, see my checkio solution github repo:
https://github.com/jmegner/CheckioPuzzles
Solution Overview:
I use the Laplace expansion to compute determinants.
https://en.wikipedia.org/wiki/Laplace_expansion
'''
def checkio(data):
return determinant(data)
def determinant(data):
if len(data) == 1:
return data[0][0]
terms = [ data[0][c] * cofactor(data, 0, c) for c in range(len(data[0]))]
return sum(terms)
def cofactor(data, r, c):
codata = []
sideLen = len(data)
codata = [
[data[r2][c2] for c2 in range(sideLen) if c2 != c]
for r2 in range(sideLen) if r2 != r
]
return determinant(codata) * (-1) ** (r + c)
if __name__ == '__main__':
assert checkio([
[4, 3],
[6, 3],
]) == -6, 'First example'
assert checkio([
[1, 3, 2],
[1, 1, 4],
[2, 2, 1],
]) == 14, 'Second example'
assert checkio([
[4, 8, 7, 6],
[4, 8, 3, 9],
[0, 5, 3, 4],
[4, 5, 3, 5],
]) == -20, 'Extra 19, I think'