aboutsummaryrefslogtreecommitdiff
path: root/2022/05/common.rs
diff options
context:
space:
mode:
Diffstat (limited to '2022/05/common.rs')
-rw-r--r--2022/05/common.rs73
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 @@
1pub type Grid = Vec<Vec<char>>;
2
3fn 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
29fn 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
41fn 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
47pub 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
55pub fn get_grid_from_stdin() -> Grid {
56 rows_to_grid(&read_rows())
57}
58
59pub 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
67pub 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}

Generated with cgit - Back to sebastiano.tronto.net