From 68e522ed2da2e8cc2fb3f26ee2b2caac75e896c2 Mon Sep 17 00:00:00 2001 From: Spectre Date: Fri, 8 Dec 2023 17:55:19 +0100 Subject: [PATCH] day 07 pt 1 --- aoc2023/src/day07.rs | 56 +++++++++++++++++++++++++++++++++++++++++++- data/2023/day07 | 5 ++++ src/main.rs | 4 ++-- 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 data/2023/day07 diff --git a/aoc2023/src/day07.rs b/aoc2023/src/day07.rs index b8194ec..f435fcb 100644 --- a/aoc2023/src/day07.rs +++ b/aoc2023/src/day07.rs @@ -1,13 +1,67 @@ +use std::cmp::Ordering; +use std::collections::{HashMap}; +use std::iter::zip; use shared::{Solution, Answer}; pub struct Day07; impl Solution for Day07 { fn part_1(&self, input: &str) -> Answer { - Answer::Unimplemented + let lines: Vec<&str> = input.split("\n").collect(); + let mut hands: Vec<(&str, u64)> = lines.iter().map(|l| + { + let x = l.split(" ").collect::>(); + (x[0], x[1].parse::().unwrap()) + } + ).collect(); + + hands.sort_by(compare); + + let res: u64 = hands.iter() + .enumerate() + .map(|(i, (hand, bet))| ((i+1) as u64) * bet + ).sum(); + + Answer::from(res) } fn part_2(&self, input: &str) -> Answer { Answer::Unimplemented } } + +fn compare(hand1: &(&str, u64), hand2: &(&str, u64)) -> Ordering { + let mut s: HashMap = HashMap::new(); + let mut o: HashMap = HashMap::new(); + + for c in hand1.0.chars() { + s.insert(c, match s.get(&c) { + Some(v) => v+1, + None => 1 + }); + } + + for c in hand2.0.chars() { + o.insert(c, match o.get(&c) { + Some(v) => v+1, + None => 1 + }); + } + + if ( s.keys().count() < o.keys().count() ) | + ( s.values().max() > o.values().max() ) { return Ordering::Greater } + else if ( s.keys().count() > o.keys().count() ) | + ( s.values().max() < o.values().max() ) { return Ordering::Less } + + let ordering = vec!['A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2']; + + for (i, j) in zip(hand1.0.chars(), hand2.0.chars()) { + if ordering.iter().position(|&x| x==i) < ordering.iter().position(|&x| x==j) { + return Ordering::Greater + } else if ordering.iter().position(|&x| x==i) > ordering.iter().position(|&x| x==j) { + return Ordering::Less + } + } + + return Ordering::Equal +} diff --git a/data/2023/day07 b/data/2023/day07 new file mode 100644 index 0000000..bf2815e --- /dev/null +++ b/data/2023/day07 @@ -0,0 +1,5 @@ +32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483 \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 76cc2dd..b4ed939 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,10 +8,10 @@ use std::time::Instant; fn main() { let now = Instant::now(); - let Ok(data) = load_actual(2023, 4) + let Ok(data) = load_actual(2023, 7) else { return; }; - let result = aoc2023::day04::Day04.part_2(&data); + let result = aoc2023::day07::Day07.part_1(&data); let elapsed = now.elapsed();