Day 5
This commit is contained in:
parent
fc8f28cf22
commit
f38f02b727
2 changed files with 108 additions and 0 deletions
105
2018/src/day5.rs
Normal file
105
2018/src/day5.rs
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
use std::collections::HashMap;
|
||||
use std::collections::HashSet;
|
||||
use std::fmt;
|
||||
|
||||
const INPUT: &str = include_str!("input/day5.txt");
|
||||
// const INPUT: &str = "dabAcCaCBAcCcaDA";
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||
enum Polarity {
|
||||
Upper,
|
||||
Lower,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
struct Unit {
|
||||
name: String,
|
||||
polarity: Polarity,
|
||||
}
|
||||
|
||||
type Polymer = Vec<Unit>;
|
||||
impl fmt::Display for Unit {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
let c = match self.polarity {
|
||||
Polarity::Upper => self.name.to_uppercase(),
|
||||
Polarity::Lower => self.name.to_lowercase(),
|
||||
};
|
||||
write!(f, "{}", c)
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_input(s: String) -> Polymer {
|
||||
let mut polymer = Vec::new();
|
||||
for c in s.chars() {
|
||||
polymer.push(Unit {
|
||||
name: c.to_lowercase().to_string(),
|
||||
polarity: if c.is_lowercase() {
|
||||
Polarity::Lower
|
||||
} else {
|
||||
Polarity::Upper
|
||||
},
|
||||
});
|
||||
}
|
||||
polymer
|
||||
}
|
||||
|
||||
fn can_cancel(u1: &Unit, u2: &Unit) -> bool {
|
||||
u1.name == u2.name && u1.polarity != u2.polarity
|
||||
}
|
||||
|
||||
// TODO: optimize
|
||||
fn reduce(p: &mut Polymer) -> &Polymer {
|
||||
let mut i = 0;
|
||||
while i + 1 < p.len() {
|
||||
if can_cancel(&p[i], &p[i + 1]) {
|
||||
p.remove(i + 1);
|
||||
p.remove(i);
|
||||
return p;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
p
|
||||
}
|
||||
|
||||
fn reduce_fully(p: &mut Polymer) -> &Polymer {
|
||||
let mut old_len = p.len();
|
||||
loop {
|
||||
reduce(p);
|
||||
let new_len = p.len();
|
||||
if new_len == old_len {
|
||||
break;
|
||||
}
|
||||
old_len = new_len;
|
||||
}
|
||||
p
|
||||
}
|
||||
|
||||
pub fn part1() -> usize {
|
||||
let mut polymer = parse_input(INPUT.to_string());
|
||||
reduce_fully(&mut polymer);
|
||||
polymer.len()
|
||||
}
|
||||
|
||||
fn unit_types(p: Polymer) -> HashSet<String> {
|
||||
let mut types = HashSet::new();
|
||||
for u in p {
|
||||
types.insert(u.name);
|
||||
}
|
||||
types
|
||||
}
|
||||
|
||||
fn remove_all(p: Polymer, t: String) -> Polymer {
|
||||
p.into_iter().filter(|u| u.name != t).collect()
|
||||
}
|
||||
|
||||
pub fn part2() -> &'static str {
|
||||
let original = parse_input(INPUT.to_string());
|
||||
let types = unit_types(original.clone());
|
||||
let mut lengths = HashMap::new();
|
||||
for t in types {
|
||||
let mut cleaned = remove_all(original.clone(), t.clone());
|
||||
reduce_fully(&mut cleaned);
|
||||
lengths.insert(t, cleaned.len());
|
||||
}
|
||||
"TODO"
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ mod day1;
|
|||
mod day2;
|
||||
mod day3;
|
||||
mod day4;
|
||||
// mod day5; // TODO: optimize
|
||||
|
||||
fn main() {
|
||||
println!("Day 1 part 1: {}", day1::part1());
|
||||
|
|
@ -12,4 +13,6 @@ fn main() {
|
|||
println!("Day 3 part 2: {}", day3::part2());
|
||||
println!("Day 4 part 1: {}", day4::part1());
|
||||
println!("Day 4 part 2: {}", day4::part2());
|
||||
// println!("Day 5 part 1: {}", day5::part1()); // TODO: optimize
|
||||
// println!("Day 5 part 2: {}", day5::part2()); // TODO: optimize
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue