From 3070407092f773d264329fe663b7ef1735a59eb5 Mon Sep 17 00:00:00 2001 From: YK Date: Tue, 19 Nov 2024 19:31:23 +0300 Subject: [PATCH] solution: day 1, primitive --- in/1.txt | 1 + src/days.rs | 23 ++++++++++++ src/days/d1.rs | 86 +++++++++++++++++++++++++++++++++++++++----- src/days/template.rs | 35 ++++++++++++++++++ src/lib.rs | 3 ++ src/prelude.rs | 1 + src/utils.rs | 5 +++ 7 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 in/1.txt create mode 100644 src/days/template.rs diff --git a/in/1.txt b/in/1.txt new file mode 100644 index 0000000..34c0b12 --- /dev/null +++ b/in/1.txt @@ -0,0 +1 @@ +L1, L3, L5, L3, R1, L4, L5, R1, R3, L5, R1, L3, L2, L3, R2, R2, L3, L3, R1, L2, R1, L3, L2, R4, R2, L5, R4, L5, R4, L2, R3, L2, R4, R1, L5, L4, R1, L2, R3, R1, R2, L4, R1, L2, R3, L2, L3, R5, L192, R4, L5, R4, L1, R4, L4, R2, L5, R45, L2, L5, R4, R5, L3, R5, R77, R2, R5, L5, R1, R4, L4, L4, R2, L4, L1, R191, R1, L1, L2, L2, L4, L3, R1, L3, R1, R5, R3, L1, L4, L2, L3, L1, L1, R5, L4, R1, L3, R1, L2, R1, R4, R5, L4, L2, R4, R5, L1, L2, R3, L4, R2, R2, R3, L2, L3, L5, R3, R1, L4, L3, R4, R2, R2, R2, R1, L4, R4, R1, R2, R1, L2, L2, R4, L1, L2, R3, L3, L5, L4, R4, L3, L1, L5, L3, L5, R5, L5, L4, L2, R1, L2, L4, L2, L4, L1, R4, R4, R5, R1, L4, R2, L4, L2, L4, R2, L4, L1, L2, R1, R4, R3, R2, R2, R5, L1, L2 diff --git a/src/days.rs b/src/days.rs index 52d31d2..e88513f 100644 --- a/src/days.rs +++ b/src/days.rs @@ -1 +1,24 @@ pub mod d1; +// pub mod d2; +// pub mod d3; +// pub mod d4; +// pub mod d5; +// pub mod d6; +// pub mod d7; +// pub mod d8; +// pub mod d9; +// pub mod d10; +// pub mod d11; +// pub mod d12; +// pub mod d13; +// pub mod d14; +// pub mod d15; +// pub mod d16; +// pub mod d17; +// pub mod d18; +// pub mod d19; +// pub mod d20; +// pub mod d21; +// pub mod d22; +// pub mod d23; +// pub mod d24; diff --git a/src/days/d1.rs b/src/days/d1.rs index 1f66641..f9cb116 100644 --- a/src/days/d1.rs +++ b/src/days/d1.rs @@ -1,18 +1,72 @@ use crate::prelude::*; -pub type I = String; -pub type O = i64; +pub type I = Vec; +pub type O = u64; -fn solve (data: I) -> O { - 0 +fn _parse (data: &str) -> I { + data.split(", ").map(|e| { + let dir = e.chars().next().unwrap(); + let turn: u16 = if dir == 'L' { 1 << 15 } else { 0 }; + + let distance = &e[1..].trim().parse().unwrap(); + + distance | turn + }).collect_vec() } -fn silver (data: I) -> O { - 0 + +fn _silver (data: &I) -> O { + let mut d = 0; + let mut x: i32 = 0; + let mut y: i32 = 0; + + for i in data { + let direction = i & (1 << 15); + let steps = (i & !(1 << 15)) as i32; + d = (d + if direction > 0 { 3 } else { 1 }) % 4; + + match d { + 0 => y -= steps, + 1 => x += steps, + 2 => y += steps, + 3 => x -= steps, + _ => panic!() + } + } + + + (x.abs() + y.abs()) as u64 } -fn gold (data: I) -> O { - 0 +fn _gold (data: &I) -> O { + let mut d = 0; + let mut x: i32 = 0; + let mut y: i32 = 0; + + let mut s = S::new(); + + for i in data { + let direction = i & (1 << 15); + let steps = (i & !(1 << 15)) as i32; + d = (d + if direction > 0 { 3 } else { 1 }) % 4; + + for _ in 0..steps { + match d { + 0 => y -= 1, + 1 => x += 1, + 2 => y += 1, + 3 => x -= 1, + _ => unreachable!() + } + if !s.insert((x, y)) { + return (x.abs() + y.abs()) as u64 + } + } + + } + + + (x.abs() + y.abs()) as u64 } #[cfg(test)] @@ -20,16 +74,30 @@ mod test { use super::*; fn read () -> I { - Default::default() + let file = inc!(1); + _parse(file) + } + + #[test] + fn example () { + let data = _parse("R8, R4, R4, R8"); + + assert_eq!(_gold(&data), 4) } #[test] fn silver () { + let data = read(); + let ans = _silver(&data); + assert_eq!(ans, 299) } #[test] fn gold () { + let data = read(); + let ans = _gold(&data); + assert_eq!(ans, 181) } } diff --git a/src/days/template.rs b/src/days/template.rs new file mode 100644 index 0000000..1f66641 --- /dev/null +++ b/src/days/template.rs @@ -0,0 +1,35 @@ +use crate::prelude::*; + +pub type I = String; +pub type O = i64; + +fn solve (data: I) -> O { + 0 +} + +fn silver (data: I) -> O { + 0 +} + +fn gold (data: I) -> O { + 0 +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> I { + Default::default() + } + + #[test] + fn silver () { + + } + + #[test] + fn gold () { + + } +} diff --git a/src/lib.rs b/src/lib.rs index f85fe84..62049a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,6 @@ +#![feature(let_chains)] +#![feature(decl_macro)] + pub mod days; pub mod utils; pub mod prelude; diff --git a/src/prelude.rs b/src/prelude.rs index 46f5f8c..e1ba1c4 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,3 +1,4 @@ pub use crate::utils::*; pub use anyhow::Error; pub use itertools::Itertools; +pub use std::collections::{ HashMap as M, HashSet as S }; diff --git a/src/utils.rs b/src/utils.rs index e69de29..60326cf 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -0,0 +1,5 @@ +pub macro inc { + ($d: literal) => { + include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/in/", $d, ".txt")) + } +}