1
- use std:: { env, fs, process:: exit} ;
1
+ use std:: { env, fs, ops :: Range , process:: exit} ;
2
2
3
3
fn part1 ( input_data : String ) -> u64 {
4
4
let mut disk_content = Vec :: new ( ) ;
@@ -39,8 +39,43 @@ fn part1(input_data: String) -> u64 {
39
39
. sum ( )
40
40
}
41
41
42
- fn part2 ( input_data : String ) -> i32 {
43
- return 0 ;
42
+ fn part2 ( input_data : String ) -> u64 {
43
+ let mut files: Vec < ( Range < usize > , u64 ) > = Vec :: new ( ) ;
44
+ let mut free_blocks: Vec < Range < usize > > = Vec :: new ( ) ;
45
+
46
+ let mut curr_i = 0 ;
47
+
48
+ for ( index, size_char) in input_data. chars ( ) . enumerate ( ) {
49
+ let space_size = size_char. to_digit ( 10 ) . unwrap ( ) ;
50
+ let space_range = curr_i as usize ..curr_i as usize + space_size as usize ;
51
+ curr_i = space_range. end ;
52
+
53
+ if index % 2 == 0 {
54
+ files. push ( ( space_range, index as u64 / 2 ) ) ;
55
+ } else {
56
+ free_blocks. push ( space_range) ;
57
+ }
58
+ }
59
+
60
+ for file in files. iter_mut ( ) . rev ( ) {
61
+ if let Some ( ( i, free) ) = free_blocks
62
+ . iter_mut ( )
63
+ . enumerate ( )
64
+ . find ( |( _, f) | f. end <= file. 0 . start && f. len ( ) >= file. 0 . len ( ) )
65
+ {
66
+ let free_start = free. start ;
67
+ * free = free_start + file. 0 . len ( ) ..free. end ;
68
+ * file = ( free_start..free_start + file. 0 . len ( ) , file. 1 ) ;
69
+ if free. len ( ) == 0 {
70
+ free_blocks. remove ( i) ;
71
+ }
72
+ }
73
+ }
74
+
75
+ files
76
+ . into_iter ( )
77
+ . map ( |f| f. 0 . sum :: < usize > ( ) as u64 * f. 1 )
78
+ . sum ( )
44
79
}
45
80
46
81
#[ cfg( test) ]
@@ -52,6 +87,12 @@ mod tests {
52
87
let file_content = fs:: read_to_string ( "./sample1.txt" ) . unwrap ( ) ;
53
88
assert_eq ! ( part1( file_content) , 1928 ) ;
54
89
}
90
+
91
+ #[ test]
92
+ fn test2 ( ) {
93
+ let file_content = fs:: read_to_string ( "./sample2.txt" ) . unwrap ( ) ;
94
+ assert_eq ! ( part2( file_content) , 2858 ) ;
95
+ }
55
96
}
56
97
57
98
fn main ( ) {
@@ -63,6 +104,6 @@ fn main() {
63
104
64
105
println ! (
65
106
"Output: {}" ,
66
- part1 ( fs:: read_to_string( input_path. unwrap( ) ) . unwrap( ) )
107
+ part2 ( fs:: read_to_string( input_path. unwrap( ) ) . unwrap( ) )
67
108
) ;
68
109
}
0 commit comments