@@ -53,19 +53,15 @@ impl Tile {
53
53
fn solve ( corner : & Tile , all_tiles : & Vec < Tile > ) -> usize {
54
54
let size = ( 0 ..) . find ( |i| i* i == all_tiles. len ( ) / 8 ) . unwrap ( ) ;
55
55
56
- let mut leftmost = corner. clone ( ) ;
56
+ let mut leftmost = corner. rotated ( ) . rotated ( ) . flipped ( ) ;
57
57
let mut used = HashSet :: new ( ) ;
58
-
59
- let mut field: Vec < Vec < char > > = Vec :: new ( ) ;
58
+ let mut field: Vec < String > = Vec :: new ( ) ;
60
59
61
60
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 ( ) ;
66
62
leftmost = current. clone ( ) ;
67
63
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}" ) ) ) ;
69
65
for _ in 1 ..size {
70
66
current = all_tiles. iter ( ) . filter ( |t| !used. contains ( & t. id ) ) . find ( |tile| tile. left ( ) == current. right ( ) ) . unwrap ( ) . clone ( ) ;
71
67
used. insert ( current. id ) ;
@@ -75,12 +71,11 @@ fn solve(corner: &Tile, all_tiles: &Vec<Tile>) -> usize {
75
71
}
76
72
}
77
73
}
78
- let lines = field. iter ( ) . map ( |vec| vec. iter ( ) . join ( "" ) ) . collect_vec ( ) ;
79
74
let dragon1 = Regex :: new ( r"..................1." ) . unwrap ( ) ;
80
75
let dragon2 = Regex :: new ( r"1....11....11....111" ) . unwrap ( ) ;
81
76
let dragon3 = Regex :: new ( r".1..1..1..1..1..1..." ) . unwrap ( ) ;
82
77
let mut dragons = 0 ;
83
- for ( a, b, c) in lines . iter ( ) . tuple_windows ( ) {
78
+ for ( a, b, c) in field . iter ( ) . tuple_windows ( ) {
84
79
for i in 0 ..a. len ( ) {
85
80
if dragon1. is_match ( & a. chars ( ) . skip ( i) . take ( 20 ) . join ( "" ) )
86
81
&& dragon2. is_match ( & b. chars ( ) . skip ( i) . take ( 20 ) . join ( "" ) )
@@ -89,33 +84,31 @@ fn solve(corner: &Tile, all_tiles: &Vec<Tile>) -> usize {
89
84
}
90
85
}
91
86
}
92
- lines . join ( "" ) . matches ( "1" ) . count ( ) - dragons
87
+ field . join ( "" ) . matches ( "1" ) . count ( ) - dragons
93
88
}
94
89
95
90
fn main ( ) {
96
91
let input = stdin ( ) . lines ( ) . filter_map ( Result :: ok) . join ( "\n " ) . replace ( "." , "0" ) . replace ( "#" , "1" ) ;
97
92
let blocks = input. split ( "\n \n " ) . collect_vec ( ) ;
98
93
99
- let mut tiles = Vec :: new ( ) ;
94
+ let mut all_tiles = Vec :: new ( ) ;
100
95
let mut edges: HashMap < usize , HashSet < usize > > = HashMap :: new ( ) ;
101
96
102
97
for block in blocks {
103
98
let num: usize = block. lines ( ) . next ( ) . unwrap ( ) . trim_matches ( [ 'T' , 'i' , 'l' , 'e' , ' ' , ':' ] ) . parse ( ) . unwrap ( ) ;
104
99
let tile = Tile :: new ( num, block. lines ( ) . skip ( 1 ) . collect ( ) ) ;
105
- tiles . push ( tile. clone ( ) ) ;
100
+ all_tiles . extend ( tile. variations ( ) ) ;
106
101
107
102
for ( edge, _) in tile. top_edges ( ) {
108
103
edges. entry ( edge) . or_insert_with ( HashSet :: new) . insert ( num) ;
109
104
}
110
105
}
111
106
112
- let all_tiles = tiles. iter ( ) . flat_map ( |tile| tile. variations ( ) ) . collect_vec ( ) ;
113
-
114
107
let corners = all_tiles. iter ( )
115
108
. filter ( |t| edges. get ( & t. top ( ) ) . unwrap ( ) . len ( ) == 1 )
116
109
. filter ( |t| edges. get ( & t. left ( ) ) . unwrap ( ) . len ( ) == 1 )
117
110
. collect_vec ( ) ;
118
111
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( ) ) ;
121
114
}
0 commit comments