diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2025-06-26 09:47:23 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2025-06-26 23:37:23 +0200 |
| commit | fa26f694d8cf98272763952a698301ee9935c19e (patch) | |
| tree | 5af7a788fb8e9fa12b2b2fbea64250ed496a23c0 /2022/05 | |
| parent | f0159b7d36e2c81182f2d047a34bf883394894db (diff) | |
| download | aoc-fa26f694d8cf98272763952a698301ee9935c19e.tar.gz aoc-fa26f694d8cf98272763952a698301ee9935c19e.zip | |
Added 2022, first few problems
Diffstat (limited to '2022/05')
| -rw-r--r-- | 2022/05/a.rs | 17 | ||||
| -rw-r--r-- | 2022/05/b.rs | 20 | ||||
| -rw-r--r-- | 2022/05/common.rs | 73 |
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 @@ | |||
| 1 | mod common; | ||
| 2 | use common::*; | ||
| 3 | |||
| 4 | fn 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 | |||
| 13 | fn 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 @@ | |||
| 1 | mod common; | ||
| 2 | use common::*; | ||
| 3 | |||
| 4 | fn 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 | |||
| 16 | fn 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 @@ | |||
| 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 | } | ||
