8aa7fe572f
maybe a status would be good?
118 lines
4.3 KiB
Rust
118 lines
4.3 KiB
Rust
// Santa's sleigh uses a very high-precision clock to guide its movements, and the clock's
|
|
// oscillator is regulated by stars. Unfortunately, the stars have been stolen... by the Easter
|
|
// Bunny. To save Christmas, Santa needs you to retrieve all fifty stars by December 25th.
|
|
//
|
|
// Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent
|
|
// calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one
|
|
// star. Good luck!
|
|
//
|
|
// You're airdropped near Easter Bunny Headquarters in a city somewhere. "Near", unfortunately, is
|
|
// as close as you can get - the instructions on the Easter Bunny Recruiting Document the Elves
|
|
// intercepted start here, and nobody had time to work them out further.
|
|
//
|
|
// The Document indicates that you should start at the given coordinates (where you just landed)
|
|
// and face North. Then, follow the provided sequence: either turn left (L) or right (R) 90
|
|
// degrees, then walk forward the given number of blocks, ending at a new intersection.
|
|
//
|
|
// There's no time to follow such ridiculous instructions on foot, though, so you take a moment
|
|
// and work out the destination. Given that you can only walk on the street grid of the city,
|
|
// how far is the shortest path to the destination?
|
|
//
|
|
// For example:
|
|
//
|
|
// Following R2, L3 leaves you 2 blocks East and 3 blocks North, or 5 blocks away.
|
|
// R2, R2, R2 leaves you 2 blocks due South of your starting position, which is 2 blocks away.
|
|
// R5, L5, R5, R3 leaves you 12 blocks away.
|
|
// How many blocks away is Easter Bunny HQ?
|
|
//
|
|
|
|
use std::{env, fs};
|
|
use aoc::read_data;
|
|
use crate::CardinalDirection::*;
|
|
|
|
#[derive(Debug)]
|
|
enum CardinalDirection {
|
|
North,
|
|
South,
|
|
East,
|
|
West
|
|
}
|
|
|
|
fn manhattan_distance(directions: &str) -> i32 {
|
|
let (mut x_distance, mut y_distance, mut x_move, mut y_move) = (0i32,0i32, 0i32, 0i32);
|
|
let mut current_direction = North;
|
|
for next_direction in directions.split(", ") {
|
|
let (direction, vector) = next_direction.split_at(1);
|
|
let distance = vector.parse().unwrap();
|
|
// print!("[{}] At {x_distance}x{y_distance}, FACING {current_direction:?}, TURN {} MOVE {} ::::::", next_direction, direction, distance);
|
|
|
|
x_move = 0; y_move = 0;
|
|
|
|
match direction {
|
|
"R" => {
|
|
match current_direction {
|
|
North => {
|
|
current_direction = East;
|
|
x_move = distance;
|
|
}
|
|
South => {
|
|
current_direction = West;
|
|
x_move = distance * -1 ;
|
|
}
|
|
East => {
|
|
current_direction = South;
|
|
y_move = distance * -1;
|
|
}
|
|
West => {
|
|
current_direction = North;
|
|
y_move = distance;
|
|
}
|
|
}
|
|
}
|
|
"L" => {
|
|
match current_direction {
|
|
North => {
|
|
current_direction = West;
|
|
x_move = distance * -1;
|
|
}
|
|
South => {
|
|
current_direction = East;
|
|
x_move = distance;
|
|
}
|
|
East => {
|
|
current_direction = North;
|
|
y_move = distance;
|
|
}
|
|
West => {
|
|
current_direction = South;
|
|
y_move = distance * -1;
|
|
}
|
|
}
|
|
}
|
|
_ => {
|
|
println!("INVALID DIRECTION");
|
|
}
|
|
}
|
|
x_distance += x_move;
|
|
y_distance += y_move;
|
|
|
|
// println!("facing {:?} at {}x{} (moved {}x{})", current_direction, x_distance, y_distance, x_move, y_move);
|
|
}
|
|
x_distance.abs() + y_distance.abs()
|
|
}
|
|
|
|
fn main() {
|
|
let binding = read_data("2016_01_data.txt");
|
|
let directions = binding.as_str();
|
|
let parmas: Vec<(&str, i32)> = vec![
|
|
("R2, L3", 5),
|
|
("R2, R2, R2", 2),
|
|
("R5, L5, R5, R3", 12),
|
|
(directions, 252)];
|
|
|
|
for (param, expected) in parmas {
|
|
println!("Manhattan Distance of {} Expected {}", manhattan_distance(param) , expected);
|
|
}
|
|
}
|
|
|
|
// 252
|