aboutsummaryrefslogtreecommitdiff
path: root/2022/05
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-06-26 09:47:23 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-06-26 23:37:23 +0200
commitfa26f694d8cf98272763952a698301ee9935c19e (patch)
tree5af7a788fb8e9fa12b2b2fbea64250ed496a23c0 /2022/05
parentf0159b7d36e2c81182f2d047a34bf883394894db (diff)
downloadaoc-fa26f694d8cf98272763952a698301ee9935c19e.tar.gz
aoc-fa26f694d8cf98272763952a698301ee9935c19e.zip
Added 2022, first few problems
Diffstat (limited to '2022/05')
-rw-r--r--2022/05/a.rs17
-rw-r--r--2022/05/b.rs20
-rw-r--r--2022/05/common.rs73
3 files changed, 110 insertions, 0 deletions
diff --git a/2022/05/a.rs b/2022/05/a.rs
new file mode 100644
index 0000000..ae0e937
--- /dev/null
+++ b/2022/05/a.rs
@@ -0,0 +1,17 @@
1mod common;
2use common::*;
3
4fn apply_move(grid: &mut Vec::<Vec::<char>>, line: &str) {
5 let (n, from, to) = read_move(&line);
6
7 for _ in 0..n {
8 let x = grid[from-1].pop().unwrap();
9 grid[to-1].push(x);
10 }
11}
12
13fn main() {
14 let mut grid = get_grid_from_stdin();
15 apply_moves_from_stdin(&mut grid, apply_move);
16 print_top(&grid);
17}
diff --git a/2022/05/b.rs b/2022/05/b.rs
new file mode 100644
index 0000000..824ee5e
--- /dev/null
+++ b/2022/05/b.rs
@@ -0,0 +1,20 @@
1mod common;
2use common::*;
3
4fn apply_move(grid: &mut Vec::<Vec::<char>>, line: &str) {
5 let (n, from, to) = read_move(&line);
6
7 let first_moved = grid[from-1].len()-n;
8 let len = grid[from-1].len();
9 for i in first_moved..len {
10 let x = grid[from-1][i];
11 grid[to-1].push(x);
12 }
13 grid[from-1].drain(first_moved..len);
14}
15
16fn main() {
17 let mut grid = get_grid_from_stdin();
18 apply_moves_from_stdin(&mut grid, apply_move);
19 print_top(&grid);
20}
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