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