feat: implement part 1 day 7
This commit is contained in:
parent
2ffad7325f
commit
e09005bb83
@ -60,7 +60,7 @@ fn solve_02(content: &str) -> anyhow::Result<i64> {
|
|||||||
.parse::<i64>().unwrap())
|
.parse::<i64>().unwrap())
|
||||||
.collect::<Vec<i64>>();
|
.collect::<Vec<i64>>();
|
||||||
|
|
||||||
let mut races = vec![(result[0].clone(), result[1].clone())];
|
let races = vec![(result[0].clone(), result[1].clone())];
|
||||||
Ok(races
|
Ok(races
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(time, distance)| calc_possible_options(*time, *distance))
|
.map(|(time, distance)| calc_possible_options(*time, *distance))
|
||||||
|
161
src/day07.rs
Normal file
161
src/day07.rs
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fmt::{Display, Formatter};
|
||||||
|
use std::panic::panic_any;
|
||||||
|
use std::sync::mpsc::TrySendError::Full;
|
||||||
|
use std::time::Instant;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
#[derive(Eq, PartialEq, PartialOrd, Ord, Debug)]
|
||||||
|
pub enum Card {
|
||||||
|
A = 2,
|
||||||
|
K = 3,
|
||||||
|
Q = 4,
|
||||||
|
J = 5,
|
||||||
|
T = 6,
|
||||||
|
N9 = 7,
|
||||||
|
N8 = 8,
|
||||||
|
N7 = 9,
|
||||||
|
N6 = 10,
|
||||||
|
N5 = 11,
|
||||||
|
N4 = 12,
|
||||||
|
N3 = 13,
|
||||||
|
N2 = 14
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<char> for Card {
|
||||||
|
fn from(value: char) -> Self {
|
||||||
|
match value {
|
||||||
|
'A' => Card::A,
|
||||||
|
'K' => Card::K,
|
||||||
|
'Q' => Card::Q,
|
||||||
|
'J' => Card::J,
|
||||||
|
'T' => Card::T,
|
||||||
|
'9' => Card::N9,
|
||||||
|
'8' => Card::N8,
|
||||||
|
'7' => Card::N7,
|
||||||
|
'6' => Card::N6,
|
||||||
|
'5' => Card::N5,
|
||||||
|
'4' => Card::N4,
|
||||||
|
'3' => Card::N3,
|
||||||
|
'2' => Card::N2,
|
||||||
|
_ => panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Card {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{:?}", self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, PartialOrd, Ord, Eq, Debug)]
|
||||||
|
pub enum Hand {
|
||||||
|
FiveOfAKind(Vec<Card>),
|
||||||
|
FourOfAKind(Vec<Card>),
|
||||||
|
FullHouse(Vec<Card>),
|
||||||
|
ThreeOfAKind(Vec<Card>),
|
||||||
|
TwoPair(Vec<Card>),
|
||||||
|
OnePair(Vec<Card>),
|
||||||
|
HighCard(Vec<Card>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Vec<Card>> for Hand {
|
||||||
|
fn from(value: Vec<Card>) -> Self {
|
||||||
|
let mut cards: HashMap<String, usize> = HashMap::new();
|
||||||
|
for c in value.iter().clone() {
|
||||||
|
*cards.entry(c.to_string()).or_insert(0) += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
match cards.values().len() {
|
||||||
|
1 => Hand::FiveOfAKind(value), // can only be five of a kind
|
||||||
|
2 => { // Can be four of a kind or Full house
|
||||||
|
if *cards.values().sorted().rev().collect::<Vec<&usize>>()[0] == 4 {
|
||||||
|
Hand::FourOfAKind(value)
|
||||||
|
} else {
|
||||||
|
Hand::FullHouse(value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
3 => { // Can be two pairs or three of a kind
|
||||||
|
if *cards.values().sorted().rev().collect::<Vec<&usize>>()[0] == 3 {
|
||||||
|
Hand::ThreeOfAKind(value)
|
||||||
|
} else {
|
||||||
|
Hand::TwoPair(value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
4 => Hand::OnePair(value), // can only be one pair
|
||||||
|
5 => Hand::HighCard(value), // can only be high card
|
||||||
|
_ => panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn execute_task01(content: &str) {
|
||||||
|
let start = Instant::now();
|
||||||
|
let product_correct_races = solve_01(content).unwrap();
|
||||||
|
let duration = start.elapsed();
|
||||||
|
|
||||||
|
assert_eq!(247815719, product_correct_races);
|
||||||
|
println!("Day07 - Task01 - Duration: {duration:?} - Poker Ranks: {}", product_correct_races)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn execute_task02(content: &str) {
|
||||||
|
let start = Instant::now();
|
||||||
|
let product_correct_races = solve_02(content).unwrap();
|
||||||
|
let duration = start.elapsed();
|
||||||
|
|
||||||
|
assert_eq!(32583852, product_correct_races);
|
||||||
|
println!("Day07 - Task02 - Duration: {duration:?} - Correct Race (with Joker): {}", product_correct_races)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_01(content: &str) -> anyhow::Result<usize> {
|
||||||
|
Ok(content
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.split_once(" ").unwrap())
|
||||||
|
.map(|(hand, bid)| (hand.chars().map(|c| Card::from(c)).collect::<Vec<Card>>(), bid.parse::<usize>().unwrap()))
|
||||||
|
.map(|(hand, bid)| (Hand::from(hand), bid))
|
||||||
|
.sorted_by(|(hand, _), (second_hand, _)| Ord::cmp(hand, second_hand))
|
||||||
|
.rev()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(index, (_, bid))| (index + 1) * bid)
|
||||||
|
.sum())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_02(content: &str) -> anyhow::Result<i64> {
|
||||||
|
Ok(content
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.split_once(" ").unwrap())
|
||||||
|
.map(|(hand, bid)| (hand.chars().map(|c| Card::from(c)).collect::<Vec<Card>>(), bid.parse::<usize>().unwrap()))
|
||||||
|
.map(|(hand, bid)| (Hand::from(hand), bid))
|
||||||
|
.sorted_by(|(hand, _), (second_hand, _)| Ord::cmp(hand, second_hand))
|
||||||
|
.rev()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(index, (_, bid))| (index + 1) * bid)
|
||||||
|
.sum())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_solve_01() {
|
||||||
|
let example = r#"32T3K 765
|
||||||
|
T55J5 684
|
||||||
|
KK677 28
|
||||||
|
KTJJT 220
|
||||||
|
QQQJA 483"#;
|
||||||
|
|
||||||
|
let result = solve_01(example).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(6440, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_solve_02() {
|
||||||
|
let example = r#"32T3K 765
|
||||||
|
T55J5 684
|
||||||
|
KK677 28
|
||||||
|
KTJJT 220
|
||||||
|
QQQJA 483"#;
|
||||||
|
|
||||||
|
let result = solve_02(example).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(5905g, result);
|
||||||
|
}
|
1000
src/input/day07/input.txt
Normal file
1000
src/input/day07/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,7 @@ mod day03;
|
|||||||
mod day04;
|
mod day04;
|
||||||
mod day05;
|
mod day05;
|
||||||
mod day06;
|
mod day06;
|
||||||
|
mod day07;
|
||||||
|
|
||||||
const CONTENT01: &'static str = include_str!("input/day01/input.txt");
|
const CONTENT01: &'static str = include_str!("input/day01/input.txt");
|
||||||
const CONTENT02: &'static str = include_str!("input/day02/input.txt");
|
const CONTENT02: &'static str = include_str!("input/day02/input.txt");
|
||||||
@ -12,6 +13,7 @@ const CONTENT03: &'static str = include_str!("input/day03/input.txt");
|
|||||||
const CONTENT04: &'static str = include_str!("input/day04/input.txt");
|
const CONTENT04: &'static str = include_str!("input/day04/input.txt");
|
||||||
const CONTENT05: &'static str = include_str!("input/day05/input.txt");
|
const CONTENT05: &'static str = include_str!("input/day05/input.txt");
|
||||||
const CONTENT06: &'static str = include_str!("input/day06/input.txt");
|
const CONTENT06: &'static str = include_str!("input/day06/input.txt");
|
||||||
|
const CONTENT07: &'static str = include_str!("input/day07/input.txt");
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
day01::execute_task01(CONTENT01);
|
day01::execute_task01(CONTENT01);
|
||||||
@ -31,4 +33,7 @@ fn main() {
|
|||||||
println!();
|
println!();
|
||||||
day06::execute_task01(CONTENT06);
|
day06::execute_task01(CONTENT06);
|
||||||
day06::execute_task02(CONTENT06);
|
day06::execute_task02(CONTENT06);
|
||||||
|
println!();
|
||||||
|
day07::execute_task01(CONTENT07);
|
||||||
|
day07::execute_task02(CONTENT07);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user