diff options
Diffstat (limited to '2018')
| -rw-r--r-- | 2018/input/7.txt | 101 | ||||
| -rw-r--r-- | 2018/src/day7.rs | 61 | ||||
| -rw-r--r-- | 2018/src/main.rs | 4 | 
3 files changed, 165 insertions, 1 deletions
| diff --git a/2018/input/7.txt b/2018/input/7.txt new file mode 100644 index 0000000..59be316 --- /dev/null +++ b/2018/input/7.txt @@ -0,0 +1,101 @@ +Step J must be finished before step K can begin. +Step N must be finished before step X can begin. +Step S must be finished before step G can begin. +Step T must be finished before step R can begin. +Step H must be finished before step L can begin. +Step V must be finished before step W can begin. +Step G must be finished before step U can begin. +Step K must be finished before step A can begin. +Step D must be finished before step Z can begin. +Step C must be finished before step E can begin. +Step X must be finished before step P can begin. +Step Y must be finished before step U can begin. +Step R must be finished before step O can begin. +Step W must be finished before step U can begin. +Step O must be finished before step Q can begin. +Step A must be finished before step P can begin. +Step B must be finished before step E can begin. +Step F must be finished before step E can begin. +Step Q must be finished before step U can begin. +Step M must be finished before step E can begin. +Step P must be finished before step U can begin. +Step L must be finished before step Z can begin. +Step Z must be finished before step U can begin. +Step U must be finished before step E can begin. +Step I must be finished before step E can begin. +Step H must be finished before step G can begin. +Step X must be finished before step I can begin. +Step K must be finished before step X can begin. +Step Z must be finished before step I can begin. +Step S must be finished before step M can begin. +Step L must be finished before step U can begin. +Step A must be finished before step M can begin. +Step W must be finished before step A can begin. +Step N must be finished before step A can begin. +Step S must be finished before step E can begin. +Step W must be finished before step Q can begin. +Step J must be finished before step L can begin. +Step Q must be finished before step L can begin. +Step M must be finished before step U can begin. +Step H must be finished before step E can begin. +Step D must be finished before step E can begin. +Step V must be finished before step P can begin. +Step Q must be finished before step M can begin. +Step X must be finished before step W can begin. +Step K must be finished before step I can begin. +Step T must be finished before step H can begin. +Step Y must be finished before step L can begin. +Step G must be finished before step O can begin. +Step M must be finished before step Z can begin. +Step F must be finished before step Z can begin. +Step Q must be finished before step E can begin. +Step H must be finished before step C can begin. +Step Q must be finished before step P can begin. +Step D must be finished before step U can begin. +Step Z must be finished before step E can begin. +Step O must be finished before step M can begin. +Step L must be finished before step I can begin. +Step J must be finished before step A can begin. +Step Q must be finished before step Z can begin. +Step P must be finished before step I can begin. +Step K must be finished before step O can begin. +Step R must be finished before step E can begin. +Step W must be finished before step F can begin. +Step D must be finished before step Q can begin. +Step R must be finished before step U can begin. +Step W must be finished before step P can begin. +Step S must be finished before step Z can begin. +Step T must be finished before step P can begin. +Step B must be finished before step Q can begin. +Step S must be finished before step T can begin. +Step R must be finished before step A can begin. +Step K must be finished before step R can begin. +Step N must be finished before step G can begin. +Step C must be finished before step W can begin. +Step T must be finished before step A can begin. +Step B must be finished before step Z can begin. +Step C must be finished before step P can begin. +Step D must be finished before step P can begin. +Step B must be finished before step P can begin. +Step F must be finished before step U can begin. +Step V must be finished before step X can begin. +Step K must be finished before step W can begin. +Step Y must be finished before step I can begin. +Step C must be finished before step B can begin. +Step X must be finished before step L can begin. +Step X must be finished before step M can begin. +Step H must be finished before step P can begin. +Step S must be finished before step F can begin. +Step J must be finished before step Y can begin. +Step Y must be finished before step Z can begin. +Step B must be finished before step I can begin. +Step S must be finished before step C can begin. +Step K must be finished before step E can begin. +Step N must be finished before step Q can begin. +Step A must be finished before step Z can begin. +Step J must be finished before step I can begin. +Step Y must be finished before step O can begin. +Step Y must be finished before step F can begin. +Step S must be finished before step U can begin. +Step D must be finished before step W can begin. +Step V must be finished before step D can begin. diff --git a/2018/src/day7.rs b/2018/src/day7.rs new file mode 100644 index 0000000..1924916 --- /dev/null +++ b/2018/src/day7.rs @@ -0,0 +1,61 @@ +use std::io; +use std::io::BufRead; +use std::cmp::Ordering; +use std::collections::BinaryHeap; + +#[derive(PartialEq, Eq)] +struct DecreasingU8(u8); + +impl PartialOrd for DecreasingU8 { +    fn partial_cmp(&self, other: &Self) -> Option<Ordering> { +        Some(self.cmp(other)) +    } +} + +impl Ord for DecreasingU8 { +    fn cmp(&self, other: &Self) -> Ordering { +        other.0.cmp(&self.0) +    } +} + +fn simulation(nexts: &[Vec<u8>], nelves: i32, basetime: i32, inctime: i32) -> (String, i32) { +    let mut incoming = [0; 26]; +    for tos in nexts.iter() { +        for &to in tos { +            incoming[to as usize] += 1; +        } +    } + +    let mut sources = BinaryHeap::new(); +    for i in 0..26 { +        if incoming[i as usize] == 0 { +            sources.push(DecreasingU8(i)); +        } +    } + +    let mut order = String::new(); +    while sources.len() > 0 { +        let DecreasingU8(i) = sources.pop().unwrap(); +        order.push(char::from(i + 65)); +        for &to in &nexts[i as usize] { +            incoming[to as usize] -= 1; +            if incoming[to as usize] == 0 { +                sources.push(DecreasingU8(to)); +            } +        } +    } + +    (order, 0) +} + +pub fn main<T: BufRead>(reader: T) -> io::Result<(String, String)> { +    let mut nexts: Vec<Vec<u8>> = vec![vec![]; 26]; +    for l in reader.lines().map(|l| l.unwrap()) { +        let (from, to) = (l.as_bytes()[5] - 65, l.as_bytes()[36] - 65); +        nexts[from as usize].push(to); +    } + +    let (part1, _) = simulation(&nexts, 1, 1, 0); + +    Ok((part1, String::new())) +} diff --git a/2018/src/main.rs b/2018/src/main.rs index c35e142..fccb319 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -15,8 +15,9 @@ mod day3;  mod day4;  mod day5;  mod day6; +mod day7; -static NUM_DAYS: i32 = 6; +static NUM_DAYS: i32 = 7;  fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> {      match day { @@ -26,6 +27,7 @@ fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> {          4 => day4::main(reader),          5 => day5::main(reader),          6 => day6::main(reader), +        7 => day7::main(reader),          _ => Err(Error::new(ErrorKind::Other, "Invalid day"))      }  } | 
