feat: Implement day01 und day02 of aoc
This commit is contained in:
parent
4417549eef
commit
1802867d05
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aoc-2022"
|
||||||
|
version = "0.1.0"
|
2262
input/day01/question01
Normal file
2262
input/day01/question01
Normal file
File diff suppressed because it is too large
Load Diff
2500
input/day02/question01
Normal file
2500
input/day02/question01
Normal file
File diff suppressed because it is too large
Load Diff
45
src/day01.rs
Normal file
45
src/day01.rs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
use crate::utils;
|
||||||
|
|
||||||
|
pub fn execute_task01(content: &str) {
|
||||||
|
let vector = utils::convert_to_string_slice(&content);
|
||||||
|
let mut sum_vector = collect_all_calories(vector);
|
||||||
|
sort_calories_descending(&mut sum_vector);
|
||||||
|
|
||||||
|
let max: i32 = sum_vector[0];
|
||||||
|
|
||||||
|
println!("Day01 - Task01 - Biggest Calories {}", max)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn execute_task02(content: &str) {
|
||||||
|
let vector = utils::convert_to_string_slice(&content);
|
||||||
|
let mut sum_vector = collect_all_calories(vector);
|
||||||
|
sort_calories_descending(&mut sum_vector);
|
||||||
|
|
||||||
|
let max_three: i32 = sum_vector.iter().take(3).sum();
|
||||||
|
|
||||||
|
println!("Day01 - Task02 - Biggest Calories of top three: {}", max_three);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collect_all_calories(list: Vec<&str>) -> Vec<i32> {
|
||||||
|
let mut calories: i32 = 0;
|
||||||
|
let mut calories_list: Vec<i32> = vec![];
|
||||||
|
|
||||||
|
for var in list {
|
||||||
|
|
||||||
|
if var.is_empty() {
|
||||||
|
calories_list.push(calories);
|
||||||
|
calories = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
calories += var.parse::<i32>().unwrap_or(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return calories_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sort_calories_descending(vec: &mut Vec<i32>) {
|
||||||
|
vec.sort_by_key(|a|
|
||||||
|
|
||||||
|
std::cmp::Reverse(*a));
|
||||||
|
}
|
115
src/day02.rs
Normal file
115
src/day02.rs
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
use crate::day02::Move::{Paper, Rock, Scissors};
|
||||||
|
use crate::utils;
|
||||||
|
|
||||||
|
/*
|
||||||
|
First Colum (Opponent):
|
||||||
|
A = Rock
|
||||||
|
B = Paper
|
||||||
|
C = Scissors
|
||||||
|
|
||||||
|
Second Colum (You):
|
||||||
|
X = Rock
|
||||||
|
Y = Paper
|
||||||
|
Z = Scissors
|
||||||
|
|
||||||
|
Rock > Scissors
|
||||||
|
Scissors > Paper
|
||||||
|
Paper > Rock
|
||||||
|
|
||||||
|
Score:
|
||||||
|
Win -> 6
|
||||||
|
Draw -> 3
|
||||||
|
Loos -> 0
|
||||||
|
|
||||||
|
Rock (X) -> 1
|
||||||
|
Paper (Y) -> 2
|
||||||
|
Scissors (Z) -> 3
|
||||||
|
*/
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
enum Move {
|
||||||
|
Rock,
|
||||||
|
Paper,
|
||||||
|
Scissors
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn execute_task01(content: &str) {
|
||||||
|
let vector = utils::convert_to_string_slice(&content);
|
||||||
|
let score: i32 = vector.into_iter().map(|line| {
|
||||||
|
let opp_char: char = line.chars().nth(0).unwrap();
|
||||||
|
let you_char: char = line.chars().nth(2).unwrap();
|
||||||
|
|
||||||
|
calculate_score_from_game(convert_to_move(opp_char), convert_to_move(you_char))
|
||||||
|
}).sum();
|
||||||
|
|
||||||
|
println!("Day02 - Task01 - Score: {}", score);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn execute_task02(content: &str) {
|
||||||
|
let vector = utils::convert_to_string_slice(&content);
|
||||||
|
let score: i32 = vector.into_iter().map(|line| {
|
||||||
|
let opp_char: char = line.chars().nth(0).unwrap();
|
||||||
|
let you_char: char = line.chars().nth(2).unwrap();
|
||||||
|
let opp_move: Move = convert_to_move(opp_char);
|
||||||
|
|
||||||
|
calculate_score_from_game(opp_move, convert_to_conditional_move(opp_move ,you_char))
|
||||||
|
}).sum();
|
||||||
|
|
||||||
|
println!("Day02 - Task01 - Score: {}", score);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn convert_to_conditional_move(opp: Move, you: char) -> Move {
|
||||||
|
match you {
|
||||||
|
'X' => match opp { // need to loose
|
||||||
|
Rock => Scissors,
|
||||||
|
Paper => Rock,
|
||||||
|
Scissors => Paper,
|
||||||
|
},
|
||||||
|
'Y' => opp, // need to draw
|
||||||
|
'Z' => match opp { // need to win
|
||||||
|
Rock => Paper,
|
||||||
|
Paper => Scissors,
|
||||||
|
Scissors => Rock,
|
||||||
|
},
|
||||||
|
_ => panic!("error"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn convert_to_move(c: char) -> Move {
|
||||||
|
match c {
|
||||||
|
'A' | 'X' => Rock,
|
||||||
|
'B' | 'Y' => Paper,
|
||||||
|
'C' | 'Z' => Scissors,
|
||||||
|
_ => panic!("error"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calculate_score_from_game(opp: Move, you: Move) -> i32 {
|
||||||
|
match opp {
|
||||||
|
Rock => { // Opp == Rock
|
||||||
|
match you {
|
||||||
|
Rock => 3 + 1, // You Draw with Rock
|
||||||
|
Paper => 6 + 2, // You Win with Paper
|
||||||
|
Scissors => 0 + 3, // You Lose with Scissors
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Paper => { // Opp == Paper
|
||||||
|
match you {
|
||||||
|
Rock => 0 + 1, // You Lose with Rock
|
||||||
|
Paper => 3 + 2, // You Draw with Paper
|
||||||
|
Scissors => 6 + 3, // You Win with Scissors
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Scissors => { // Opp == Scissors
|
||||||
|
match you {
|
||||||
|
Rock => 6 + 1, // You Win with Rock
|
||||||
|
Paper => 0 + 2, // You Lose with Paper
|
||||||
|
Scissors => 3 + 3, // You Draw with Scissors
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
22
src/main.rs
22
src/main.rs
@ -1,3 +1,23 @@
|
|||||||
|
mod utils;
|
||||||
|
mod day01;
|
||||||
|
mod day02;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
let path01 = "input/day01/question01";
|
||||||
|
let content01: String = match utils::load_file_as_string(path01) {
|
||||||
|
Ok(content) => content,
|
||||||
|
Err(error) => panic!("Problem opening the file: {:?}", error),
|
||||||
|
};
|
||||||
|
|
||||||
|
let path02 = "input/day02/question01";
|
||||||
|
let content02: String = match utils::load_file_as_string(path02) {
|
||||||
|
Ok(content) => content,
|
||||||
|
Err(error) => panic!("Problem opening the file: {:?}", error),
|
||||||
|
};
|
||||||
|
|
||||||
|
day01::execute_task01(&content01);
|
||||||
|
day01::execute_task02(&content01);
|
||||||
|
|
||||||
|
day02::execute_task01(&content02);
|
||||||
|
day02::execute_task02(&content02);
|
||||||
}
|
}
|
||||||
|
11
src/utils.rs
Normal file
11
src/utils.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
use std::fs;
|
||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
pub fn load_file_as_string(path: &str) -> Result<String, Box<dyn Error>> {
|
||||||
|
let content = fs::read_to_string(path)?;
|
||||||
|
Ok(content)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn convert_to_string_slice(content: &str) -> Vec<&str> {
|
||||||
|
content.lines().collect()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user