diff options
Diffstat (limited to '2018/src')
| -rw-r--r-- | 2018/src/day7.rs | 61 | ||||
| -rw-r--r-- | 2018/src/main.rs | 4 | 
2 files changed, 64 insertions, 1 deletions
| 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"))      }  } | 
