Completed day 10 part 1

This commit is contained in:
Tyler Hallada 2019-12-17 00:09:28 -05:00
parent 254377b5af
commit 3c5f8e52bb
9 changed files with 342 additions and 0 deletions

93
day10/Cargo.lock generated Normal file
View File

@ -0,0 +1,93 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "autocfg"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "day10"
version = "0.1.0"
dependencies = [
"num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"num-complex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
"num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
"num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-bigint"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-complex"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-integer"
version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-iter"
version = "0.1.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-rational"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-traits"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[metadata]
"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
"checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db"
"checksum num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9c3f34cdd24f334cb265d9bf8bfa8a241920d026916785747a92f0e55541a1a"
"checksum num-complex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fcb0cf31fb3ff77e6d2a6ebd6800df7fdcd106f2ad89113c9130bcd07f93dffc"
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
"checksum num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "76bd5272412d173d6bf9afdf98db8612bbabc9a7a830b7bfc9c188911716132e"
"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454"
"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"

10
day10/Cargo.toml Normal file
View File

@ -0,0 +1,10 @@
[package]
name = "day10"
version = "0.1.0"
authors = ["Tyler Hallada <tyler@hallada.net>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
num = "0.2"

30
day10/input/input.txt Normal file
View File

@ -0,0 +1,30 @@
.#.####..#.#...#...##..#.#.##.
..#####.##..#..##....#..#...#.
......#.......##.##.#....##..#
..#..##..#.###.....#.#..###.#.
..#..#..##..#.#.##..###.......
...##....#.##.#.#..##.##.#...#
.##...#.#.##..#.#........#.#..
.##...##.##..#.#.##.#.#.#.##.#
#..##....#...###.#..##.#...##.
.###.###..##......#..#...###.#
.#..#.####.#..#....#.##..#.#.#
..#...#..#.#######....###.....
####..#.#.#...##...##....#..##
##..#.##.#.#..##.###.#.##.##..
..#.........#.#.#.#.......#..#
...##.#.....#.#.##........#..#
##..###.....#.............#.##
.#...#....#..####.#.#......##.
..#..##..###...#.....#...##..#
...####..#.#.##..#....#.#.....
####.#####.#.#....#.#....##.#.
#.#..#......#.........##..#.#.
#....##.....#........#..##.##.
.###.##...##..#.##.#.#...#.#.#
##.###....##....#.#.....#.###.
..#...#......#........####..#.
#....#.###.##.#...#.#.#.#.....
.........##....#...#.....#..##
###....#.........#..#..#.#.#..
##...#...###.#..#.###....#.##.

5
day10/input/test1.txt Normal file
View File

@ -0,0 +1,5 @@
.#..#
.....
#####
....#
...##

10
day10/input/test2.txt Normal file
View File

@ -0,0 +1,10 @@
......#.#.
#..#.#....
..#######.
.#.#.###..
.#..#.....
..#....#.#
#..#....#.
.##.#..###
##...#..#.
.#....####

10
day10/input/test3.txt Normal file
View File

@ -0,0 +1,10 @@
#.#...#.#.
.###....#.
.#....#...
##.#.#.#.#
....#.#.#.
.##..###.#
..#...##..
..##....##
......#...
.####.###.

10
day10/input/test4.txt Normal file
View File

@ -0,0 +1,10 @@
.#..#..###
####.###.#
....###.#.
..###.##.#
##.##.#.#.
....###..#
..#.#..#.#
#..#.#.###
.##...##.#
.....#.#..

20
day10/input/test5.txt Normal file
View File

@ -0,0 +1,20 @@
.#..##.###...#######
##.############..##.
.#.######.########.#
.###.#######.####.#.
#####.##.#.##.###.##
..#####..#.#########
####################
#.####....###.#.#.##
##.#################
#####.##.###..####..
..######..##.#######
####.##.####...##..#
.#####..#.######.###
##...#.##########...
#.##########.#######
.####.#.###.###.#.##
....##.##.###..#####
.#.#.###########.###
#.#.#.#####.####.###
###.##.####.##.#..##

154
day10/src/main.rs Normal file
View File

@ -0,0 +1,154 @@
use std::collections::HashMap;
use std::error::Error;
use std::fs::File;
use std::io::{prelude::*, BufReader};
use std::result;
use num::integer::gcd;
const INPUT: &str = "input/input.txt";
type Result<T> = result::Result<T, Box<dyn Error>>;
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
struct Point {
x: usize,
y: usize,
}
#[derive(Debug, PartialEq)]
struct AsteroidField {
asteroids: Vec<Point>,
}
impl AsteroidField {
fn find_monitoring_station(&self) -> (&Point, usize) {
let mut asteroid_detect_scores = HashMap::new();
for asteroid in self.asteroids.iter() {
let mut lines_of_sight: HashMap<(i32, i32), Point> = HashMap::new();
for other in self.asteroids.iter() {
if asteroid != other {
let x_dist: i32 = other.x as i32 - asteroid.x as i32;
let y_dist: i32 = other.y as i32 - asteroid.y as i32;
let mut x_ratio: i32 = 0;
let mut y_ratio: i32 = 0;
if x_dist == 0 {
if y_dist > 0 {
y_ratio = 1;
} else {
y_ratio = -1;
}
} else if y_dist == 0 {
if x_dist > 0 {
x_ratio = 1;
} else {
x_ratio = -1;
}
} else {
let gcd = gcd(x_dist, y_dist);
x_ratio = x_dist / gcd;
y_ratio = y_dist / gcd;
}
lines_of_sight
.entry((x_ratio, y_ratio))
.and_modify(|current| {
if (current.x as i32 - asteroid.x as i32).abs() > x_dist.abs()
&& (current.y as i32 - asteroid.y as i32).abs() > y_dist.abs()
{
current.x = other.x;
current.y = other.y;
}
})
.or_insert(other.clone());
}
}
asteroid_detect_scores.insert(asteroid, lines_of_sight.len());
}
asteroid_detect_scores
.into_iter()
.max_by_key(|score| score.1)
.expect("No asteroid detect scores")
}
}
fn read_asteroid_field(filename: &str) -> Result<AsteroidField> {
let file = File::open(filename)?;
let reader = BufReader::new(file);
let mut asteroids = vec![];
for (y, line) in reader.lines().enumerate() {
for (x, contents) in line?.chars().enumerate() {
if contents == '#' {
asteroids.push(Point { x, y });
}
}
}
Ok(AsteroidField { asteroids })
}
fn solve_part1() -> Result<usize> {
let asteroid_field = read_asteroid_field(INPUT)?;
Ok(asteroid_field.find_monitoring_station().1)
}
fn solve_part2() -> Result<i64> {
Ok(1)
}
fn main() -> Result<()> {
println!("Part 1: {}", solve_part1()?);
println!("Part 2: {}", solve_part2()?);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
const TEST_INPUT1: &str = "input/test1.txt";
const TEST_INPUT2: &str = "input/test2.txt";
const TEST_INPUT3: &str = "input/test3.txt";
const TEST_INPUT4: &str = "input/test4.txt";
const TEST_INPUT5: &str = "input/test5.txt";
#[test]
fn reads_asteroid_field() {
assert_eq!(
read_asteroid_field(TEST_INPUT1).unwrap(),
AsteroidField {
asteroids: vec![
Point { x: 1, y: 0 },
Point { x: 4, y: 0 },
Point { x: 0, y: 2 },
Point { x: 1, y: 2 },
Point { x: 2, y: 2 },
Point { x: 3, y: 2 },
Point { x: 4, y: 2 },
Point { x: 4, y: 3 },
Point { x: 3, y: 4 },
Point { x: 4, y: 4 },
]
},
)
}
#[test]
fn finds_monitoring_stations() {
for (input, monitoring_point) in [
(TEST_INPUT1, Point { x: 3, y: 4 }),
(TEST_INPUT2, Point { x: 5, y: 8 }),
(TEST_INPUT3, Point { x: 1, y: 2 }),
(TEST_INPUT4, Point { x: 6, y: 3 }),
(TEST_INPUT5, Point { x: 11, y: 13 }),
]
.iter()
{
let asteroid_field = read_asteroid_field(input).unwrap();
assert_eq!(asteroid_field.find_monitoring_station().0, monitoring_point);
}
}
}