Formatting cleanups.
This commit is contained in:
@@ -48,7 +48,9 @@ impl ConwayCube {
|
|||||||
for z in z_range.clone() {
|
for z in z_range.clone() {
|
||||||
let active_neighbors = self.active_neighbors(x, y, z);
|
let active_neighbors = self.active_neighbors(x, y, z);
|
||||||
|
|
||||||
if (self.is_active(x, y, z) && (active_neighbors == 2 || active_neighbors == 3)) || self.active_neighbors(x, y, z) == 3 {
|
if (self.is_active(x, y, z) && (active_neighbors == 2 || active_neighbors == 3))
|
||||||
|
|| self.active_neighbors(x, y, z) == 3
|
||||||
|
{
|
||||||
active_points.insert((x, y, z));
|
active_points.insert((x, y, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,7 +194,9 @@ impl Conway4Cube {
|
|||||||
for w in w_range.clone() {
|
for w in w_range.clone() {
|
||||||
let active_neighbors = self.active_neighbors(x, y, z, w);
|
let active_neighbors = self.active_neighbors(x, y, z, w);
|
||||||
|
|
||||||
if (self.is_active(x, y, z, w) && (active_neighbors == 2 || active_neighbors == 3)) || self.active_neighbors(x, y, z, w) == 3
|
if (self.is_active(x, y, z, w)
|
||||||
|
&& (active_neighbors == 2 || active_neighbors == 3))
|
||||||
|
|| self.active_neighbors(x, y, z, w) == 3
|
||||||
{
|
{
|
||||||
active_points.insert((x, y, z, w));
|
active_points.insert((x, y, z, w));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,12 @@ enum Modification {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Tile {
|
impl Tile {
|
||||||
fn new(identity: usize, history: Vec<Modification>, edge_length: usize, raw_data: Vec<bool>) -> Tile {
|
fn new(
|
||||||
|
identity: usize,
|
||||||
|
history: Vec<Modification>,
|
||||||
|
edge_length: usize,
|
||||||
|
raw_data: Vec<bool>,
|
||||||
|
) -> Tile {
|
||||||
let mut res = Tile {
|
let mut res = Tile {
|
||||||
identity,
|
identity,
|
||||||
history,
|
history,
|
||||||
@@ -58,15 +63,17 @@ impl Tile {
|
|||||||
|
|
||||||
for i in 0..edge_length {
|
for i in 0..edge_length {
|
||||||
res.top = (res.top << 1) | res.get_value(i, 0);
|
res.top = (res.top << 1) | res.get_value(i, 0);
|
||||||
res.bottom = (res.bottom << 1) | res.get_value(i, edge_length-1);
|
res.bottom = (res.bottom << 1) | res.get_value(i, edge_length - 1);
|
||||||
res.left = (res.left << 1) | res.get_value(0, i);
|
res.left = (res.left << 1) | res.get_value(0, i);
|
||||||
res.right = (res.right << 1) | res.get_value(edge_length-1, i);
|
res.right = (res.right << 1) | res.get_value(edge_length - 1, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read<'a, I: Iterator<Item = &'a str>>(lines: &mut I) -> Result<Option<Tile>, TileParseError> {
|
fn read<'a, I: Iterator<Item = &'a str>>(
|
||||||
|
lines: &mut I,
|
||||||
|
) -> Result<Option<Tile>, TileParseError> {
|
||||||
match lines.next() {
|
match lines.next() {
|
||||||
None => Ok(None),
|
None => Ok(None),
|
||||||
Some("") => Tile::read(lines),
|
Some("") => Tile::read(lines),
|
||||||
@@ -115,7 +122,7 @@ impl Tile {
|
|||||||
|
|
||||||
fn set(&mut self, x: usize, y: usize, v: bool) {
|
fn set(&mut self, x: usize, y: usize, v: bool) {
|
||||||
self.raw_data[(y * self.edge_length) + x] = v;
|
self.raw_data[(y * self.edge_length) + x] = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw(&self) {
|
fn draw(&self) {
|
||||||
println!("Tile {} [{:?}]:", self.identity, self.history);
|
println!("Tile {} [{:?}]:", self.identity, self.history);
|
||||||
@@ -222,20 +229,16 @@ impl Tile {
|
|||||||
#[test]
|
#[test]
|
||||||
fn flip_x_test() {
|
fn flip_x_test() {
|
||||||
let raw_data = vec![
|
let raw_data = vec![
|
||||||
true, false, true, false,
|
true, false, true, false, true, true, true, true, false, false, true, true, false, false,
|
||||||
true, true, true, true,
|
false, false,
|
||||||
false, false, true, true,
|
|
||||||
false, false, false, false,
|
|
||||||
];
|
];
|
||||||
let edge_length = 4;
|
let edge_length = 4;
|
||||||
let identity = 1;
|
let identity = 1;
|
||||||
let original = Tile::new(identity, vec![], edge_length, raw_data);
|
let original = Tile::new(identity, vec![], edge_length, raw_data);
|
||||||
let flipped = vec![
|
let flipped = vec![
|
||||||
false, false, false, false,
|
false, false, false, false, false, false, true, true, true, true, true, true, true, false,
|
||||||
false, false, true, true,
|
true, false,
|
||||||
true, true, true, true,
|
];
|
||||||
true, false, true, false,
|
|
||||||
];
|
|
||||||
|
|
||||||
assert_eq!(flipped, original.flip_over_x().raw_data);
|
assert_eq!(flipped, original.flip_over_x().raw_data);
|
||||||
}
|
}
|
||||||
@@ -243,29 +246,30 @@ fn flip_x_test() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn flip_y_test() {
|
fn flip_y_test() {
|
||||||
let raw_data = vec![
|
let raw_data = vec![
|
||||||
true, false, true, false,
|
true, false, true, false, true, true, true, true, false, false, true, true, false, false,
|
||||||
true, true, true, true,
|
false, false,
|
||||||
false, false, true, true,
|
|
||||||
false, false, false, false,
|
|
||||||
];
|
];
|
||||||
let edge_length = 4;
|
let edge_length = 4;
|
||||||
let identity = 1;
|
let identity = 1;
|
||||||
let original = Tile::new(identity, vec![], edge_length, raw_data);
|
let original = Tile::new(identity, vec![], edge_length, raw_data);
|
||||||
let flipped = vec![
|
let flipped = vec![
|
||||||
false, true, false, true,
|
false, true, false, true, true, true, true, true, true, true, false, false, false, false,
|
||||||
true, true, true, true,
|
false, false,
|
||||||
true, true, false, false,
|
];
|
||||||
false, false, false, false,
|
|
||||||
];
|
|
||||||
|
|
||||||
assert_eq!(flipped, original.flip_over_y().raw_data);
|
assert_eq!(flipped, original.flip_over_y().raw_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rotate_test() {
|
fn rotate_test() {
|
||||||
let original = Tile::new(0, vec![], 3, vec![true, true, true, false, false, false, true, true, true]);
|
let original = Tile::new(
|
||||||
|
0,
|
||||||
|
vec![],
|
||||||
|
3,
|
||||||
|
vec![true, true, true, false, false, false, true, true, true],
|
||||||
|
);
|
||||||
let rotated = vec![true, false, true, true, false, true, true, false, true];
|
let rotated = vec![true, false, true, true, false, true, true, false, true];
|
||||||
assert_eq!(rotated, original.rotate().raw_data);
|
assert_eq!(rotated, original.rotate().raw_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -288,15 +292,24 @@ fn next_to_tests() {
|
|||||||
let tile2473 = tiles.get(&2473).unwrap().flip_over_y().rotate();
|
let tile2473 = tiles.get(&2473).unwrap().flip_over_y().rotate();
|
||||||
let tile1171 = tiles.get(&1171).unwrap().flip_over_y();
|
let tile1171 = tiles.get(&1171).unwrap().flip_over_y();
|
||||||
|
|
||||||
tile1951.draw(); println!();
|
tile1951.draw();
|
||||||
tile2729.draw(); println!();
|
println!();
|
||||||
tile2971.draw(); println!();
|
tile2729.draw();
|
||||||
tile2311.draw(); println!();
|
println!();
|
||||||
tile1427.draw(); println!();
|
tile2971.draw();
|
||||||
tile1489.draw(); println!();
|
println!();
|
||||||
tile3079.draw(); println!();
|
tile2311.draw();
|
||||||
tile2473.draw(); println!();
|
println!();
|
||||||
tile1171.draw(); println!();
|
tile1427.draw();
|
||||||
|
println!();
|
||||||
|
tile1489.draw();
|
||||||
|
println!();
|
||||||
|
tile3079.draw();
|
||||||
|
println!();
|
||||||
|
tile2473.draw();
|
||||||
|
println!();
|
||||||
|
tile1171.draw();
|
||||||
|
println!();
|
||||||
|
|
||||||
// above tests
|
// above tests
|
||||||
assert!(tile1951.can_be_above(&tile2729));
|
assert!(tile1951.can_be_above(&tile2729));
|
||||||
@@ -355,11 +368,11 @@ impl Board {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get(&self, x: usize, y: usize) -> &[Tile] {
|
fn get(&self, x: usize, y: usize) -> &[Tile] {
|
||||||
&self.raw_data[ (y * self.edge_length) + x ]
|
&self.raw_data[(y * self.edge_length) + x]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set(&mut self, x: usize, y: usize, v: Vec<Tile>) {
|
fn set(&mut self, x: usize, y: usize, v: Vec<Tile>) {
|
||||||
self.raw_data[ (y * self.edge_length) + x ] = v;
|
self.raw_data[(y * self.edge_length) + x] = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_status(&self) {
|
fn print_status(&self) {
|
||||||
@@ -382,19 +395,31 @@ impl Board {
|
|||||||
let mut all_ok = true;
|
let mut all_ok = true;
|
||||||
|
|
||||||
if x > 0 {
|
if x > 0 {
|
||||||
all_ok &= self.get(x-1, y).iter().any(|other| possible.can_be_right_of(other));
|
all_ok &= self
|
||||||
|
.get(x - 1, y)
|
||||||
|
.iter()
|
||||||
|
.any(|other| possible.can_be_right_of(other));
|
||||||
}
|
}
|
||||||
|
|
||||||
if y > 0 {
|
if y > 0 {
|
||||||
all_ok &= self.get(x, y-1).iter().any(|other| possible.can_be_below(other));
|
all_ok &= self
|
||||||
|
.get(x, y - 1)
|
||||||
|
.iter()
|
||||||
|
.any(|other| possible.can_be_below(other));
|
||||||
}
|
}
|
||||||
|
|
||||||
if x + 1 != self.edge_length {
|
if x + 1 != self.edge_length {
|
||||||
all_ok &= self.get(x+1, y).iter().any(|other| possible.can_be_left_of(other));
|
all_ok &= self
|
||||||
|
.get(x + 1, y)
|
||||||
|
.iter()
|
||||||
|
.any(|other| possible.can_be_left_of(other));
|
||||||
}
|
}
|
||||||
|
|
||||||
if y + 1 != self.edge_length {
|
if y + 1 != self.edge_length {
|
||||||
all_ok &= self.get(x, y+1).iter().any(|other| possible.can_be_above(other));
|
all_ok &= self
|
||||||
|
.get(x, y + 1)
|
||||||
|
.iter()
|
||||||
|
.any(|other| possible.can_be_above(other));
|
||||||
}
|
}
|
||||||
|
|
||||||
if all_ok {
|
if all_ok {
|
||||||
@@ -419,10 +444,10 @@ impl Board {
|
|||||||
|
|
||||||
for x in 0..self.edge_length {
|
for x in 0..self.edge_length {
|
||||||
for y in 0..self.edge_length {
|
for y in 0..self.edge_length {
|
||||||
if self.get(x,y).len() < possibilities {
|
if self.get(x, y).len() < possibilities {
|
||||||
split_x = x;
|
split_x = x;
|
||||||
split_y = y;
|
split_y = y;
|
||||||
possibilities = self.get(x,y).len();
|
possibilities = self.get(x, y).len();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -432,7 +457,11 @@ impl Board {
|
|||||||
possible_board.set(split_x, split_y, vec![split_value.clone()]);
|
possible_board.set(split_x, split_y, vec![split_value.clone()]);
|
||||||
while possible_board.reduce() {}
|
while possible_board.reduce() {}
|
||||||
if possible_board.raw_data.iter().all(|x| x.len() == 1) {
|
if possible_board.raw_data.iter().all(|x| x.len() == 1) {
|
||||||
let mut idents: Vec<usize> = possible_board.raw_data.iter().map(|x| x[0].identity).collect();
|
let mut idents: Vec<usize> = possible_board
|
||||||
|
.raw_data
|
||||||
|
.iter()
|
||||||
|
.map(|x| x[0].identity)
|
||||||
|
.collect();
|
||||||
let orig_length = idents.len();
|
let orig_length = idents.len();
|
||||||
idents.sort();
|
idents.sort();
|
||||||
idents.dedup();
|
idents.dedup();
|
||||||
@@ -481,23 +510,29 @@ impl From<Board> for Image {
|
|||||||
let height = edge_length;
|
let height = edge_length;
|
||||||
|
|
||||||
raw_data.resize(edge_length * edge_length, Pixel::Empty);
|
raw_data.resize(edge_length * edge_length, Pixel::Empty);
|
||||||
let mut result = Image { width, height, raw_data };
|
let mut result = Image {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
raw_data,
|
||||||
|
};
|
||||||
|
|
||||||
for board_y in 0..board_edge_length {
|
for board_y in 0..board_edge_length {
|
||||||
for board_x in 0..board_edge_length {
|
for board_x in 0..board_edge_length {
|
||||||
let board = &b.get(board_x, board_y)[0];
|
let board = &b.get(board_x, board_y)[0];
|
||||||
|
|
||||||
for inner_y in 0..chunk_edge_length {
|
for inner_y in 0..chunk_edge_length {
|
||||||
for inner_x in 0.. chunk_edge_length {
|
for inner_x in 0..chunk_edge_length {
|
||||||
let pixel_value = if board.get(inner_x + 1, inner_y + 1) {
|
let pixel_value = if board.get(inner_x + 1, inner_y + 1) {
|
||||||
Pixel::Block
|
Pixel::Block
|
||||||
} else {
|
} else {
|
||||||
Pixel::Empty
|
Pixel::Empty
|
||||||
};
|
};
|
||||||
|
|
||||||
result.set((board_x * chunk_edge_length) + inner_x,
|
result.set(
|
||||||
(board_y * chunk_edge_length) + inner_y,
|
(board_x * chunk_edge_length) + inner_x,
|
||||||
pixel_value);
|
(board_y * chunk_edge_length) + inner_y,
|
||||||
|
pixel_value,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -510,20 +545,21 @@ impl From<Board> for Image {
|
|||||||
impl Image {
|
impl Image {
|
||||||
fn sea_monster() -> Image {
|
fn sea_monster() -> Image {
|
||||||
let data = " # # ## ## ### # # # # # # ";
|
let data = " # # ## ## ### # # # # # # ";
|
||||||
let raw_data = data.chars().map(|x| {
|
let raw_data = data
|
||||||
match x {
|
.chars()
|
||||||
|
.map(|x| match x {
|
||||||
' ' => Pixel::Empty,
|
' ' => Pixel::Empty,
|
||||||
'#' => Pixel::Monster,
|
'#' => Pixel::Monster,
|
||||||
_ => panic!("the world broke"),
|
_ => panic!("the world broke"),
|
||||||
}
|
})
|
||||||
}).collect();
|
.collect();
|
||||||
Image {
|
Image {
|
||||||
width: 20,
|
width: 20,
|
||||||
height: 3,
|
height: 3,
|
||||||
raw_data,
|
raw_data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get(&self, x: usize, y: usize) -> Pixel {
|
fn get(&self, x: usize, y: usize) -> Pixel {
|
||||||
self.raw_data[(y * self.width) + x]
|
self.raw_data[(y * self.width) + x]
|
||||||
}
|
}
|
||||||
@@ -554,13 +590,14 @@ impl Image {
|
|||||||
fn overlay(&mut self, image: &Image) -> usize {
|
fn overlay(&mut self, image: &Image) -> usize {
|
||||||
let mut monsters_found = 0;
|
let mut monsters_found = 0;
|
||||||
|
|
||||||
for x in 0..=(self.width-image.width) {
|
for x in 0..=(self.width - image.width) {
|
||||||
for y in 0..=(self.height-image.height) {
|
for y in 0..=(self.height - image.height) {
|
||||||
let mut all_match = true;
|
let mut all_match = true;
|
||||||
|
|
||||||
for ix in 0..image.width {
|
for ix in 0..image.width {
|
||||||
for iy in 0..image.height {
|
for iy in 0..image.height {
|
||||||
all_match &= image.get(ix,iy) != Pixel::Monster || self.get(x+ix,y+iy) != Pixel::Empty;
|
all_match &= image.get(ix, iy) != Pixel::Monster
|
||||||
|
|| self.get(x + ix, y + iy) != Pixel::Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,7 +624,7 @@ impl Image {
|
|||||||
Image {
|
Image {
|
||||||
height: self.height,
|
height: self.height,
|
||||||
width: self.width,
|
width: self.width,
|
||||||
raw_data
|
raw_data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,7 +641,7 @@ impl Image {
|
|||||||
Image {
|
Image {
|
||||||
height: self.height,
|
height: self.height,
|
||||||
width: self.width,
|
width: self.width,
|
||||||
raw_data
|
raw_data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -677,13 +714,20 @@ fn main() -> Result<(), TopLevelError> {
|
|||||||
board.print_status();
|
board.print_status();
|
||||||
}
|
}
|
||||||
let final_value = board.solve()?;
|
let final_value = board.solve()?;
|
||||||
let tl = final_value.get(0,0)[0].identity;
|
let tl = final_value.get(0, 0)[0].identity;
|
||||||
let tr = final_value.get(final_value.edge_length-1,0)[0].identity;
|
let tr = final_value.get(final_value.edge_length - 1, 0)[0].identity;
|
||||||
let bl = final_value.get(0,final_value.edge_length-1)[0].identity;
|
let bl = final_value.get(0, final_value.edge_length - 1)[0].identity;
|
||||||
let br = final_value.get(final_value.edge_length-1,final_value.edge_length-1)[0].identity;
|
let br = final_value.get(final_value.edge_length - 1, final_value.edge_length - 1)[0].identity;
|
||||||
|
|
||||||
println!();
|
println!();
|
||||||
println!("Part 1 result:{} * {} * {} * {} = {}", tl, tr, bl, br, tl * tr * bl * br);
|
println!(
|
||||||
|
"Part 1 result:{} * {} * {} * {} = {}",
|
||||||
|
tl,
|
||||||
|
tr,
|
||||||
|
bl,
|
||||||
|
br,
|
||||||
|
tl * tr * bl * br
|
||||||
|
);
|
||||||
println!();
|
println!();
|
||||||
let mut base_image = Image::from(final_value);
|
let mut base_image = Image::from(final_value);
|
||||||
base_image.draw();
|
base_image.draw();
|
||||||
@@ -699,4 +743,3 @@ fn main() -> Result<(), TopLevelError> {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
mod ast;
|
mod ast;
|
||||||
#[allow(clippy::all)]
|
#[allow(clippy::all)]
|
||||||
lalrpop_util::lalrpop_mod!(#[allow(clippy::all)] parse, "/math/parse.rs");
|
lalrpop_util::lalrpop_mod!(
|
||||||
|
#[allow(clippy::all)]
|
||||||
|
parse,
|
||||||
|
"/math/parse.rs"
|
||||||
|
);
|
||||||
|
|
||||||
pub use crate::math::ast::Math;
|
pub use crate::math::ast::Math;
|
||||||
use crate::math::parse::{ExprMulParser, ExprParser};
|
use crate::math::parse::{ExprMulParser, ExprParser};
|
||||||
|
|||||||
Reference in New Issue
Block a user