diff options
Diffstat (limited to '2022/05/common.rs')
| -rw-r--r-- | 2022/05/common.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/2022/05/common.rs b/2022/05/common.rs new file mode 100644 index 0000000..1725f09 --- /dev/null +++ b/2022/05/common.rs | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | pub type Grid = Vec<Vec<char>>; | ||
| 2 | |||
| 3 | fn read_rows() -> Vec<Vec<char>> { | ||
| 4 | let mut rows = Vec::<Vec::<char>>::new(); | ||
| 5 | let mut line = String::new(); | ||
| 6 | loop { | ||
| 7 | let mut row = Vec::<char>::new(); | ||
| 8 | |||
| 9 | std::io::stdin().read_line(&mut line).unwrap(); | ||
| 10 | let line_chars = line.as_bytes(); | ||
| 11 | if line_chars[1] == '1' as u8 { | ||
| 12 | let _ = std::io::stdin().read_line(&mut line); | ||
| 13 | break; | ||
| 14 | } | ||
| 15 | |||
| 16 | let mut i = 0; | ||
| 17 | while i < line_chars.len() { | ||
| 18 | row.push(line_chars[i+1] as char); | ||
| 19 | i += 4; | ||
| 20 | } | ||
| 21 | |||
| 22 | rows.push(row); | ||
| 23 | line.clear(); | ||
| 24 | } | ||
| 25 | |||
| 26 | rows | ||
| 27 | } | ||
| 28 | |||
| 29 | fn rows_to_grid(rows: &Vec<Vec<char>>) -> Grid { | ||
| 30 | let mut grid = vec![Vec::<char>::new(); rows[0].len()]; | ||
| 31 | for row in rows.iter().rev() { | ||
| 32 | for i in 0..row.len() { | ||
| 33 | if row[i] != ' ' { | ||
| 34 | grid[i].push(row[i]); | ||
| 35 | } | ||
| 36 | } | ||
| 37 | } | ||
| 38 | grid | ||
| 39 | } | ||
| 40 | |||
| 41 | fn next_usize(line: &str, s: usize) -> (usize, usize) { | ||
| 42 | let i = line[s..].find(|c: char| c.is_digit(10)).unwrap() + s; | ||
| 43 | let j = line[i..].find(|c: char| c.is_whitespace()).unwrap() + i; | ||
| 44 | (line[i..j].parse::<usize>().unwrap(), j) | ||
| 45 | } | ||
| 46 | |||
| 47 | pub fn read_move(line: &str) -> (usize, usize, usize) { | ||
| 48 | let (n, i) = next_usize(line, 0); | ||
| 49 | let (from, i) = next_usize(line, i); | ||
| 50 | let (to, _) = next_usize(line, i); | ||
| 51 | |||
| 52 | (n, from, to) | ||
| 53 | } | ||
| 54 | |||
| 55 | pub fn get_grid_from_stdin() -> Grid { | ||
| 56 | rows_to_grid(&read_rows()) | ||
| 57 | } | ||
| 58 | |||
| 59 | pub fn apply_moves_from_stdin<F: Fn(&mut Grid, &str) -> ()>(grid: &mut Grid, apply_move: F) { | ||
| 60 | let mut line = String::new(); | ||
| 61 | while std::io::stdin().read_line(&mut line).unwrap() > 0 { | ||
| 62 | apply_move(grid, &line); | ||
| 63 | line.clear(); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | pub fn print_top(grid: &Grid) { | ||
| 68 | for column in grid { | ||
| 69 | let c = match column.last() { Some(d) => d, None => &'_' }; | ||
| 70 | print!("{}", c); | ||
| 71 | } | ||
| 72 | println!(); | ||
| 73 | } | ||
