rev |
line source |
Ilia@1
|
1 class Automata(object): |
darkhan@11
|
2 #field[][] - ?????? ?????? ????????? |
Ilia@1
|
3 #states[] |
darkhan@11
|
4 #symbols = {} - ??????: ?????_?_states |
darkhan@11
|
5 |
darkhan@11
|
6 def __init__(self, width, height, states): |
darkhan@11
|
7 self.width = width |
darkhan@11
|
8 self.height = height |
darkhan@11
|
9 self.states = states |
darkhan@11
|
10 self.symbols = {} |
darkhan@11
|
11 for num, st in enumerate(self.states): |
darkhan@11
|
12 self.symbols[st.symbol] = num |
darkhan@11
|
13 self.field = [] |
darkhan@11
|
14 for row in range(height): |
darkhan@11
|
15 self.field.append([]) |
darkhan@11
|
16 for col in range(width): |
darkhan@11
|
17 self.field[row].append(states[0].symbol) |
darkhan@11
|
18 |
darkhan@17
|
19 def next_step(self): |
darkhan@11
|
20 new_state = [] |
darkhan@11
|
21 for row in range(self.height): |
darkhan@11
|
22 new_state.append([]) |
darkhan@11
|
23 for col in range(self.width): |
darkhan@11
|
24 symbol = field[row][col] |
darkhan@11
|
25 num = 0 |
darkhan@11
|
26 for vert_long in range(row + self.height - 1, |
darkhan@11
|
27 row + self.height + 2): |
darkhan@11
|
28 for horiz_long in range(col + self.width - 1, |
darkhan@11
|
29 col + self.width + 2): |
darkhan@11
|
30 vert = vert_long % self.height |
darkhan@11
|
31 horiz = horiz_long % self.width |
darkhan@11
|
32 if (vert == row) & (horiz = col): continue |
darkhan@11
|
33 if self.field[vert][horiz] == symbol: |
darkhan@11
|
34 num += 1 |
darkhan@11
|
35 new_state[row].append( |
darkhan@11
|
36 self.states[self.symbols[symbol]].next_state(num)) |
darkhan@11
|
37 |
darkhan@11
|
38 for row in range(self.height): |
darkhan@11
|
39 for col in range(self.width): |
darkhan@11
|
40 if new_state[row][col]: |
darkhan@11
|
41 self.field[row][col] = self.states[(self.symbols[symbol] |
darkhan@11
|
42 + 1) % len(states)].symbol |
darkhan@11
|
43 |
darkhan@17
|
44 def change_size(self, value, side): |
darkhan@17
|
45 "0-up, 1-right, 2-down, 3-left" |
darkhan@17
|
46 new_field = [] |
darkhan@17
|
47 if side == 0: |
darkhan@17
|
48 self.height += value |
darkhan@17
|
49 for row in range(value): |
darkhan@17
|
50 new_field.append([]) |
darkhan@17
|
51 for col in range(self.width): |
darkhan@17
|
52 new_field[row].append(states[0].symbol) |
darkhan@17
|
53 for row in range(value, self.height): |
darkhan@17
|
54 if row < 0: continue |
darkhan@17
|
55 new_field.append([]) |
darkhan@17
|
56 for col in range(self.width): |
darkhan@17
|
57 new_field[row].append(self.field[row - value][col]) |
darkhan@17
|
58 if side == 2: |
darkhan@17
|
59 self.height += value |
darkhan@17
|
60 for row in range(0, self.height): |
darkhan@17
|
61 if row > self.height + value - 1: continue |
darkhan@17
|
62 new_field.append([]) |
darkhan@17
|
63 for col in range(self.width): |
darkhan@17
|
64 new_field[row].append(self.field[row][col]) |
darkhan@17
|
65 for row in range(self.height, self.height + value): |
darkhan@17
|
66 new_field.append([]) |
darkhan@17
|
67 for col in range(self.width): |
darkhan@17
|
68 new_field[row].append(states[0].symbol) |