1
1
advent_of_code:: solution!( 2 ) ;
2
2
3
3
pub fn part_one ( input : & str ) -> Option < u32 > {
4
- None
4
+ //increasing , decs
5
+ let mut safe_count = 0 ;
6
+ let mut unsafe_count = 0 ;
7
+ for line in input. lines ( ) {
8
+ println ! ( "{}" , line) ;
9
+
10
+ let numbers: Vec < i32 > = line. split_whitespace ( ) . map ( |item| {
11
+ item. parse :: < i32 > ( ) . unwrap ( )
12
+ } ) . collect ( ) ;
13
+
14
+ if checking_level ( & numbers) {
15
+ safe_count += 1 ;
16
+ } else {
17
+ unsafe_count += 1 ;
18
+ }
19
+ }
20
+
21
+ println ! ( "{}" , safe_count) ;
22
+ // if let Some(value) = checking_level(numbers) {
23
+ // return value;
24
+ // }
25
+
26
+ // if numbers.iter().max().unwrap() - numbers.iter().min().unwrap() > 3 {
27
+ // // unsafe
28
+ // unsafe_count+=1;
29
+ // } else {
30
+ // safe_count+=1;
31
+ // }
32
+
33
+ // if let (Some(max), Some(min)) = (numbers.iter().max(), numbers.iter().min()) {
34
+ // if max - min > 3 {
35
+ // unsafe_count += 1;
36
+ // } else {
37
+ // safe_count += 1;
38
+ // }
39
+ // }
40
+
41
+
42
+ Some ( safe_count as u32 )
43
+
44
+ }
45
+
46
+ fn checking_level ( numbers : & Vec < i32 > ) -> bool {
47
+ let mut is_increasing = true ;
48
+ let mut is_decreasing = true ;
49
+
50
+ for i in 0 ..numbers. len ( ) - 1 {
51
+ // let diff = (&numbers - &numbers).abs();
52
+ let curr = numbers[ i] ;
53
+ let next = numbers[ i + 1 ] ;
54
+
55
+ let diff = ( next - curr) . abs ( ) ;
56
+
57
+ if diff < 1 || diff > 3 {
58
+ //unsafe
59
+ // unsafe_count += 1;
60
+ return false
61
+ }
62
+
63
+ if curr < next {
64
+ //decreasing
65
+ // safe_count += 1;
66
+ is_decreasing = false ;
67
+ // return false;
68
+ } else if curr > next {
69
+ //increas
70
+ // safe_count += 1;
71
+ is_increasing= false ;
72
+ // return Some(false)
73
+ } else {
74
+ // nochagning
75
+ return false ;
76
+ // return Some(false);
77
+ }
78
+ }
79
+ is_increasing || is_decreasing
5
80
}
6
81
7
82
pub fn part_two ( input : & str ) -> Option < u32 > {
8
- None
83
+ let mut safe_count = 0 ;
84
+ let mut unsafe_count = 0 ;
85
+ for line in input. lines ( ) {
86
+ println ! ( "{}" , line) ;
87
+
88
+ let numbers: Vec < i32 > = line. split_whitespace ( ) . map ( |item| {
89
+ item. parse :: < i32 > ( ) . unwrap ( )
90
+ } ) . collect ( ) ;
91
+
92
+ if checking_level ( & numbers) {
93
+ safe_count += 1 ;
94
+ } else {
95
+ // try to remove item and check again
96
+ for i in 0 ..numbers. len ( ) {
97
+ let mut cleaned_level = numbers. to_vec ( ) ;
98
+ cleaned_level. remove ( i) ;
99
+
100
+
101
+ if checking_level ( & cleaned_level) {
102
+ //
103
+ safe_count += 1 ;
104
+ break ;
105
+ }
106
+ }
107
+ // not safe for sure
108
+ unsafe_count += 1 ;
109
+ }
110
+ // if checking_level(&numbers) {
111
+ // safe_count += 1;
112
+ // } else {
113
+ // unsafe_count += 1;
114
+ // }
115
+ }
116
+
117
+ println ! ( "{}" , safe_count) ;
118
+ Some ( safe_count as u32 )
9
119
}
10
120
11
121
#[ cfg( test) ]
@@ -15,12 +125,12 @@ mod tests {
15
125
#[ test]
16
126
fn test_part_one ( ) {
17
127
let result = part_one ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
18
- assert_eq ! ( result, None ) ;
128
+ assert_eq ! ( result, Some ( 2 ) ) ;
19
129
}
20
130
21
131
#[ test]
22
132
fn test_part_two ( ) {
23
133
let result = part_two ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
24
- assert_eq ! ( result, None ) ;
134
+ assert_eq ! ( result, Some ( 4 ) ) ;
25
135
}
26
136
}
0 commit comments