Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. use std::error::Error;
  2. use std::fmt;
  3.  
  4. fn main() {
  5. let grid = Grid::new(10);
  6. println!("{:?}", grid);
  7. }
  8. type Point = (usize, usize);
  9.  
  10. #[derive(Debug)]
  11. pub struct Grid {
  12. pub state: Vec<Vec<bool>>,
  13. pub size: usize,
  14. }
  15.  
  16. impl Grid {
  17. pub fn new(size: usize) -> Self {
  18. let mut state = Vec::new();
  19. for _ in 0..size {
  20. let mut temp = vec![];
  21. for _ in 0..size {
  22. temp.push(false);
  23. }
  24. state.push(temp);
  25. }
  26. Self { state, size }
  27. }
  28. pub fn is_cell_living(&self, cell: Point) -> Option<bool> {
  29. if let Some(status) = self.state.get(cell.1)?.get(cell.0) {
  30. Some(*status)
  31. } else {
  32. None
  33. }
  34. }
  35. pub fn set_cell_living(&mut self, cell: Point) -> Option<()> {
  36. *self.state.get_mut(cell.1)?.get_mut(cell.0)? = true;
  37. Some(())
  38. }
  39. pub fn set_cell_dead(&mut self, cell: Point) -> Option<()> {
  40. *self.state.get_mut(cell.1)?.get_mut(cell.0)? = false;
  41. Some(())
  42. }
  43. pub fn toggle_cell(&mut self, cell: Point) -> Option<()> {
  44. *self.state.get_mut(cell.1)?.get_mut(cell.0)? = !*self.state.get(cell.1)?.get(cell.0)?;
  45. Some(())
  46. }
  47. pub fn evaluate_cell(&mut self, cell: Point) -> Option<()> {
  48. let count = self.count_neighbors(cell)?;
  49. let status = self.is_cell_living(cell)?;
  50. match (count, status) {
  51. (0..=1, true) => self.toggle_cell(cell),
  52. (2..=3, true) => self.toggle_cell(cell),
  53. (_, true) => self.toggle_cell(cell),
  54. (3, false) => self.toggle_cell(cell),
  55. _ => None,
  56. };
  57. Some(())
  58. }
  59. pub fn count_neighbors(&self, cell: Point) -> Option<usize> {
  60. let mut sum: usize = 0;
  61. for x in (cell.0 - 1)..=(cell.0 + 1) {
  62. for y in (cell.1 - 1)..=(cell.1 + 1) {
  63. if (x, y) != cell {
  64. if let Some(status) = self.is_cell_living((x, y)) {
  65. if status { sum += 1; }
  66. };
  67. }
  68. }
  69. }
  70. Some(sum)
  71. }
  72. fn check_valid_coords(&self, cell: Point) -> bool {
  73. if let Some(vec) = self.state.get(cell.0) {
  74. if let Some(_) = vec.get(cell.1) {
  75. true
  76. } else {
  77. false
  78. }
  79. } else {
  80. false
  81. }
  82. }
  83. }
  84.  
  85. #[cfg(test)]
  86. mod tests {
  87. use super::*;
  88. #[test]
  89. fn test_build_empty() {
  90. let grid = Grid::new(10);
  91. let empty: bool = grid.state.iter().all(|v| v.iter().all(|c| *c == false));
  92. assert!(empty);
  93. }
  94. #[test]
  95. fn test_toggle() {
  96. let mut grid = Grid::new(10);
  97. let origin = (0, 0);
  98. assert!(!grid.is_cell_living(origin).unwrap());
  99. grid.toggle_cell(origin).unwrap();
  100. assert!(grid.is_cell_living(origin).unwrap());
  101. }
  102. #[test]
  103. fn test_set_living_slash_dead() {
  104. let mut grid = Grid::new(10);
  105. let point = (5, 5);
  106. grid.set_cell_living(point).unwrap();
  107. assert!(grid.is_cell_living(point).unwrap());
  108. grid.set_cell_dead(point).unwrap();
  109. assert!(!grid.is_cell_living(point).unwrap());
  110. }
  111. #[test]
  112. fn test_count_neighbors() {
  113. let mut grid = Grid::new(5);
  114. grid.set_cell_living((3, 3)).unwrap();
  115. grid.set_cell_living((3, 4)).unwrap();
  116. grid.set_cell_living((3, 2)).unwrap();
  117. assert_eq!(grid.count_neighbors((4, 3)).unwrap(), 3);
  118. }
  119. #[test]
  120. fn test_evaluate_cell() {
  121. let mut grid = Grid::new(10);
  122. grid.set_cell_living((1,2)).unwrap();
  123. grid.set_cell_living((0,2)).unwrap();
  124. grid.set_cell_living((0,3)).unwrap();
  125. grid.evaluate_cell((1,2)).unwrap();
  126. assert!(grid.is_cell_living((1,2)).unwrap());
  127. grid.evaluate_cell((1,3)).unwrap();
  128. assert!(grid.is_cell_living((1,3)).unwrap());
  129. grid.evaluate_cell((5,5)).unwrap();
  130. assert!(!grid.is_cell_living((5,5)).unwrap());
  131. }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement