1
1
use std:: io;
2
2
use std:: io:: { Read } ;
3
3
use std:: fs:: File ;
4
+ use std:: collections:: HashSet ;
4
5
5
6
fn main ( ) -> io:: Result < ( ) > {
6
7
let mut input = String :: new ( ) ;
@@ -9,31 +10,70 @@ fn main() -> io::Result<()> {
9
10
f. read_to_string ( & mut input) ?;
10
11
11
12
let p1 = part_one ( & input) ?;
12
- println ! ( "Part 1: {}" , p1) ;
13
+ println ! ( "Part 1: {:?}" , p1) ;
14
+
15
+ let p2 = part_two ( & input) ?;
16
+ println ! ( "Part 2: {:?}" , p2) ;
13
17
14
18
Ok ( ( ) )
15
19
}
16
20
17
21
fn part_one ( input : & str ) -> io:: Result < ( i32 ) > {
18
22
let res = input
19
23
. lines ( )
20
- . map ( |l| l. parse :: < i32 > ( ) . unwrap ( ) ) . sum ( ) ;
24
+ . map ( |l| l. parse :: < i32 > ( ) . unwrap ( ) )
25
+ . sum ( ) ;
21
26
22
27
Ok ( res)
23
28
}
24
29
30
+ fn part_two ( input : & str ) -> io:: Result < ( i32 ) > {
31
+ let mut freq = 0 ;
32
+ let mut seen_freqs: HashSet < i32 > = HashSet :: new ( ) ;
33
+ seen_freqs. insert ( freq) ;
34
+
35
+ let freq_changes = input
36
+ . lines ( )
37
+ . map ( |l| l. parse :: < i32 > ( ) . unwrap ( ) )
38
+ . cycle ( ) ;
39
+
40
+ for change in freq_changes {
41
+ freq += change;
42
+ if seen_freqs. contains ( & freq) {
43
+ break ;
44
+ }
45
+ seen_freqs. insert ( freq) ;
46
+ }
47
+
48
+ Ok ( freq)
49
+ }
50
+
51
+
25
52
#[ cfg( test) ]
26
53
mod tests {
27
- use super :: * ;
28
-
29
- #[ test]
30
- fn test_part_one ( ) {
31
- let input1 = "+1\n +1\n +1" ;
32
- let input2 = "+1\n +1\n -2" ;
33
- let input3 = "-1\n -2\n -3" ;
34
-
35
- assert_eq ! ( part_one( & input1) . unwrap( ) , 3 ) ;
36
- assert_eq ! ( part_one( & input2) . unwrap( ) , 0 ) ;
37
- assert_eq ! ( part_one( & input3) . unwrap( ) , -6 ) ;
38
- }
54
+ use super :: * ;
55
+
56
+ #[ test]
57
+ fn test_part_one ( ) {
58
+ let input1 = "+1\n +1\n +1" ;
59
+ let input2 = "+1\n +1\n -2" ;
60
+ let input3 = "-1\n -2\n -3" ;
61
+
62
+ assert_eq ! ( part_one( & input1) . unwrap( ) , 3 ) ;
63
+ assert_eq ! ( part_one( & input2) . unwrap( ) , 0 ) ;
64
+ assert_eq ! ( part_one( & input3) . unwrap( ) , -6 ) ;
65
+ }
66
+
67
+ #[ test]
68
+ fn test_part_two ( ) {
69
+ let input1 = "+1\n -1" ;
70
+ let input2 = "+3\n +3\n +4\n -2\n -4" ;
71
+ let input3 = "-6\n +3\n +8\n +5\n -6" ;
72
+ let input4 = "+7\n +7\n -2\n -7\n -4" ;
73
+
74
+ assert_eq ! ( part_two( & input1) . unwrap( ) , 0 ) ;
75
+ assert_eq ! ( part_two( & input2) . unwrap( ) , 10 ) ;
76
+ assert_eq ! ( part_two( & input3) . unwrap( ) , 5 ) ;
77
+ assert_eq ! ( part_two( & input4) . unwrap( ) , 14 ) ;
78
+ }
39
79
}
0 commit comments