@@ -53,19 +53,15 @@ impl Tile {
5353fn 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
9590fn 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