From 7e4982be44b980ccbe00c88a66abd773dba62f1a Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Tue, 1 Jul 2025 14:35:03 +0200 Subject: Day 13 2022 --- 2022/13/a.rs | 21 ++++++++++++++++ 2022/13/b.rs | 26 +++++++++++++++++++ 2022/13/common.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 2022/13/a.rs create mode 100644 2022/13/b.rs create mode 100644 2022/13/common.rs (limited to '2022/13') 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 @@ +use std::cmp::Ordering; +mod common; +use common::*; + +fn main() { + let mut line = String::new(); + let mut sum = 0; + let mut i = 0; + loop { + i += 1; + let _ = std::io::stdin().read_line(&mut line).unwrap(); + let p = parse(line.as_bytes()); + line.clear(); + let _ = std::io::stdin().read_line(&mut line).unwrap(); + let q = parse(line.as_bytes()); + if compare(&p, &q) != Ordering::Greater { sum += i; } + if std::io::stdin().read_line(&mut line).unwrap() == 0 { break; } + line.clear(); + } + println!("{sum}"); +} 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 @@ +use std::cmp::Ordering; +mod common; +use common::*; + +fn driver(n: i64) -> Packet { + Packet::List(vec![Packet::List(vec![Packet::Number(n)])]) +} + +fn find_driver(v: &Vec, n: i64) -> usize { + v.iter() + .position(|p| compare(p, &driver(n)) == Ordering::Equal) + .unwrap() + 1 +} + +fn main() { + let mut v = vec![driver(2), driver(6)]; + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + if line.len() > 1 { v.push(parse(line.as_bytes())); } + line.clear(); + } + + v.sort_by(compare); + + println!("{}", find_driver(&v, 2) * find_driver(&v, 6)); +} 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 @@ +use std::cmp::Ordering; + +#[derive(Debug)] +pub enum Packet { + Number(i64), + List(Vec) +} + +fn compare_lists(l: &Vec, k: &Vec) -> Ordering { + for i in 0..std::cmp::min(l.len(), k.len()) { + let ord = compare(&l[i], &k[i]); + if ord != Ordering::Equal { return ord; } + } + l.len().cmp(&k.len()) +} + +fn compare_list_single(l: &Vec, p: &Packet) -> Ordering { + if l.len() == 0 { return Ordering::Less; } + let ord = compare(&l[0], p); + if ord != Ordering::Equal { return ord; } + l.len().cmp(&1) +} + +pub fn compare(p: &Packet, q: &Packet) -> Ordering { + match p { + Packet::Number(n) => { + match q { + Packet::Number(m) => n.cmp(&m), + Packet::List(k) => compare_list_single(k, p).reverse() + } + }, + Packet::List(l) => { + match q { + Packet::Number(_) => compare_list_single(l, q), + Packet::List(k) => compare_lists(l, k) + } + } + } +} + +fn parse_int(line: &[u8], i: &mut usize) -> i64 { + let mut r: i64 = 0; + loop { + match line[*i] { + b'0'..=b'9' => r = r * 10 + (line[*i] as i64) - ('0' as i64), + b',' | b']' => return r, + x => panic!("Error: unexpected '{}' at position {} in parse_int", + x as char, *i) + } + *i += 1; + } +} + +fn parse_list(line: &[u8], i: &mut usize) -> Packet { + if line[*i] != b'[' { + panic!("Error: sub-list at {} does not start with '['", *i); + } + *i += 1; + let mut v = Vec::::new(); + while *i < line.len() && line[*i] != b'\n' { + match line[*i] { + b']' => { *i += 1; return Packet::List(v); }, + b'[' => v.push(parse_list(line, i)), + b'0'..=b'9' => v.push(Packet::Number(parse_int(line, i))), + b' ' | b',' => *i += 1, + x => panic!("Error: unexpected '{}' at position {}", x as char, *i) + } + } + panic!("Error: finished parsing at {}, but ']' not found", *i); +} + +pub fn parse(line: &[u8]) -> Packet { + let mut i = 0; + parse_list(line, &mut i) +} -- cgit v1.3