From dd0ed4cfff1a4af2a518aab399e32174175ed0d8 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Sun, 22 Dec 2019 06:21:32 +0100 Subject: Arrange project structure --- src/structs.rs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/structs.rs (limited to 'src/structs.rs') diff --git a/src/structs.rs b/src/structs.rs new file mode 100644 index 0000000..571c79d --- /dev/null +++ b/src/structs.rs @@ -0,0 +1,98 @@ +pub struct StoneWall { + rows: Vec>, +} + +impl StoneWall { + pub fn create_empty(n: u32) -> Self { + let n = n as usize; + let h = n / 2 + 1; + let mut rows = vec![vec![0; n]; h]; + rows.get_mut(0).map(|r| r[0] = 1); + rows.get_mut(1).map(|r| r[1] = 2); + Self { + rows, + } + } +} + +pub struct GapHeights { + heights: Vec, +} + +impl GapHeights { + pub fn from_heights(heights: Vec) -> Self { + Self { heights } + } + + #[allow(dead_code)] + fn create_empty(w: u32) -> Self { + let heights = if w == 0 { + vec![] + } else if w == 1 { + vec![0] + } else { + let mut v = Vec::with_capacity(w as usize); + v.push(0); + v.push(1); + v + }; + Self { heights } + } + + pub fn add_gap(&mut self, height: u32) { + self.add_gap(height) + } + + pub fn calculate_row(&self, r: u32, stones: &mut [u32]) { + let mut len = 1; + let mut i = 0; + for &height in self.heights.iter().chain([r].iter()) { + if height == r { + stones[i] = len; + i += 1; + len = 0; + } + len += 1; + } + } + + pub fn output(&self, n: u32, h: u32) { + let mut stones = vec![0; n as usize]; + let mut toggle = 0; + let colors = [ + "\x1b[31m", "\x1b[32m", "\x1b[33m", "\x1b[34m", "\x1b[35m", "\x1b[36m", + ]; + for row in 0..h { + self.calculate_row(row, &mut stones); + for &len in stones.iter() { + print!("{}", colors[toggle]); + toggle = (toggle + 1) % colors.len(); + for _ in 0..len { + print!("◙"); + } + } + println!("\x1b[m"); + } + } + + pub fn iter<'a>(&'a self) -> GapIter<'a> { + GapIter { + gap_heights: self, + i: 0, + } + } +} + +pub struct GapIter<'a> { + gap_heights: &'a GapHeights, + i: usize, +} + +impl<'a> Iterator for GapIter<'a> { + type Item = u32; + fn next(&mut self) -> Option { + let i = self.i; + self.i += 1; + self.gap_heights.heights.get(i).map(|&x| x) + } +} -- cgit v1.2.3-54-g00ecf From db532edb6b63912f6cce0c5b6445b37686473069 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Sun, 22 Dec 2019 06:55:48 +0100 Subject: Create stone wall structure --- src/structs.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/structs.rs') diff --git a/src/structs.rs b/src/structs.rs index 571c79d..fdc20f4 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -13,6 +13,27 @@ impl StoneWall { rows, } } + + pub fn set_stone(&mut self, row: u32, pos: u32, stone: u32) -> Option<()> { + self.rows.get_mut(row as usize).and_then(|v| v.get_mut(pos as usize)) + .map(|v| *v = stone) + } + + pub fn output(&self) { + let colors = [ + [31, 32], + [33, 35], + ]; + for (i, row) in self.rows.iter().enumerate() { + for (j, &stone) in row.iter().enumerate() { + print!("{}", colors[i & 1][j & 1]); + print!("\x1b[{}m{}", + colors[i & 1][j & 1], + "◙".repeat(stone as usize)); + } + println!("\x1b[m"); + } + } } pub struct GapHeights { @@ -81,6 +102,19 @@ impl GapHeights { i: 0, } } + + pub fn as_stone_wall(&self, n: u32) -> StoneWall { + let h = n/2 + 1; + let mut rows = Vec::with_capacity(h as usize); + for i in 0..h { + let mut row = vec![0; n as usize]; + self.calculate_row(i, &mut row); + rows.push(row); + } + StoneWall { + rows + } + } } pub struct GapIter<'a> { -- cgit v1.2.3-54-g00ecf