AOC13
[advent-of-code-2016.git] / aoc13 / src / main.rs
1 extern crate regex;
2 use regex::Regex;
3
4 use std::io::BufReader;
5 use std::io::prelude::*;
6 use std::fs::File;
7 use std::collections::HashMap;
8
9 fn main() {
10     //let target = (7, 4);
11     let target = (31,39);
12
13     let mut states: HashMap<(i32, i32), u32> = HashMap::new();
14     states.insert((1, 1), 0);
15     let mut moves = 0;
16     while moves < 50 {
17 /*        if states.iter().any(|(&state, _)| state == target) {
18             break;
19         }
20 */
21         let new_states: Vec<(i32, i32)> = states.iter().filter(|&(_, &x)| x == moves).flat_map(|(state, _)| available_steps(state)).collect();
22
23         moves += 1;
24
25         for state in new_states {
26             if !states.contains_key(&state) {
27                 states.insert(state, moves);
28             }
29         }
30     }
31
32     println!("Moves required: {}", moves);
33     println!("Possible destinations: {}", states.iter().count()); 
34 }
35
36
37 fn available_steps(current: &(i32, i32)) -> Vec<(i32, i32)> {
38     let &(x0, y0) = current;
39     let mut results = Vec::new();
40     for &(x, y) in [(x0-1, y0), (x0+1, y0), (x0, y0-1), (x0, y0+1)].iter() {
41         if x >= 0 && y >= 0 && !is_wall(x, y) {
42             results.push((x, y));
43         }
44     }
45     results
46 }
47
48 fn print_map() {
49     for y in 0..10 {
50         for x in 0..10 {
51             print!("{}", if is_wall(x, y) {'#'} else {'.'});
52         }
53         println!("");
54     }
55 }
56
57 fn is_wall(x: i32, y: i32) -> bool {
58 //    let favourite_number = 10;
59     let favourite_number = 1352;
60     let funny_num = x*x + 3*x + 2*x*y + y + y*y + favourite_number;
61     let bin = format!("{:b}", funny_num);
62     let number_of_ones = bin.chars().filter(|&c| c == '1').count();
63     number_of_ones % 2 == 1
64 }