diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2025-07-01 14:35:03 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2025-07-01 14:35:03 +0200 |
| commit | 7e4982be44b980ccbe00c88a66abd773dba62f1a (patch) | |
| tree | cfdcd6b6fe3352f89003560b0be70236f93188b0 /2022/13 | |
| parent | b5d2f5d1958923f9645b242037d9b3c6682e0430 (diff) | |
| download | aoc-7e4982be44b980ccbe00c88a66abd773dba62f1a.tar.gz aoc-7e4982be44b980ccbe00c88a66abd773dba62f1a.zip | |
Day 13 2022
Diffstat (limited to '2022/13')
| -rw-r--r-- | 2022/13/a.rs | 21 | ||||
| -rw-r--r-- | 2022/13/b.rs | 26 | ||||
| -rw-r--r-- | 2022/13/common.rs | 75 |
3 files changed, 122 insertions, 0 deletions
diff --git a/2022/13/a.rs b/2022/13/a.rs new file mode 100644 index 0000000..c849bef --- /dev/null +++ b/2022/13/a.rs | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | use std::cmp::Ordering; | ||
| 2 | mod common; | ||
| 3 | use common::*; | ||
| 4 | |||
| 5 | fn main() { | ||
| 6 | let mut line = String::new(); | ||
| 7 | let mut sum = 0; | ||
| 8 | let mut i = 0; | ||
| 9 | loop { | ||
| 10 | i += 1; | ||
| 11 | let _ = std::io::stdin().read_line(&mut line).unwrap(); | ||
| 12 | let p = parse(line.as_bytes()); | ||
| 13 | line.clear(); | ||
| 14 | let _ = std::io::stdin().read_line(&mut line).unwrap(); | ||
| 15 | let q = parse(line.as_bytes()); | ||
| 16 | if compare(&p, &q) != Ordering::Greater { sum += i; } | ||
| 17 | if std::io::stdin().read_line(&mut line).unwrap() == 0 { break; } | ||
| 18 | line.clear(); | ||
| 19 | } | ||
| 20 | println!("{sum}"); | ||
| 21 | } | ||
diff --git a/2022/13/b.rs b/2022/13/b.rs new file mode 100644 index 0000000..baaad3f --- /dev/null +++ b/2022/13/b.rs | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | use std::cmp::Ordering; | ||
| 2 | mod common; | ||
| 3 | use common::*; | ||
| 4 | |||
| 5 | fn driver(n: i64) -> Packet { | ||
| 6 | Packet::List(vec![Packet::List(vec![Packet::Number(n)])]) | ||
| 7 | } | ||
| 8 | |||
| 9 | fn find_driver(v: &Vec<Packet>, n: i64) -> usize { | ||
| 10 | v.iter() | ||
| 11 | .position(|p| compare(p, &driver(n)) == Ordering::Equal) | ||
| 12 | .unwrap() + 1 | ||
| 13 | } | ||
| 14 | |||
| 15 | fn main() { | ||
| 16 | let mut v = vec![driver(2), driver(6)]; | ||
| 17 | let mut line = String::new(); | ||
| 18 | while std::io::stdin().read_line(&mut line).unwrap() > 0 { | ||
| 19 | if line.len() > 1 { v.push(parse(line.as_bytes())); } | ||
| 20 | line.clear(); | ||
| 21 | } | ||
| 22 | |||
| 23 | v.sort_by(compare); | ||
| 24 | |||
| 25 | println!("{}", find_driver(&v, 2) * find_driver(&v, 6)); | ||
| 26 | } | ||
diff --git a/2022/13/common.rs b/2022/13/common.rs new file mode 100644 index 0000000..f49f3bc --- /dev/null +++ b/2022/13/common.rs | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | use std::cmp::Ordering; | ||
| 2 | |||
| 3 | #[derive(Debug)] | ||
| 4 | pub enum Packet { | ||
| 5 | Number(i64), | ||
| 6 | List(Vec<Packet>) | ||
| 7 | } | ||
| 8 | |||
| 9 | fn compare_lists(l: &Vec<Packet>, k: &Vec<Packet>) -> Ordering { | ||
| 10 | for i in 0..std::cmp::min(l.len(), k.len()) { | ||
| 11 | let ord = compare(&l[i], &k[i]); | ||
| 12 | if ord != Ordering::Equal { return ord; } | ||
| 13 | } | ||
| 14 | l.len().cmp(&k.len()) | ||
| 15 | } | ||
| 16 | |||
| 17 | fn compare_list_single(l: &Vec<Packet>, p: &Packet) -> Ordering { | ||
| 18 | if l.len() == 0 { return Ordering::Less; } | ||
| 19 | let ord = compare(&l[0], p); | ||
| 20 | if ord != Ordering::Equal { return ord; } | ||
| 21 | l.len().cmp(&1) | ||
| 22 | } | ||
| 23 | |||
| 24 | pub fn compare(p: &Packet, q: &Packet) -> Ordering { | ||
| 25 | match p { | ||
| 26 | Packet::Number(n) => { | ||
| 27 | match q { | ||
| 28 | Packet::Number(m) => n.cmp(&m), | ||
| 29 | Packet::List(k) => compare_list_single(k, p).reverse() | ||
| 30 | } | ||
| 31 | }, | ||
| 32 | Packet::List(l) => { | ||
| 33 | match q { | ||
| 34 | Packet::Number(_) => compare_list_single(l, q), | ||
| 35 | Packet::List(k) => compare_lists(l, k) | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | fn parse_int(line: &[u8], i: &mut usize) -> i64 { | ||
| 42 | let mut r: i64 = 0; | ||
| 43 | loop { | ||
| 44 | match line[*i] { | ||
| 45 | b'0'..=b'9' => r = r * 10 + (line[*i] as i64) - ('0' as i64), | ||
| 46 | b',' | b']' => return r, | ||
| 47 | x => panic!("Error: unexpected '{}' at position {} in parse_int", | ||
| 48 | x as char, *i) | ||
| 49 | } | ||
| 50 | *i += 1; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | fn parse_list(line: &[u8], i: &mut usize) -> Packet { | ||
| 55 | if line[*i] != b'[' { | ||
| 56 | panic!("Error: sub-list at {} does not start with '['", *i); | ||
| 57 | } | ||
| 58 | *i += 1; | ||
| 59 | let mut v = Vec::<Packet>::new(); | ||
| 60 | while *i < line.len() && line[*i] != b'\n' { | ||
| 61 | match line[*i] { | ||
| 62 | b']' => { *i += 1; return Packet::List(v); }, | ||
| 63 | b'[' => v.push(parse_list(line, i)), | ||
| 64 | b'0'..=b'9' => v.push(Packet::Number(parse_int(line, i))), | ||
| 65 | b' ' | b',' => *i += 1, | ||
| 66 | x => panic!("Error: unexpected '{}' at position {}", x as char, *i) | ||
| 67 | } | ||
| 68 | } | ||
| 69 | panic!("Error: finished parsing at {}, but ']' not found", *i); | ||
| 70 | } | ||
| 71 | |||
| 72 | pub fn parse(line: &[u8]) -> Packet { | ||
| 73 | let mut i = 0; | ||
| 74 | parse_list(line, &mut i) | ||
| 75 | } | ||
