diff --git a/res/08/example b/res/08/example new file mode 100644 index 0000000..78a1e91 --- /dev/null +++ b/res/08/example @@ -0,0 +1,12 @@ +............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............ diff --git a/res/08/input b/res/08/input new file mode 100644 index 0000000..4d8d233 --- /dev/null +++ b/res/08/input @@ -0,0 +1,50 @@ +.E..........m..0N.........f....................... +........N........P0............................... +.......j..................................F....... +........1j............P........................C.. +...........................3..K......f..........E. +...........V...y...0.....................F........ +1.......j.....P....y.N.......................F.... +....................m...................C......... +..L......P....p..................w.m.............. +............E......p..AU........8......f.......... +..............C...............w....d.............. +j1...............E..........3.........f........w.. +.................p...A..........3................. +.................3..p........KU...w..r..F......... +7.........y........8.......................r...... +........y..u......K............................... +...1..................8....C...K.................. +...........h.......................6.............. +......................U.........A.r..t........6... +...........5.........8..c......................... +.................U................t............... +.....L...O...................t.............d...... +.........7........................................ +......L..H...c.....9....t.................6....... +...........................c.M..................4. +.....R..7...O..................................... +.......................9......................d... +.................................................. +.........L..9...R..........................6c..... +..M.....T.5.................................d..... +.......5OR...................T.................... +.......D......o.........v...................r..... +...u....o.........5............................... +.......WR.....Y...........................e...4... +T............O......M..................4..a....... +.Y...................M............................ +........W..D...............oh............e........ +.......7......Do...................A...e.......4.. +.W...Y..D........................h...v..........e. +..........V.....9.l.......h.......a.........n..v.. +.......................H.....a2................... +.................................................. +...V............Y....J..H2................vn...... +..............................H2.................n +................V..........l...........k.......... +.T..u........................J...ak............... +..................J.....l......................... +.................l................................ +......u.........................................n. +......................J..k............2........... diff --git a/src/days/d08.rs b/src/days/d08.rs new file mode 100644 index 0000000..b4abc09 --- /dev/null +++ b/src/days/d08.rs @@ -0,0 +1,106 @@ +use std::collections::{HashMap, HashSet}; + +use std::fs; + +pub fn solve() { + let path = "res/08/input"; + + let contents = fs::read_to_string(path).expect("Something went wrong reading the file"); + + let mut antennas: HashMap> = HashMap::new(); + + let rows = contents.lines().count(); + let cols = contents.lines().next().unwrap().chars().count(); + + for (i, line) in contents.lines().enumerate() { + for (j, c) in line.chars().enumerate() { + match c { + '.' => {} + _ => { + let entry = antennas.entry(c).or_insert(Vec::new()); + entry.push((i as isize, j as isize)); + } + } + } + } + + let mut antinodes: HashSet<(isize, isize)> = HashSet::new(); + + antennas.iter().for_each(|(_, v)| { + v.iter().enumerate().for_each(|(i, (x1, y1))| { + v.iter().skip(i + 1).for_each(|(x2, y2)| { + if x1 == x2 && y1 == y2 { + return; + } + let (a_x1, a_y1) = (x1 + (x1 - x2), y1 + (y1 - y2)); + let (a_x2, a_y2) = (x2 + (x2 - x1), y2 + (y2 - y1)); + + if a_x1 >= 0 && a_y1 >= 0 && a_x1 < rows as isize && a_y1 < cols as isize { + antinodes.insert((a_x1, a_y1)); + } + if a_x2 >= 0 && a_y2 >= 0 && a_x2 < rows as isize && a_y2 < cols as isize { + antinodes.insert((a_x2, a_y2)); + } + }) + }) + }); + + let result = antinodes.len(); + + println!("Result 1: {}", result); + + let mut antinodes: HashSet<(isize, isize)> = HashSet::new(); + + antennas.iter().for_each(|(_, v)| { + v.iter().enumerate().for_each(|(i, (x1, y1))| { + v.iter().skip(i + 1).for_each(|(x2, y2)| { + if x1 == x2 && y1 == y2 { + return; + } + + let ax1_diff = x1 - x2; + let ay1_diff = y1 - y2; + let a1_gcd = gcd(ax1_diff, ay1_diff); + + let mut cnt = 0; + loop { + let (ax, ay) = (x1 + ax1_diff * cnt / a1_gcd, y1 + ay1_diff * cnt / a1_gcd); + if ax < 0 || ay < 0 || ax >= rows as isize || ay >= cols as isize { + break; + } + antinodes.insert((ax, ay)); + cnt += 1; + } + + let ax2_diff = x2 - x1; + let ay2_diff = y2 - y1; + let a2_gcd = gcd(ax2_diff, ay2_diff); + + cnt = 0; + loop { + let (ax, ay) = (x2 + ax2_diff * cnt / a2_gcd, y2 + ay2_diff * cnt / a2_gcd); + if ax < 0 || ay < 0 || ax >= rows as isize || ay >= cols as isize { + break; + } + antinodes.insert((ax, ay)); + cnt += 1; + } + }) + }) + }); + + let result = antinodes.len(); + + println!("Result 2: {}", result); +} + +fn gcd(mut a: isize, mut b: isize) -> isize { + a = a.abs(); + b = b.abs(); + while b != 0 { + let temp = b; + b = a % b; + a = temp; + } + a +} diff --git a/src/main.rs b/src/main.rs index ae2bb46..6f7382d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,12 +4,45 @@ extern crate scan_fmt; use std::time::Instant; fn main() { - //days::d07::solve() - _all_days() + if std::env::args().len() > 1 { + if let Some(day) = std::env::args().nth(1) { + match day.as_str() { + "all" => all_days(), + "1" => days::d01::solve(), + "2" => days::d02::solve(), + "3" => days::d03::solve(), + "4" => days::d04::solve(), + "5" => days::d05::solve(), + "6" => days::d06::solve(), + "7" => days::d07::solve(), + "8" => days::d08::solve(), + //"9" => days::d09::solve(), + //"10" => days::d10::solve(), + //"11" => days::d11::solve(), + //"12" => days::d12::solve(), + //"13" => days::d13::solve(), + //"14" => days::d14::solve(), + //"15" => days::d15::solve(), + //"16" => days::d16::solve(), + //"17" => days::d17::solve(), + //"18" => days::d18::solve(), + //"19" => days::d19::solve(), + //"20" => days::d20::solve(), + //"21" => days::d21::solve(), + //"22" => days::d22::solve(), + //"23" => days::d23::solve(), + //"24" => days::d24::solve(), + //"25" => days::d25::solve(), + _ => println!("Day not implemented"), + } + } + } else { + all_days(); + } } -#[allow(unreachable_code, unused)] -fn _all_days() { +#[allow(unused)] +fn all_days() { let start = Instant::now(); let mut time = start.clone(); @@ -41,11 +74,11 @@ fn _all_days() { days::d07::solve(); time = _print_elapsed(time); - /* println!("\nDay 8"); days::d08::solve(); time = _print_elapsed(time); + /* println!("\nDay 9"); days::d09::solve(); time = _print_elapsed(time);