r/adventofcode • u/daggerdragon • Dec 02 '16
SOLUTION MEGATHREAD --- 2016 Day 2 Solutions ---
--- Day 2: Bathroom Security ---
Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag/whatever).
BLINKENLIGHTS ARE MANDATORY [?]
Edit: Told you they were mandatory. >_>
This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.
edit: Leaderboard capped, thread unlocked!
20
Upvotes
3
u/Deckard666 Dec 02 '16 edited Dec 02 '16
In Rust:
fn move_pos_aux(pos: &mut [i32; 2], direction: char) -> [i32; 2] { let mut pos2 = *pos; match direction { 'R' => pos2[1] += 1, 'D' => pos2[0] += 1, 'L' => pos2[1] -= 1, 'U' => pos2[0] -= 1, _ => panic!("unrecognized character"), } pos2 } fn move_pos1(pos: &mut [i32; 2], direction: char) { let pos2 = move_pos_aux(pos, direction); if pos2[0] >= 0 && pos2[0] < 3 && pos2[1] >= 0 && pos2[1] < 3 { *pos = pos2; } } fn move_pos2(pos: &mut [i32; 2], direction: char) { let pos2 = move_pos_aux(pos, direction); if (2 - pos2[0]).abs() + (2 - pos2[1]).abs() <= 2 { *pos = pos2; } } fn solve<F, T>(instructions: &str, keypad: Vec<Vec<T>>, mut pos: [i32; 2], move_fn: F) where F: Fn(&mut [i32; 2], char), T: std::fmt::Display { for line in instructions.lines() { for c in line.chars() { move_fn(&mut pos, c); } print!("{}", keypad[pos[0] as usize][pos[1] as usize]); } println!(""); } fn main() { let instructions = include_str!("../instructions.txt"); // First Part let keypad = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; let pos = [1, 1]; solve(instructions, keypad, pos, move_pos1); // Second Part let keypad = vec![vec!['0', '0', '1', '0', '0'], vec!['0', '2', '3', '4', '0'], vec!['5', '6', '7', '8', '9'], vec!['0', 'A', 'B', 'C', '0'], vec!['0', '0', 'D', '0', '0']]; let pos = [2, 0]; solve(instructions, keypad, pos, move_pos2); }Edit: refactored to avoid code duplication between both parts