From 99a2f95c5e89ea0fcb2b8b5bbacc29376b85bcae Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Tue, 11 Dec 2018 07:53:26 +0200 Subject: Day 11: Finding a max sum of an area --- src/bin/day_11.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/bin/day_11.rs b/src/bin/day_11.rs index cf9c35f..0e458a3 100644 --- a/src/bin/day_11.rs +++ b/src/bin/day_11.rs @@ -2,17 +2,65 @@ extern crate advent_of_code_2018; use advent_of_code_2018::*; use std::error::Error; -use std::path::PathBuf; +use std::i32; // cargo watch -cs "cargo run --release --bin day_11" fn main() -> Result<(), Box> { - let input = read_file(&PathBuf::from("inputs/11.txt"))?; + let input = 1723; println!("Input: {:?}", input); + let powers = precompute_powers(input); + let power_per_size = (1..300).map(|size| { + (1..302-size).map(|left| { + (1..302-size).map(|top| { + (power_for_block(left, top, size, &powers), (left, top, size)) + }).max_by_key(|(p, _)| *p).unwrap() + }).max_by_key(|(p, _)| *p).unwrap() + }).collect::>(); + let (max_power_at_size_3, coordinate_at_size_3) = power_per_size[2]; // index from 0 vs 1 + debug!(max_power_at_size_3); + debug!(coordinate_at_size_3); + + let (max_power, coordinate) = power_per_size.iter().max_by_key(|(p, _)| p).unwrap(); + + debug!(max_power); + debug!(coordinate); Ok(()) } + +fn power_for_block(left: i32, top: i32, size: i32, powers: &[[i32;300];300]) -> i32 { + (left..left+size).map(|x| { + (top..top+size).map(|y| { + powers[x as usize - 1][y as usize - 1] + }).sum::() + }).sum() +} + +fn precompute_powers(input: i32) -> [[i32;300];300] { + let mut powers: [[i32;300];300] = [[0;300];300]; + for x in 1..301 { + for y in 1..301 { + powers[x as usize - 1][y as usize - 1] = power_from_coordinates(x, y, input); + } + } + powers +} + +fn power_from_coordinates(x: i32, y: i32, input: i32) -> i32 { + let rack_id = x + 10; + ((((rack_id * y) + input) * rack_id / 100) % 10) - 5 +} + + +#[test] +fn power_from_coord_example() { + assert_eq!(power_from_coordinates(3, 5, 8), 4); + assert_eq!(power_from_coordinates(122, 79, 57), -5); + assert_eq!(power_from_coordinates(217,196, 39), 0); + assert_eq!(power_from_coordinates(101, 153, 71), 4); +} -- cgit v1.2.3