Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. class CellularAutomaton:
  2.  
  3. def __init__(self, size, rule, number_of_ones=1):
  4. self.size = size
  5. self.previous_state = []
  6. self.number_of_ones = number_of_ones
  7. self.current_state = self.set_initial_state()
  8. self.rule = rule
  9. self.binary_rule = self.set_binary_rule()
  10.  
  11. def calculate_next(self):
  12. self.previous_state = self.current_state
  13. self.current_state = []
  14. for cell_index in range(0, self.size):
  15. self._set_cell(cell_index)
  16.  
  17. def apply_rule(self, cell_index):
  18. previous_triplet = self.get_previous_triplet(cell_index)
  19. rule_index = self.convert_from_binary_array_to_int(previous_triplet)
  20. return self.binary_rule[rule_index]
  21.  
  22. def get_previous_triplet(self, index):
  23. return [
  24. self.previous_state[(index - 1)],
  25. self.previous_state[index],
  26. self.previous_state[(index + 1) % self.size]
  27. ]
  28.  
  29. @staticmethod
  30. def convert_from_binary_array_to_int(binary_array):
  31. return int(''.join(str(e) for e in binary_array), 2)
  32.  
  33. def set_binary_rule(self):
  34. return list(reversed(self.binary_array_from_int(self.rule)))
  35.  
  36. def binary_array_from_int(self, integer):
  37. return [int(x) for x in list(self.binary8b_string_from_int(integer))]
  38.  
  39. @staticmethod
  40. def binary8b_string_from_int(integer):
  41. return '{0:08b}'.format(integer)
  42.  
  43. def _set_cell(self, cell_index):
  44. self.current_state.append(self.apply_rule(cell_index))
  45.  
  46. def set_initial_state(self):
  47. if self.number_of_ones > int(self.size / 2):
  48. self.number_of_ones = int(self.size / 2)
  49. return [0] * int(self.size / 2) + [1] * self.number_of_ones + [0] * (int(self.size / 2) - self.number_of_ones)
  50.  
  51. def print_rows(self, rows):
  52. print(self.current_state)
  53. for i in range(0, rows):
  54. self.calculate_next()
  55. print(self.current_state)
  56. self.current_state = self.set_initial_state()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement