aboutsummaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-07-01 14:35:03 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-07-01 14:35:03 +0200
commit7e4982be44b980ccbe00c88a66abd773dba62f1a (patch)
treecfdcd6b6fe3352f89003560b0be70236f93188b0 /2022
parentb5d2f5d1958923f9645b242037d9b3c6682e0430 (diff)
downloadaoc-7e4982be44b980ccbe00c88a66abd773dba62f1a.tar.gz
aoc-7e4982be44b980ccbe00c88a66abd773dba62f1a.zip
Day 13 2022
Diffstat (limited to '2022')
-rw-r--r--2022/13/a.rs21
-rw-r--r--2022/13/b.rs26
-rw-r--r--2022/13/common.rs75
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 @@
1use std::cmp::Ordering;
2mod common;
3use common::*;
4
5fn 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 @@
1use std::cmp::Ordering;
2mod common;
3use common::*;
4
5fn driver(n: i64) -> Packet {
6 Packet::List(vec![Packet::List(vec![Packet::Number(n)])])
7}
8
9fn 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
15fn 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 @@
1use std::cmp::Ordering;
2
3#[derive(Debug)]
4pub enum Packet {
5 Number(i64),
6 List(Vec<Packet>)
7}
8
9fn 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
17fn 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
24pub 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
41fn 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
54fn 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
72pub fn parse(line: &[u8]) -> Packet {
73 let mut i = 0;
74 parse_list(line, &mut i)
75}

Generated with cgit - Back to sebastiano.tronto.net