mirror of
https://github.com/wezm/advent-of-code.git
synced 2024-12-18 10:19:55 +00:00
Add day 5 2018 parts 1 and 2
This commit is contained in:
parent
bf93a2b8ae
commit
49f0df253f
1 changed files with 99 additions and 0 deletions
99
2018/src/bin/day5.rs
Normal file
99
2018/src/bin/day5.rs
Normal file
|
@ -0,0 +1,99 @@
|
|||
use std::fs;
|
||||
|
||||
struct Polymer {
|
||||
units: Vec<char>,
|
||||
}
|
||||
|
||||
fn reacts(chr1: char, chr2: char) -> bool {
|
||||
// The is_ascii_lowercase probably isn't strictly necessary but ¯\_(ツ)_/¯
|
||||
(chr1.is_ascii_uppercase() && chr2 == chr1.to_ascii_lowercase())
|
||||
|| (chr1.is_ascii_lowercase() && chr2 == chr1.to_ascii_uppercase())
|
||||
}
|
||||
|
||||
impl Polymer {
|
||||
fn new() -> Self {
|
||||
Polymer { units: Vec::new() }
|
||||
}
|
||||
|
||||
fn last(&self) -> Option<char> {
|
||||
self.units.last().map(|c| *c)
|
||||
}
|
||||
|
||||
fn push(&mut self, chr: char) {
|
||||
// if the char being pushed is the same as the top of stack then pop it, otherwise push
|
||||
if self.last().map(|top| reacts(top, chr)).unwrap_or(false) {
|
||||
self.units.pop();
|
||||
} else {
|
||||
self.units.push(chr);
|
||||
}
|
||||
}
|
||||
|
||||
fn into_string(self) -> String {
|
||||
self.units.iter().collect()
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
self.units.len()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input = fs::read_to_string("input/day5.txt").expect("input");
|
||||
|
||||
part1(input.trim());
|
||||
part2(input.trim());
|
||||
}
|
||||
|
||||
fn part1(input: &str) {
|
||||
let result = reduce(input);
|
||||
|
||||
println!("{}", result.len());
|
||||
}
|
||||
|
||||
fn part2(input: &str) {
|
||||
let shortest_length = "abcdefghijklmnopqrstuvwxyz"
|
||||
.chars()
|
||||
.map(|letter| {
|
||||
// Remove letter/LETTER and LETTER/letter
|
||||
let input = input
|
||||
.replace(letter, "")
|
||||
.replace(letter.to_ascii_uppercase(), "");
|
||||
reduce(&input)
|
||||
})
|
||||
.min_by(|polymer_a, polymer_b| polymer_a.len().cmp(&polymer_b.len()));
|
||||
|
||||
println!("Part 2: {:?}", shortest_length.map(|polymer| polymer.len()));
|
||||
}
|
||||
|
||||
fn reduce(input: &str) -> Polymer {
|
||||
input.chars().fold(Polymer::new(), |mut polymer, chr| {
|
||||
polymer.push(chr);
|
||||
polymer
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reacts() {
|
||||
assert!(reacts('a', 'A'));
|
||||
assert!(reacts('A', 'a'));
|
||||
assert!(!reacts('A', 'A'));
|
||||
assert!(!reacts('a', 'a'));
|
||||
assert!(!reacts('a', 'B'));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part1() {
|
||||
let input = "dabAcCaCBAcCcaDA";
|
||||
let result = reduce(input);
|
||||
|
||||
assert_eq!(result.len(), 10);
|
||||
assert_eq!(result.into_string(), "dabCBAcaDA".to_string());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part1_snippet() {
|
||||
let input = "wUuXxrRbeEaAuUMmJUuXxvoFfMmOTjJmMtVvmMVWpdDPwGgAalVv";
|
||||
let result = reduce(input);
|
||||
|
||||
assert_eq!(result.into_string(), "wbJl".to_string());
|
||||
}
|
Loading…
Reference in a new issue