Initial solution

This commit is contained in:
Lionel Sambuc
2022-12-02 08:43:09 +01:00
commit 97c365ba3d
5 changed files with 2599 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/target
.idea

7
Cargo.lock generated Normal file
View File

@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "day02"
version = "0.1.0"

8
Cargo.toml Normal file
View File

@@ -0,0 +1,8 @@
[package]
name = "day02"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

2500
src/input.txt Normal file

File diff suppressed because it is too large Load Diff

82
src/main.rs Normal file
View File

@@ -0,0 +1,82 @@
use std::fmt::{Display, Formatter};
use std::fs::File;
use std::io;
use std::io::BufRead;
use std::path::Path;
#[derive(Debug)]
#[derive(PartialEq, Eq)]
struct Choice(u32);
const ROCK: Choice = Choice(1);
const PAPER: Choice = Choice(2);
const SCISSORS: Choice = Choice(3);
const LOOSE: Choice = ROCK;
const DRAW: Choice = PAPER;
const WIN: Choice = SCISSORS;
impl From<&str> for Choice {
fn from(str: &str) -> Self {
match str {
"A" | "X" => ROCK,
"B" | "Y" => PAPER,
"C" | "Z" => SCISSORS,
_ => panic!("Invalid value")
}
}
}
impl Display for Choice {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
&ROCK => f.write_str("Rock"),
&PAPER => f.write_str("Paper"),
&SCISSORS => f.write_str("Scissors"),
_ => f.write_str("UNKNOWN"),
}
}
}
fn main() {
let path = Path::new("input.txt");
let file = File::open(&path).expect("Could not find file");
let lines = io::BufReader::new(file).lines();
let mut score1 = 0;
let mut score2 = 0;
for line in lines {
if let Ok(line) = line {
let v = line.split(' ').take(2).map(|str| Choice::from(str)).collect::<Vec<_>>();
let opponent = &v[0];
let me = &v[1];
// First challenge
let duel = match (opponent, me) {
(&ROCK, &ROCK) | (&PAPER, &PAPER) | (&SCISSORS, &SCISSORS) => 3,
(&SCISSORS, &ROCK) | (&PAPER, &SCISSORS) | (&ROCK, &PAPER) => 6,
_ => 0,
};
//println!("{} me {} opponent {} -> duel {}", score, me, opponent, duel);
score1 += duel + me.0;
// second challenge
score2 += match (opponent, me) {
(&ROCK, &LOOSE) => SCISSORS.0,
(&PAPER, &LOOSE) => ROCK.0,
(&SCISSORS, &LOOSE) => PAPER.0,
(hand, &DRAW) => 3 + hand.0,
(&ROCK, &WIN) => 6 + PAPER.0,
(&PAPER, &WIN) => 6 + SCISSORS.0,
(&SCISSORS, &WIN) => 6 + ROCK.0,
_ => 0, // Will never happen, but rustc can't know it
};
} else {
println!("Failed to parse : `{:?}`", line);
}
}
println!("first answer {}", score1);
println!("second answer {}", score2);
}