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() {
 | 
			
		||||
    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