Add day 5, 6, 7
This commit is contained in:
1
2023/day7/day7/.gitignore
vendored
Normal file
1
2023/day7/day7/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
7
2023/day7/day7/Cargo.lock
generated
Normal file
7
2023/day7/day7/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 = "day7"
|
||||
version = "0.1.0"
|
8
2023/day7/day7/Cargo.toml
Normal file
8
2023/day7/day7/Cargo.toml
Normal 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
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
148
2023/day7/day7/src/main.rs
Normal 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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user