Skip to content

Commit 354ce65

Browse files
committed
2018 05 (rs)
1 parent e67b58b commit 354ce65

File tree

4 files changed

+139
-0
lines changed

4 files changed

+139
-0
lines changed

2018/Cargo.lock

+51
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2018/day-05/Cargo.toml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "day-05"
3+
version = "0.0.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
itertools = "0.10.5"
10+
11+
[dev-dependencies]
12+
pretty_assertions = "1.3.0"

2018/day-05/input

+1
Large diffs are not rendered by default.

2018/day-05/src/main.rs

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#![allow(unused_imports, dead_code)]
2+
3+
use itertools::Itertools;
4+
use std::fs;
5+
6+
fn main() {
7+
let file = fs::read_to_string("input").unwrap();
8+
let file = file.trim();
9+
10+
let part_1a = react(file).len();
11+
println!("{}: {}", stringify!(part_1a), part_1a);
12+
13+
let part_2a = improve_polymer_and_react(file);
14+
println!("{}: {}", stringify!(part_2a), part_2a);
15+
}
16+
17+
fn improve_polymer_and_react(file: &str) -> usize {
18+
('a'..='z')
19+
.map(|c| react(&remove_units(file, c)).len())
20+
.min()
21+
.unwrap()
22+
}
23+
24+
fn react(polymer: &str) -> String {
25+
let mut result = polymer.to_owned();
26+
let mut changed = true;
27+
while changed {
28+
changed = false;
29+
for c in ('a'..='z').chain('A'..='Z') {
30+
let from = [c, switch_case(c)].iter().collect::<String>();
31+
if result.contains(&from) {
32+
result = result.replace(&from, "");
33+
changed = true;
34+
}
35+
}
36+
}
37+
result
38+
}
39+
40+
fn remove_units(polymer: &str, c: char) -> String {
41+
polymer.replace([c, switch_case(c)], "")
42+
}
43+
44+
fn switch_case(c: char) -> char {
45+
if c.is_ascii_uppercase() {
46+
c.to_ascii_lowercase()
47+
} else {
48+
c.to_ascii_uppercase()
49+
}
50+
}
51+
52+
#[cfg(test)]
53+
mod tests {
54+
use super::*;
55+
use pretty_assertions::assert_eq;
56+
57+
#[test]
58+
fn react_examples() {
59+
assert_eq!(react("aA"), "");
60+
assert_eq!(react("abBA"), "");
61+
assert_eq!(react("abAB"), "abAB");
62+
assert_eq!(react("aabAAB"), "aabAAB");
63+
}
64+
65+
#[test]
66+
fn react_larger_example() {
67+
assert_eq!(react("dabAcCaCBAcCcaDA"), "dabCBAcaDA");
68+
}
69+
70+
#[test]
71+
fn part_2_examples() {
72+
assert_eq!(remove_units("dabAcCaCBAcCcaDA", 'a'), "dbcCCBcCcD");
73+
assert_eq!(react(&remove_units("dabAcCaCBAcCcaDA", 'a')), "dbCBcD");
74+
}
75+
}

0 commit comments

Comments
 (0)