commit 306785c81bcff7e92dbf4cbdc71190fc7420ed11 Author: Louis Vallat Date: Mon Dec 2 00:28:12 2024 +0100 feat: added day 1 part 1 and 2 Signed-off-by: Louis Vallat diff --git a/.gitea/workflows/build_and_run.yml b/.gitea/workflows/build_and_run.yml new file mode 100644 index 0000000..9d2283d --- /dev/null +++ b/.gitea/workflows/build_and_run.yml @@ -0,0 +1,26 @@ +name: Build and run challenges +defaults: + run: + shell: sh +on: + push: + + +jobs: + build-and-run: + name: Challenge for day + strategy: + matrix: + day_number: [1] + runs-on: rust-bookworm + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Run challenge + env: + DAY_FOLDER: day${{ matrix.day_number }} + INPUT_BASE64: ${{ secrets[format('INPUT_DAY{0}', matrix.day_number)] }} + run: | + echo $INPUT_BASE64 | base64 --decode > /tmp/input + cd $DAY_FOLDER + cargo run --release /tmp/input diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a1e9db --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +target +Cargo.lock +.idea/ diff --git a/day1/Cargo.toml b/day1/Cargo.toml new file mode 100644 index 0000000..fb6b7ec --- /dev/null +++ b/day1/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day1" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/day1/src/main.rs b/day1/src/main.rs new file mode 100644 index 0000000..c2c3424 --- /dev/null +++ b/day1/src/main.rs @@ -0,0 +1,59 @@ +use std::collections::HashMap; +use std::{env, fs}; + +fn read_input(path: &str) -> String { + fs::read_to_string(path).expect("Cannot read file.") +} + +fn parse_input(input: &str) -> (Vec, Vec) { + let (mut right, mut left) = + input + .lines() + .filter(|line| !line.is_empty()) + .fold((vec![], vec![]), |mut acc, line| { + let split = line.trim().split_once(" ").expect("Cannot split line."); + acc.0.push( + split + .0 + .parse::() + .expect("Cannot parse integer on the left."), + ); + acc.1.push( + split + .1 + .parse::() + .expect("Cannot parse integer on the right."), + ); + acc + }); + right.sort(); + left.sort(); + (left, right) +} + +fn part_1(left: &Vec, right: &Vec) -> i32 { + left.iter() + .enumerate() + .map(|(i, x)| (x - right[i]).abs()) + .sum() +} + +fn part_2(left: &Vec, right: &Vec) -> i32 { + let mut occur = HashMap::new(); + for x in right.iter() { + *occur.entry(x).or_insert(0) += 1; + } + + left.iter().map(|x| x * occur.get(x).unwrap_or(&0)).sum() +} + +fn main() { + let args: Vec = env::args().collect(); + for arg in args.iter().skip(1) { + let input = read_input(&arg); + let (left, right) = parse_input(&input); + println!("[{}]", &arg); + println!("\t[Part 1] => Answer is '{}'.", part_1(&left, &right)); + println!("\t[Part 2] => Answer is '{}'.", part_2(&left, &right)); + } +}