Add day 5, 6, 7

This commit is contained in:
2023-12-07 15:11:53 +01:00
parent e9c32fd1fe
commit 04d9bfd5c8
16 changed files with 1653 additions and 0 deletions

1
2023/day7/day7/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

7
2023/day7/day7/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 = "day7"
version = "0.1.0"

View File

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

1001
2023/day7/day7/input.txt Normal file

File diff suppressed because it is too large Load Diff

148
2023/day7/day7/src/main.rs Normal file
View File

@@ -0,0 +1,148 @@
use std::collections::HashMap;
use std::fs::File;
use std::io::{BufRead, BufReader};
fn get_score(item: (&str, i32)) -> (i32, Vec<i32>) {
let (hand, bid) = item;
let mut counts: HashMap<char, i32> = HashMap::new();
for c in hand.chars() {
*counts.entry(c).or_insert(0) += 1;
}
let mut values: Vec<i32> = Vec::new();
for c in hand.chars() {
values.push(match c {
'2' => 0,
'3' => 1,
'4' => 2,
'5' => 3,
'6' => 4,
'7' => 5,
'8' => 6,
'9' => 7,
'T' => 8,
'J' => 9,
'Q' => 10,
'K' => 11,
'A' => 12,
_ => 0,
});
}
let mut counts_vec: Vec<i32> = counts.values().cloned().collect();
counts_vec.sort();
let type_value = if counts_vec.contains(&5) {
10
} else if counts_vec.contains(&4) {
9
} else if counts_vec.contains(&3) {
if counts_vec.contains(&2) {
8
} else {
7
}
} else if counts_vec.contains(&2) {
if counts_vec.iter().filter(|&&x| x == 2).count() == 2 {
6
} else {
5
}
} else {
4
};
(type_value, values)
}
fn get_score_part2(item: (&str, i32)) -> (i32, Vec<i32>) {
let (hand, bid) = item;
let counts: Vec<i32> = {
let mut count_map: HashMap<char, i32> = HashMap::new();
for c in hand.replace('J', "").chars() {
*count_map.entry(c).or_insert(0) += 1;
}
let mut counts: Vec<i32> = count_map.values().cloned().collect();
counts.sort();
if let Some(last_count) = counts.last_mut() {
*last_count += hand.matches('J').count() as i32;
} else {
counts.push(5);
}
counts
};
let values: Vec<i32> = hand
.chars()
.map(|c| match c {
'J' => 0,
'2' => 1,
'3' => 2,
'4' => 3,
'5' => 4,
'6' => 5,
'7' => 6,
'8' => 7,
'9' => 8,
'T' => 9,
'Q' => 10,
'K' => 11,
'A' => 12,
_ => 0,
})
.collect();
let mut counts_vec: Vec<i32> = counts.clone();
counts_vec.sort();
let type_value = if counts.contains(&5) {
10
} else if counts.contains(&4) {
9
} else if counts.contains(&3) {
if counts.contains(&2) {
8
} else {
7
}
} else if counts.contains(&2) {
if counts.iter().filter(|&&x| x == 2).count() == 2 {
6
} else {
5
}
} else {
4
};
(type_value, values)
}
fn main() {
let file = File::open("input.txt").expect("Failed to open file");
let reader = BufReader::new(file);
let mut hands: Vec<(String, i32)> = Vec::new();
let lines = reader.lines().map(|l| l.unwrap());
for line in lines {
let mut iter = line.split_whitespace();
if let (Some(hand), Some(bid)) = (iter.next(), iter.next()) {
hands.push((hand.to_string(), bid.parse().unwrap()));
}
}
// Part 1
//hands.sort_by_key(|(hand, bid)| get_score((&hand.clone(), *bid)));
// Part 2
hands.sort_by_key(|(hand, bid)| get_score_part2((&hand.clone(), *bid)));
let mut total = 0;
for (i, (_, bid)) in hands.iter().enumerate() {
total += bid * (i as i32 + 1);
}
println!("Total: {}", total);
}