summaryrefslogtreecommitdiff
path: root/2024/day02.rs
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2024-12-02 19:05:55 +0100
committernekineki <nekineki@nekineki.net>2024-12-02 19:05:55 +0100
commitc18ea4b9e5db4dd56a915994f30b7e6841540024 (patch)
tree8cca78aad31f1ca0c5b949b604e6d8c39e638950 /2024/day02.rs
parentfbcd6fc3b796339b9caf636d8864934086d09afe (diff)
day02
Diffstat (limited to '2024/day02.rs')
-rw-r--r--2024/day02.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/2024/day02.rs b/2024/day02.rs
new file mode 100644
index 0000000..c32aa19
--- /dev/null
+++ b/2024/day02.rs
@@ -0,0 +1,55 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+#![allow(unused_mut)]
+use std::env;
+use std::fs::File;
+use std::io::Read;
+
+fn is_all_same(arr: &[bool]) -> bool {
+ arr.windows(2).all(|w| w[0] == w[1])
+}
+
+fn is_safe(arr: &[i32]) -> bool {
+ let diff: Vec<i32> = arr.windows(2).map(|w| w[0] - w[1]).collect();
+ let inc_ok = diff.iter().map(|a| (3 >= a.abs()) && (a.abs() >= 1)).all(|a|a);
+ let sign_ok = is_all_same(&diff.iter().map(|a| *a > 0).collect::<Vec<_>>());
+
+ inc_ok && sign_ok
+}
+fn main() {
+ let args: Vec<String> = env::args().collect();
+ let filename = if args.len() == 1 {
+ "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl"
+ } else {
+ args[1].clone()
+ };
+ let mut f = File::open(filename).expect("cannot open file");
+ let mut content = String::new();
+ f.read_to_string(&mut content).expect("cannot read file");
+ let lines = content.trim_end().split("\n");
+
+ let mut res1 = 0;
+ let mut res2 = 0;
+ for line in lines {
+ let a: Vec<i32> = line.split(" ").map(|a| a.parse().unwrap()).collect();
+
+ if is_safe(&a) {
+ res1 += 1;
+ res2 += 1;
+ } else {
+ for i in 0..a.len() {
+ let mut b = a.clone();
+ b.remove(i);
+ if is_safe(&b) {
+ res2 += 1;
+ break;
+ }
+ }
+ }
+ }
+
+ println!("res1: {}", res1);
+ println!("res2: {}", res2);
+ assert_eq!(res1, 257);
+ assert_eq!(res2, 328);
+}