Skip to content

Commit 27c52eb

Browse files
committed
Add day 20
1 parent 83f0737 commit 27c52eb

File tree

1 file changed

+10
-17
lines changed

1 file changed

+10
-17
lines changed

2020/20/20.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,15 @@ impl Tile {
5353
fn solve(corner: &Tile, all_tiles: &Vec<Tile>) -> usize {
5454
let size = (0..).find(|i| i*i == all_tiles.len() / 8).unwrap();
5555

56-
let mut leftmost = corner.clone();
56+
let mut leftmost = corner.rotated().rotated().flipped();
5757
let mut used = HashSet::new();
58-
59-
let mut field: Vec<Vec<char>> = Vec::new();
58+
let mut field: Vec<String> = Vec::new();
6059

6160
for y in 0..size {
62-
let mut current = leftmost.clone();
63-
if y != 0 {
64-
current = all_tiles.iter().filter(|t| !used.contains(&t.id)).find(|tile| tile.top() == leftmost.bot()).unwrap().clone();
65-
}
61+
let mut current = all_tiles.iter().filter(|t| !used.contains(&t.id)).find(|tile| tile.top() == leftmost.bot()).unwrap().clone();
6662
leftmost = current.clone();
6763
used.insert(current.id);
68-
current.inner().rows.iter().for_each(|n| field.push(format!("{n:08b}").chars().collect()));
64+
current.inner().rows.iter().for_each(|n| field.push(format!("{n:08b}")));
6965
for _ in 1..size {
7066
current = all_tiles.iter().filter(|t| !used.contains(&t.id)).find(|tile| tile.left() == current.right()).unwrap().clone();
7167
used.insert(current.id);
@@ -75,12 +71,11 @@ fn solve(corner: &Tile, all_tiles: &Vec<Tile>) -> usize {
7571
}
7672
}
7773
}
78-
let lines = field.iter().map(|vec| vec.iter().join("")).collect_vec();
7974
let dragon1 = Regex::new(r"..................1.").unwrap();
8075
let dragon2 = Regex::new(r"1....11....11....111").unwrap();
8176
let dragon3 = Regex::new(r".1..1..1..1..1..1...").unwrap();
8277
let mut dragons = 0;
83-
for (a, b, c) in lines.iter().tuple_windows() {
78+
for (a, b, c) in field.iter().tuple_windows() {
8479
for i in 0..a.len() {
8580
if dragon1.is_match(&a.chars().skip(i).take(20).join(""))
8681
&& dragon2.is_match(&b.chars().skip(i).take(20).join(""))
@@ -89,33 +84,31 @@ fn solve(corner: &Tile, all_tiles: &Vec<Tile>) -> usize {
8984
}
9085
}
9186
}
92-
lines.join("").matches("1").count() - dragons
87+
field.join("").matches("1").count() - dragons
9388
}
9489

9590
fn main() {
9691
let input = stdin().lines().filter_map(Result::ok).join("\n").replace(".", "0").replace("#", "1");
9792
let blocks = input.split("\n\n").collect_vec();
9893

99-
let mut tiles = Vec::new();
94+
let mut all_tiles = Vec::new();
10095
let mut edges: HashMap<usize, HashSet<usize>> = HashMap::new();
10196

10297
for block in blocks {
10398
let num: usize = block.lines().next().unwrap().trim_matches(['T', 'i', 'l', 'e', ' ', ':']).parse().unwrap();
10499
let tile = Tile::new(num, block.lines().skip(1).collect());
105-
tiles.push(tile.clone());
100+
all_tiles.extend(tile.variations());
106101

107102
for (edge, _) in tile.top_edges() {
108103
edges.entry(edge).or_insert_with(HashSet::new).insert(num);
109104
}
110105
}
111106

112-
let all_tiles = tiles.iter().flat_map(|tile| tile.variations()).collect_vec();
113-
114107
let corners = all_tiles.iter()
115108
.filter(|t| edges.get(&t.top()).unwrap().len() == 1)
116109
.filter(|t| edges.get(&t.left()).unwrap().len() == 1)
117110
.collect_vec();
118111

119-
println!("{:?}", corners.iter().map(|tile| tile.id).unique().reduce(|acc, a| acc * a).unwrap());
120-
println!("{:?}", corners.iter().map(|corner| solve(corner, &all_tiles)).min().unwrap());
112+
println!("{}", corners.iter().map(|tile| tile.id).unique().reduce(|acc, a| acc * a).unwrap());
113+
println!("{}", corners.iter().map(|corner| solve(corner, &all_tiles)).min().unwrap());
121114
}

0 commit comments

Comments
 (0)