Advertisement
Guest User

aoc18

a guest
Dec 30th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.66 KB | None | 0 0
  1. use std::io::{BufReader};
  2. use std::io::prelude::*;
  3. use std::fs::File;
  4. use std::collections::HashMap;
  5.  
  6. fn nextstate(neighbours: &[char], c: char) -> char {
  7.     //println!("nextstate {:?} {:?}",c, neighbours);
  8.     match c {
  9.         '.'=> if neighbours.iter().cloned().filter(|&d| d == '|').count() >=3 { '|' } else { '.' },
  10.         '|'=> if neighbours.iter().cloned().filter(|&d| d == '#').count() >=3 { '#' } else { '|' },
  11.         '#'=> if neighbours.iter().cloned().filter(|&d| d == '|').count() >=1 &&
  12.              neighbours.iter().cloned().filter(|&d| d == '#').count() >=1 { '#' } else { '.' },
  13.         _ => unreachable!("bad char {}", c)
  14.     }
  15. }
  16.  
  17. fn neighbours(map: &[[char;50];50], pos: (usize,usize)) -> Vec<(char)> {
  18.     [(-1,-1), (0,-1),(1,-1),
  19.      (-1, 0),        (1, 0),
  20.      (-1, 1), (0, 1),(1, 1)]
  21.          .iter().map(|poo| (poo.0+pos.0 as isize, poo.1+pos.1 as isize) )
  22.     .filter(|pos| pos.0 >= 0 && pos.0<50 && pos.1 >=0 && pos.1 < 50)
  23.     .map(|pos| (map[pos.0 as usize][pos.1 as usize])).collect::<Vec<_>>()
  24. }
  25.  
  26. fn main() {
  27.  
  28.     let mut map = [['.'; 50];50];
  29.     let f = File::open("/tmp/input").unwrap();
  30.     let f = BufReader::new(f);
  31.  
  32.     for (i,line) in f.lines().enumerate() {
  33.         let line = line.unwrap();
  34.         for (j,c) in line.chars().enumerate() {
  35.             map[i][j] = c;
  36.         }
  37.     }
  38.  
  39. //  for l in map.iter() {
  40. //      for c in l.iter() {
  41. //          print!("{}",c);
  42. //      }
  43. //      println!();
  44. //  }  
  45. //      println!();
  46.     let mut othermap = [['.'; 50];50];
  47.     let mut mapstates = HashMap::<Vec<char>, usize>::new();
  48.     let mut mapidx = HashMap::<usize, Vec<char>>::new();
  49.     let mut loopend = 0;
  50.     let mut loopstart = 0;
  51.     for t in 0..1000{
  52.  
  53.         if t % 2 == 0 {
  54.             let key = map.iter().map(|a| a.iter().cloned()).flatten().collect::<Vec<_>>();
  55.             if mapstates.contains_key(&key) {
  56.                 loopend = t;
  57.                 loopstart = *(mapstates.get(&key).unwrap());
  58.                 println!("loop! {} {}", loopstart, loopend);
  59.                 break;
  60.             } else {
  61.                 mapstates.insert(map.iter().map(|a| a.iter().cloned()).flatten().collect(), t);
  62.                 mapidx.insert(t, map.iter().map(|a| a.iter().cloned()).flatten().collect());
  63.             }
  64.             for i in 0..50 {
  65.                 for j in 0..50 {
  66.                     othermap[i][j] = nextstate(&neighbours(&map, (i,j)), map[i][j]);
  67.                 }
  68.             }
  69.             //for i in 0..50 {
  70.             //  println!("");
  71.             //}
  72.             //println!("map");
  73.             //for l in othermap.iter() {
  74.             //  for c in l.iter() {
  75.             //      print!("{}",c);
  76.             //  }
  77.             //  println!();
  78.             //}
  79.             //println!();
  80.         } else {
  81.             let key = othermap.iter().map(|a| a.iter().cloned()).flatten().collect::<Vec<_>>();
  82.             if mapstates.contains_key(&key) {
  83.                 loopend = t;
  84.                 loopstart = *(mapstates.get(&key).unwrap());
  85.                 println!("loop! {} {}", loopstart, loopend);
  86.                 break;
  87.             } else {
  88.                 mapstates.insert(othermap.iter().map(|a| a.iter().cloned()).flatten().collect(), t);
  89.                 mapidx.insert(t, othermap.iter().map(|a| a.iter().cloned()).flatten().collect());
  90.             }
  91.             for i in 0..50 {
  92.                 for j in 0..50 {
  93.                     map[i][j] = nextstate(&neighbours(&othermap, (i,j)), othermap[i][j]);
  94.                 }
  95.             }
  96.             //for i in 0..50 {
  97.             //  println!("");
  98.             //}
  99.             //println!("map");
  100.             //for l in map.iter() {
  101.             //  for c in l.iter() {
  102.             //      print!("{}",c);
  103.             //  }
  104.             //  println!();
  105.             //}
  106.             //println!();
  107.         }
  108.     }
  109.     let cycle_length = loopend - loopstart;
  110.     let nb_cycle = (1000000000-loopstart) / cycle_length;
  111.     let final_idx = 1000000000 - (loopstart + nb_cycle*cycle_length) + loopstart;
  112.     println!("cycle length {} nb cycle {} final idx : {}", cycle_length, nb_cycle, final_idx);
  113.     let mut counttree = 0;
  114.     let mut countlumb = 0;
  115.     for &c in mapidx.get(&final_idx).unwrap().iter() {
  116.             if c == '|' {
  117.                 counttree = counttree+1;
  118.             }
  119.             if c == '#' {
  120.                 countlumb = countlumb+1;
  121.             }
  122.         }
  123.     println!("{}", counttree*countlumb);
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement