Files
advent-of-code-2016/2016/day01/src/main.rs
T

78 lines
2.5 KiB
Rust
Raw Normal View History

2016-12-02 16:40:57 -05:00
use std::io::Read;
use std::fs::File;
fn turn(state: &(i32, i32), direction: &String) -> (i32, i32) {
match direction.as_ref() {
"R" => { // clockwise motion
(-1 * state.1, 1 * state.0)
},
"L" => { //rotate widdershins
(1 * state.1, -1 * state.0)
},
_ => {
println!("Invalid direction: {}", direction);
(state.0, state.1)
},
}
2016-12-01 16:59:15 -05:00
}
2016-12-02 16:40:57 -05:00
fn step(state: &(i32, i32), pos: &(i32, i32), dist: i32) -> (i32, i32) {
(pos.0 + state.0 * dist, pos.1 + state.1 * dist)
}
2016-12-08 12:57:39 -05:00
fn tiny_step(state: &(i32, i32), pos: &(usize, usize)) -> (usize, usize) {
((pos.0 as i32 + state.0) as usize, (pos.1 as i32 + state.1) as usize)
}
2016-12-02 16:40:57 -05:00
fn part_1(input: &String) {
let mut state = (1, 0);
let mut pos = (0, 0);
for item in input.trim().split(", ") {
let (dir, dist) = item.split_at(1);
let dir: String = dir.to_string();
let dist: i32 = dist.parse::<i32>().unwrap();
state = turn(&state, &dir);
pos = step(&state, &pos, dist);
//println!("Moved {} {} to arrive at ({}, {})", dist, dir, pos.0, pos.1);
}
println!("Part 1: Ended up at ({}, {}), {} away from the start", pos.0, pos.1, pos.0.abs() + pos.1.abs());
}
fn part_2(input: &String) {
2016-12-08 12:57:39 -05:00
const OFFSET: usize = 500; //we'll make a grid 1000x1000
let mut grid = [[false; 2*OFFSET]; 2*OFFSET];
2016-12-02 16:40:57 -05:00
2016-12-08 12:57:39 -05:00
let mut state = (1, 0);
let mut pos = (OFFSET, OFFSET);
grid[OFFSET][OFFSET] = true; //we are already at the axis
'outer: for item in input.trim().split(", ") {
2016-12-02 16:40:57 -05:00
let (dir, dist) = item.split_at(1);
let dir: String = dir.to_string();
2016-12-08 12:57:39 -05:00
let mut dist: i32 = dist.parse::<i32>().unwrap();
2016-12-02 16:40:57 -05:00
state = turn(&state, &dir);
2016-12-08 12:57:39 -05:00
while dist > 0 { //take a step
pos = tiny_step(&state, &pos);
match grid[pos.0][pos.1] {
true => {
let real_pos = ((pos.0 as i32 - OFFSET as i32), (pos.1 as i32 - OFFSET as i32));
println!("Part 2: Returned to ({}, {}), {} away from the start", real_pos.0, real_pos.1, real_pos.0.abs() + real_pos.1.abs());
break 'outer;
},
false => { grid[pos.0][pos.1] = true; dist = dist - 1 },
}
2016-12-02 16:40:57 -05:00
}
}
}
fn main() {
let mut file = File::open("./data").expect("could not open file");
let mut input = String::new();
file.read_to_string(&mut input).expect("could not read file");
2016-12-08 12:57:39 -05:00
part_1(&input);
2016-12-02 16:40:57 -05:00
part_2(&input);
}