summaryrefslogtreecommitdiff
path: root/2016/aoc8/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to '2016/aoc8/src/main.rs')
-rw-r--r--2016/aoc8/src/main.rs117
1 files changed, 117 insertions, 0 deletions
diff --git a/2016/aoc8/src/main.rs b/2016/aoc8/src/main.rs
new file mode 100644
index 0000000..cb783ae
--- /dev/null
+++ b/2016/aoc8/src/main.rs
@@ -0,0 +1,117 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+
+struct Screen {
+ data: [[bool; 6]; 50]
+}
+
+impl Screen {
+ fn new() -> Screen {
+ Screen {
+ data: [[false; 6]; 50]
+ }
+ }
+
+ fn rect(&mut self, a: usize, b: usize) {
+ for x in 0..a {
+ for y in 0..b {
+ self.data[x][y] = true;
+ }
+ }
+ }
+
+ fn rotate_row(&mut self, y: usize, b: usize) {
+ let mut row_copy = [false; 50];
+ for x in 0..50 {
+ row_copy[x] = self.data[x][y];
+ }
+ for x in 0..50 {
+ self.data[x][y] = row_copy[(x+50-b)%50];
+ }
+ }
+
+ fn rotate_col(&mut self, x: usize, b: usize) {
+ let mut col_copy = [false; 6];
+ for y in 0..6 {
+ col_copy[y] = self.data[x][y];
+ }
+ for y in 0..6 {
+ self.data[x][y] = col_copy[(y+6-b)%6];
+ }
+ }
+
+ fn print(&self) {
+ for y in 0..6 {
+ for x in 0..50 {
+ print!("{}", if self.data[x][y] {'#'} else {'.'});
+ }
+ println!("");
+ }
+ }
+
+ fn count_on(&self) -> u32 {
+ let mut count = 0;
+ for y in 0..6 {
+ for x in 0..50 {
+ if self.data[x][y] {
+ count += 1;
+ }
+ }
+ }
+ count
+ }
+}
+
+
+fn main() {
+ let lines = read_file();
+ let mut screen = Screen::new();
+ for line in lines {
+ if line.starts_with("rect") {
+ //rect 3x4
+ let re = Regex::new(r"rect (\d+)x(\d+)").unwrap();
+ let cap = re.captures(line.as_ref()).unwrap();
+ println!("{} parsed as RECT. A={}, B={}",
+ line,
+ cap.at(1).unwrap_or(""), cap.at(2).unwrap_or(""));
+ screen.rect(cap.at(1).unwrap().parse().unwrap(), cap.at(2).unwrap().parse().unwrap());
+
+ }
+ else if line.starts_with("rotate row") {
+ //rotate row y=0 by 4
+ let re = Regex::new(r"rotate row y=(\d+) by (\d+)").unwrap();
+ let cap = re.captures(line.as_ref()).unwrap();
+ println!("{} parsed as ROTATE ROW. A={}, B={}",
+ line,
+ cap.at(1).unwrap_or(""), cap.at(2).unwrap_or(""));
+ screen.rotate_row(cap.at(1).unwrap().parse().unwrap(), cap.at(2).unwrap().parse().unwrap());
+ }
+ else if line.starts_with("rotate column") {
+ //rotate column x=1 by 1
+ let re = Regex::new(r"rotate column x=(\d+) by (\d+)").unwrap();
+ let cap = re.captures(line.as_ref()).unwrap();
+ println!("{} parsed as ROTATE COLUMN. A={}, B={}",
+ line,
+ cap.at(1).unwrap_or(""), cap.at(2).unwrap_or(""));
+ screen.rotate_col(cap.at(1).unwrap().parse().unwrap(), cap.at(2).unwrap().parse().unwrap());
+
+ }
+
+ screen.print();
+ }
+
+ println!("On: {}", screen.count_on());
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}