parent
fd2ceadf02
commit
a78bb9d70a
@ -0,0 +1,173 @@
|
|||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 20
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 3
|
||||||
|
rect 2x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 3
|
||||||
|
rect 2x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 4
|
||||||
|
rect 2x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 3
|
||||||
|
rect 2x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 5
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x1
|
||||||
|
rotate row y=0 by 6
|
||||||
|
rect 5x1
|
||||||
|
rotate row y=0 by 2
|
||||||
|
rect 1x3
|
||||||
|
rotate row y=2 by 8
|
||||||
|
rotate row y=0 by 8
|
||||||
|
rotate column x=0 by 1
|
||||||
|
rect 7x1
|
||||||
|
rotate row y=2 by 24
|
||||||
|
rotate row y=0 by 20
|
||||||
|
rotate column x=5 by 1
|
||||||
|
rotate column x=4 by 2
|
||||||
|
rotate column x=2 by 2
|
||||||
|
rotate column x=0 by 1
|
||||||
|
rect 7x1
|
||||||
|
rotate column x=34 by 2
|
||||||
|
rotate column x=22 by 1
|
||||||
|
rotate column x=15 by 1
|
||||||
|
rotate row y=2 by 18
|
||||||
|
rotate row y=0 by 12
|
||||||
|
rotate column x=8 by 2
|
||||||
|
rotate column x=7 by 1
|
||||||
|
rotate column x=5 by 2
|
||||||
|
rotate column x=2 by 1
|
||||||
|
rotate column x=0 by 1
|
||||||
|
rect 9x1
|
||||||
|
rotate row y=3 by 28
|
||||||
|
rotate row y=1 by 28
|
||||||
|
rotate row y=0 by 20
|
||||||
|
rotate column x=18 by 1
|
||||||
|
rotate column x=15 by 1
|
||||||
|
rotate column x=14 by 1
|
||||||
|
rotate column x=13 by 1
|
||||||
|
rotate column x=12 by 2
|
||||||
|
rotate column x=10 by 3
|
||||||
|
rotate column x=8 by 1
|
||||||
|
rotate column x=7 by 2
|
||||||
|
rotate column x=6 by 1
|
||||||
|
rotate column x=5 by 1
|
||||||
|
rotate column x=3 by 1
|
||||||
|
rotate column x=2 by 2
|
||||||
|
rotate column x=0 by 1
|
||||||
|
rect 19x1
|
||||||
|
rotate column x=34 by 2
|
||||||
|
rotate column x=24 by 1
|
||||||
|
rotate column x=23 by 1
|
||||||
|
rotate column x=14 by 1
|
||||||
|
rotate column x=9 by 2
|
||||||
|
rotate column x=4 by 2
|
||||||
|
rotate row y=3 by 5
|
||||||
|
rotate row y=2 by 3
|
||||||
|
rotate row y=1 by 7
|
||||||
|
rotate row y=0 by 5
|
||||||
|
rotate column x=0 by 2
|
||||||
|
rect 3x2
|
||||||
|
rotate column x=16 by 2
|
||||||
|
rotate row y=3 by 27
|
||||||
|
rotate row y=2 by 5
|
||||||
|
rotate row y=0 by 20
|
||||||
|
rotate column x=8 by 2
|
||||||
|
rotate column x=7 by 1
|
||||||
|
rotate column x=5 by 1
|
||||||
|
rotate column x=3 by 3
|
||||||
|
rotate column x=2 by 1
|
||||||
|
rotate column x=1 by 2
|
||||||
|
rotate column x=0 by 1
|
||||||
|
rect 9x1
|
||||||
|
rotate row y=4 by 42
|
||||||
|
rotate row y=3 by 40
|
||||||
|
rotate row y=1 by 30
|
||||||
|
rotate row y=0 by 40
|
||||||
|
rotate column x=37 by 2
|
||||||
|
rotate column x=36 by 3
|
||||||
|
rotate column x=35 by 1
|
||||||
|
rotate column x=33 by 1
|
||||||
|
rotate column x=32 by 1
|
||||||
|
rotate column x=31 by 3
|
||||||
|
rotate column x=30 by 1
|
||||||
|
rotate column x=28 by 1
|
||||||
|
rotate column x=27 by 1
|
||||||
|
rotate column x=25 by 1
|
||||||
|
rotate column x=23 by 3
|
||||||
|
rotate column x=22 by 1
|
||||||
|
rotate column x=21 by 1
|
||||||
|
rotate column x=20 by 1
|
||||||
|
rotate column x=18 by 1
|
||||||
|
rotate column x=17 by 1
|
||||||
|
rotate column x=16 by 3
|
||||||
|
rotate column x=15 by 1
|
||||||
|
rotate column x=13 by 1
|
||||||
|
rotate column x=12 by 1
|
||||||
|
rotate column x=11 by 2
|
||||||
|
rotate column x=10 by 1
|
||||||
|
rotate column x=8 by 1
|
||||||
|
rotate column x=7 by 2
|
||||||
|
rotate column x=5 by 1
|
||||||
|
rotate column x=3 by 3
|
||||||
|
rotate column x=2 by 1
|
||||||
|
rotate column x=1 by 1
|
||||||
|
rotate column x=0 by 1
|
||||||
|
rect 39x1
|
||||||
|
rotate column x=44 by 2
|
||||||
|
rotate column x=42 by 2
|
||||||
|
rotate column x=35 by 5
|
||||||
|
rotate column x=34 by 2
|
||||||
|
rotate column x=32 by 2
|
||||||
|
rotate column x=29 by 2
|
||||||
|
rotate column x=25 by 5
|
||||||
|
rotate column x=24 by 2
|
||||||
|
rotate column x=19 by 2
|
||||||
|
rotate column x=15 by 4
|
||||||
|
rotate column x=14 by 2
|
||||||
|
rotate column x=12 by 3
|
||||||
|
rotate column x=9 by 2
|
||||||
|
rotate column x=5 by 5
|
||||||
|
rotate column x=4 by 2
|
||||||
|
rotate row y=5 by 5
|
||||||
|
rotate row y=4 by 38
|
||||||
|
rotate row y=3 by 10
|
||||||
|
rotate row y=2 by 46
|
||||||
|
rotate row y=1 by 10
|
||||||
|
rotate column x=48 by 4
|
||||||
|
rotate column x=47 by 3
|
||||||
|
rotate column x=46 by 3
|
||||||
|
rotate column x=45 by 1
|
||||||
|
rotate column x=43 by 1
|
||||||
|
rotate column x=37 by 5
|
||||||
|
rotate column x=36 by 5
|
||||||
|
rotate column x=35 by 4
|
||||||
|
rotate column x=33 by 1
|
||||||
|
rotate column x=32 by 5
|
||||||
|
rotate column x=31 by 5
|
||||||
|
rotate column x=28 by 5
|
||||||
|
rotate column x=27 by 5
|
||||||
|
rotate column x=26 by 3
|
||||||
|
rotate column x=25 by 4
|
||||||
|
rotate column x=23 by 1
|
||||||
|
rotate column x=17 by 5
|
||||||
|
rotate column x=16 by 5
|
||||||
|
rotate column x=13 by 1
|
||||||
|
rotate column x=12 by 5
|
||||||
|
rotate column x=11 by 5
|
||||||
|
rotate column x=3 by 1
|
||||||
|
rotate column x=0 by 1
|
@ -0,0 +1,149 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
use errors::*;
|
||||||
|
|
||||||
|
pub fn solve(input: &str) -> Result<String> {
|
||||||
|
let rect_re = Regex::new(r"rect (\d+)x(\d+)").unwrap();
|
||||||
|
let rotate_re = Regex::new(r"rotate (column x|row y)=(\d+) by (\d+)").unwrap();
|
||||||
|
|
||||||
|
let mut screen = Screen::new(50, 6);
|
||||||
|
for line in input.lines() {
|
||||||
|
if let Some(caps) = rect_re.captures(line) {
|
||||||
|
screen.rect(caps[1].parse().unwrap(), caps[2].parse().unwrap());
|
||||||
|
} else if let Some(caps) = rotate_re.captures(line) {
|
||||||
|
let index = caps[2].parse().unwrap();
|
||||||
|
let count = caps[3].parse().unwrap();
|
||||||
|
if &caps[1] == "column x" {
|
||||||
|
screen.rotate_col(index, count);
|
||||||
|
} else if &caps[1] == "row y" {
|
||||||
|
screen.rotate_row(index, count);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Err(format!("unexpected input: '{}'", line).into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(format!("{}", screen.pixels.iter().filter(|&(_, &v)| v).count()))
|
||||||
|
// Ok(format!("{}", screen))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq,Hash,PartialEq)]
|
||||||
|
struct Point(usize, usize);
|
||||||
|
|
||||||
|
type Pixel = bool;
|
||||||
|
|
||||||
|
pub struct Screen {
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
pixels: HashMap<Point, Pixel>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Screen {
|
||||||
|
fn new(width: usize, height: usize) -> Self {
|
||||||
|
Screen {
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
pixels: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rect(&mut self, x: usize, y: usize) {
|
||||||
|
for x in 0..x {
|
||||||
|
for y in 0..y {
|
||||||
|
self.pixels.insert(Point(x, y), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rotate_col(&mut self, index: usize, count: usize) {
|
||||||
|
let count = count % self.height;
|
||||||
|
|
||||||
|
let mut col = (0..self.height)
|
||||||
|
.map(|y| self.pixels.get(&Point(index, y)).cloned().unwrap_or(false))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let col = Self::rotate(&mut col, count);
|
||||||
|
|
||||||
|
for (y, &pixel) in col.iter().enumerate() {
|
||||||
|
self.pixels.insert(Point(index, y), pixel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rotate_row(&mut self, index: usize, count: usize) {
|
||||||
|
let count = count % self.width;
|
||||||
|
|
||||||
|
let mut row = (0..self.width)
|
||||||
|
.map(|x| self.pixels.get(&Point(x, index)).cloned().unwrap_or(false))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let row = Self::rotate(&mut row, count);
|
||||||
|
|
||||||
|
for (x, &pixel) in row.iter().enumerate() {
|
||||||
|
self.pixels.insert(Point(x, index), pixel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rotate<T: Clone>(v: &mut Vec<T>, count: usize) -> Vec<T> {
|
||||||
|
let count = v.len() - count - 1;
|
||||||
|
v[(count + 1)..].iter().chain(v[0...count].iter()).cloned().collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Screen {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
let s = (0..self.height)
|
||||||
|
.map(|y| {
|
||||||
|
(0..self.width)
|
||||||
|
.map(|x| {
|
||||||
|
if self.pixels.get(&Point(x, y)).cloned().unwrap_or(false) {
|
||||||
|
'#'
|
||||||
|
} else {
|
||||||
|
'.'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<String>()
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join("\n");
|
||||||
|
write!(f, "{}", s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_screen() {
|
||||||
|
let mut screen = Screen::new(7, 3);
|
||||||
|
assert_eq!(format!("{}", screen),
|
||||||
|
".......
|
||||||
|
.......
|
||||||
|
.......");
|
||||||
|
|
||||||
|
screen.rect(3, 2);
|
||||||
|
assert_eq!(format!("{}", screen),
|
||||||
|
"###....
|
||||||
|
###....
|
||||||
|
.......");
|
||||||
|
|
||||||
|
screen.rotate_col(1, 1);
|
||||||
|
assert_eq!(format!("{}", screen),
|
||||||
|
"#.#....
|
||||||
|
###....
|
||||||
|
.#.....");
|
||||||
|
|
||||||
|
screen.rotate_row(0, 4);
|
||||||
|
assert_eq!(format!("{}", screen),
|
||||||
|
"....#.#
|
||||||
|
###....
|
||||||
|
.#.....");
|
||||||
|
|
||||||
|
screen.rotate_col(1, 1);
|
||||||
|
assert_eq!(format!("{}", screen),
|
||||||
|
".#..#.#
|
||||||
|
#.#....
|
||||||
|
.#.....");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue