diff --git a/3484_design_spread_sheet/Cargo.lock b/3484_design_spread_sheet/Cargo.lock new file mode 100644 index 0000000..88b0901 --- /dev/null +++ b/3484_design_spread_sheet/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "design_spread_sheet" +version = "0.1.0" diff --git a/3484_design_spread_sheet/Cargo.toml b/3484_design_spread_sheet/Cargo.toml new file mode 100644 index 0000000..72a1071 --- /dev/null +++ b/3484_design_spread_sheet/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "design_spread_sheet" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/3484_design_spread_sheet/src/lib.rs b/3484_design_spread_sheet/src/lib.rs new file mode 100644 index 0000000..f4702dc --- /dev/null +++ b/3484_design_spread_sheet/src/lib.rs @@ -0,0 +1,41 @@ +pub struct Spreadsheet { + cells: Vec, +} + +impl Spreadsheet { + pub fn new(rows: i32) -> Self { + Self { + cells: vec![0; rows as usize * 26], + } + } + + pub fn set_cell(&mut self, cell: String, value: i32) { + let index = Spreadsheet::count_index(&cell); + self.cells[index] = value; + } + + pub fn reset_cell(&mut self, cell: String) { + self.set_cell(cell, 0); + } + + pub fn get_value(&self, formula: String) -> i32 { + let mut result = 0; + + for cell in formula[1..].split('+') { + if let Ok(val) = cell.parse::() { + result += val + } else { + let index = Spreadsheet::count_index(cell); + result += self.cells[index]; + } + } + + result + } + + fn count_index(cell: &str) -> usize { + let col = (cell[..1].as_bytes()[0] - b'A') as usize; + let row = cell[1..].parse::().unwrap() - 1; + row * 26 + col + } +}