Skip to content

Commit 842dd5d

Browse files
committed
Day 5 Rust solutions
1 parent f34e83a commit 842dd5d

File tree

3 files changed

+231
-0
lines changed

3 files changed

+231
-0
lines changed

day-05/Cargo.toml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "day-05"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
8+
[[bin]]
9+
name = "05-1"
10+
path = "src/05-1.rs"
11+
12+
[[bin]]
13+
name = "05-2"
14+
path = "src/05-2.rs"

day-05/src/05-1.rs

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
use std::fs;
2+
3+
#[derive(Debug)]
4+
struct Rule {
5+
from: i32,
6+
to: i32,
7+
}
8+
9+
impl Rule {
10+
fn new(data: &str) -> Rule {
11+
let terms: Vec<i32> = data.split('|').map(|x| x.parse().unwrap()).collect();
12+
13+
Rule {
14+
from: terms[0],
15+
to: terms[1],
16+
}
17+
}
18+
}
19+
20+
#[derive(Debug)]
21+
struct Update {
22+
pages: Vec<i32>,
23+
}
24+
25+
impl Update {
26+
fn new(data: &str) -> Update {
27+
let pages: Vec<i32> = data.split(',').map(|x| x.parse().unwrap()).collect();
28+
29+
Update {
30+
pages,
31+
}
32+
}
33+
34+
fn satisfies(&self, rule: &Rule) -> bool {
35+
let first = match self.pages.iter().position(|p| p == &rule.from) {
36+
None => { return true }
37+
Some(x) => x
38+
};
39+
40+
let last = match self.pages.iter().position(|p| p == &rule.to) {
41+
None => { return true }
42+
Some(x) => x
43+
};
44+
45+
first < last
46+
}
47+
48+
fn score(&self) -> i32 {
49+
self.pages[self.pages.len() / 2]
50+
}
51+
}
52+
53+
#[derive(Debug)]
54+
struct Puzzle {
55+
rules: Vec<Rule>,
56+
updates: Vec<Update>,
57+
}
58+
59+
impl Puzzle {
60+
fn new(data: &str) -> Puzzle {
61+
let (rules, updates): (Vec<_>, Vec<_>) =
62+
data
63+
.lines()
64+
.filter(|l| !l.is_empty())
65+
.partition(|l| l.contains('|'));
66+
67+
let rules = rules.iter().map(|r| Rule::new(r)).collect();
68+
let updates = updates.iter().map(|u| Update::new(u)).collect();
69+
70+
Puzzle {
71+
rules,
72+
updates,
73+
}
74+
}
75+
76+
fn score(&self) -> i32 {
77+
self.updates
78+
.iter()
79+
.map(|u| {
80+
match self.rules.iter().all(|r| u.satisfies(r)) {
81+
true => u.score(),
82+
false => 0,
83+
}
84+
})
85+
.sum()
86+
}
87+
}
88+
89+
fn main() {
90+
let input = fs::read_to_string("../05.input").unwrap();
91+
92+
let p = Puzzle::new(&input);
93+
94+
println!("{}", p.score());
95+
}

day-05/src/05-2.rs

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
use std::cmp::Ordering;
2+
use std::fs;
3+
4+
#[derive(Debug)]
5+
struct Rule {
6+
from: i32,
7+
to: i32,
8+
}
9+
10+
impl Rule {
11+
fn new(data: &str) -> Rule {
12+
let terms: Vec<i32> = data.split('|').map(|x| x.parse().unwrap()).collect();
13+
14+
Rule {
15+
from: terms[0],
16+
to: terms[1],
17+
}
18+
}
19+
}
20+
21+
impl Clone for Rule {
22+
fn clone(&self) -> Rule {
23+
Rule {
24+
from: self.from,
25+
to: self.to,
26+
}
27+
}
28+
}
29+
30+
#[derive(Debug)]
31+
struct Update {
32+
pages: Vec<i32>,
33+
rules: Vec<Rule>,
34+
}
35+
36+
impl Update {
37+
fn new(data: &str, rules: &Vec<Rule>) -> Update {
38+
let pages: Vec<i32> = data.split(',').map(|x| x.parse().unwrap()).collect();
39+
40+
Update {
41+
pages,
42+
rules: rules.to_vec(),
43+
}
44+
}
45+
46+
fn satisfies(&self, rule: &Rule) -> bool {
47+
let first = match self.pages.iter().position(|p| p == &rule.from) {
48+
None => { return true }
49+
Some(x) => x
50+
};
51+
52+
let last = match self.pages.iter().position(|p| p == &rule.to) {
53+
None => { return true }
54+
Some(x) => x
55+
};
56+
57+
first < last
58+
}
59+
60+
fn sort(&mut self) {
61+
self.pages.sort_by(|a, b| {
62+
if self.rules.iter().any(|r| r.from == *a && r.to == *b) {
63+
Ordering::Less
64+
} else if self.rules.iter().any(|r| r.from == *b && r.to == *b) {
65+
Ordering::Greater
66+
} else {
67+
Ordering::Equal
68+
}
69+
});
70+
}
71+
72+
fn score(&self) -> i32 {
73+
self.pages[self.pages.len() / 2]
74+
}
75+
}
76+
77+
#[derive(Debug)]
78+
struct Puzzle {
79+
rules: Vec<Rule>,
80+
updates: Vec<Update>,
81+
}
82+
83+
impl Puzzle {
84+
fn new(data: &str) -> Puzzle {
85+
let (rules, updates): (Vec<_>, Vec<_>) =
86+
data
87+
.lines()
88+
.filter(|l| !l.is_empty())
89+
.partition(|l| l.contains('|'));
90+
91+
let rules = rules.iter().map(|r| Rule::new(r)).collect();
92+
let updates = updates.iter().map(|u| Update::new(u, &rules)).collect();
93+
94+
Puzzle {
95+
rules,
96+
updates,
97+
}
98+
}
99+
100+
fn score(&mut self) -> i32 {
101+
self.updates
102+
.iter_mut()
103+
.map(|u| {
104+
match self.rules.iter().all(|r| u.satisfies(r)) {
105+
true => 0,
106+
false => {
107+
u.sort();
108+
u.score()
109+
}
110+
}
111+
})
112+
.sum()
113+
}
114+
}
115+
116+
fn main() {
117+
let input = fs::read_to_string("../05.input").unwrap();
118+
119+
let mut p = Puzzle::new(&input);
120+
121+
println!("{}", p.score());
122+
}

0 commit comments

Comments
 (0)