Advertisement
Guest User

problem 8

a guest
Dec 8th, 2016
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.36 KB | None | 0 0
  1. /// advent of code
  2. ///
  3. /// problem 8
  4. ///
  5.  
  6. pub static PROBLEM_NUMBER: &'static str = "8a";
  7.  
  8. use std::cmp::{min};
  9. use std::fmt;
  10. use std::thread;
  11. use std::time::Duration;
  12.  
  13. use term;
  14.  
  15. #[derive(Debug)]
  16. struct Display {
  17.    pub width: usize,
  18.    pub height: usize,
  19.    data: Vec<bool>,
  20. }
  21.  
  22. impl fmt::Display for Display {
  23.    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  24.        let mut output = String::new();
  25.        for x in 0..self.data.len() {
  26.            if x % self.width == 0 { output.push('\n'); }
  27.            
  28.            let ch = if self.data[x] { '\u{2588}' } else { ' ' };
  29.            output.push(ch);
  30.        }
  31.  
  32.        write!(f, "{}", output)
  33.    }
  34. }
  35.  
  36. impl Display {
  37.    fn new(width: usize, height: usize) -> Self {
  38.        Display {
  39.            width: width,
  40.            height: height,
  41.            data: vec![false; width * height],
  42.        }
  43.    }
  44.  
  45.    fn rect(&mut self, width: usize, height: usize) {
  46.        let (width, height) = (min(width, self.width), min(height, self.height));
  47.  
  48.        for x in 0..height {
  49.            for y in 0..width {
  50.                self.data[self.width * x + y] = true;
  51.            }
  52.        }
  53.    }
  54.  
  55.    fn rotate_col(&mut self, col: usize, amount: usize) {
  56.        let col_vec: Vec<_> = self.data.iter().enumerate()
  57.                                   .filter(|&(i, _)| i % self.width == col)
  58.                                   .map(|(_, c)| c).cloned().collect();
  59.  
  60.        for x in 0 .. self.height {
  61.            self.data[ (self.width * (x + amount) + col) % (self.width * self.height) ] = col_vec[x];
  62.        }
  63.    }
  64.  
  65.    fn rotate_row(&mut self, row: usize, amount: usize) {
  66.        let row_vec: Vec<_> = self.data.iter().skip( self.width * row )
  67.                                              .take( self.width )
  68.                                              .cloned().collect();
  69.  
  70.        for y in 0 .. self.width {
  71.            self.data[ self.width * row + ((y + amount) % self.width) ] = row_vec[y];
  72.        }
  73.    }
  74.  
  75.    fn get_lit(&self) -> usize {
  76.        self.data.iter().filter(|&&x| x).count()
  77.    }
  78. }
  79.  
  80.  
  81.  
  82. pub fn adv_main(input: Vec<String>) {
  83.  
  84.    let mut screen = Display::new(50, 6);
  85.    let mut t = term::stdout().unwrap();
  86.    t.fg(term::color::BRIGHT_GREEN).unwrap();
  87.    //t.bg(term::color::RED).unwrap();
  88.    writeln!(t, "{}", screen).unwrap();
  89.  
  90.    for line in input {
  91.        let words: Vec<_> = line.split(" ").collect();
  92.  
  93.        match words[0] {
  94.            "rect" => {
  95.                let dimensions: Vec<usize> = words[1].split("x").map(|x| x.parse().unwrap()).collect();
  96.                screen.rect(dimensions[0], dimensions[1]);
  97.            },
  98.            "rotate" => {
  99.                let (dir, line) = words[2].split_at(2);
  100.                let line = line.parse().unwrap();
  101.                let shift = words[4].parse().unwrap();
  102.  
  103.                if dir.starts_with("x") {
  104.                    screen.rotate_col(line, shift);
  105.                } else {
  106.                    screen.rotate_row(line, shift);
  107.                }  
  108.            },
  109.            _ => {}
  110.        }
  111.  
  112.        for _ in 0..(screen.height+1) {
  113.            t.cursor_up().unwrap();
  114.        }
  115.  
  116.        writeln!(t, "{}", screen).unwrap();
  117.  
  118.        thread::sleep(Duration::from_millis(100));
  119.    }
  120.  
  121.    t.reset().unwrap();
  122.    println!("lit pixels: {}", screen.get_lit());
  123.  
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement