Do day 7 challenge
This commit is contained in:
parent
da12b07502
commit
8c7567b21b
196
src/07part1.rs
Normal file
196
src/07part1.rs
Normal file
|
@ -0,0 +1,196 @@
|
|||
use std::{fs, cmp::Ordering};
|
||||
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
enum Card {
|
||||
None = 0,
|
||||
Two = 2,
|
||||
Three = 3,
|
||||
Four = 4,
|
||||
Five = 5,
|
||||
Six = 6,
|
||||
Seven = 7,
|
||||
Eight = 8,
|
||||
Nine = 9,
|
||||
Ten = 10,
|
||||
Jack = 11,
|
||||
Queen = 12,
|
||||
King = 13,
|
||||
Ace = 14
|
||||
}
|
||||
|
||||
impl Copy for Card {}
|
||||
|
||||
impl Clone for Card {
|
||||
fn clone(&self) -> Self {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
enum HandType {
|
||||
FiveOfAKind = 6,
|
||||
FourOfAKind = 5,
|
||||
FullHouse = 4,
|
||||
ThreeOfAKind = 3,
|
||||
TwoPair = 2,
|
||||
OnePair = 1,
|
||||
HighCard = 0,
|
||||
}
|
||||
|
||||
#[derive(Eq, Debug)]
|
||||
struct Hand {
|
||||
bet: u128,
|
||||
hand_type: HandType,
|
||||
cards: Vec<Card>,
|
||||
}
|
||||
|
||||
impl Ord for Hand {
|
||||
fn cmp(&self, other: &Self) -> Ordering {
|
||||
if self.hand_type.ne(&other.hand_type) {
|
||||
return self.hand_type.cmp(&other.hand_type);
|
||||
}
|
||||
if self.cards[0].ne(&other.cards[0]) {
|
||||
return self.cards[0].cmp(&other.cards[0]);
|
||||
}
|
||||
if self.cards[1].ne(&other.cards[1]) {
|
||||
return self.cards[1].cmp(&other.cards[1]);
|
||||
}
|
||||
if self.cards[2].ne(&other.cards[2]) {
|
||||
return self.cards[2].cmp(&other.cards[2]);
|
||||
}
|
||||
if self.cards[3].ne(&other.cards[3]) {
|
||||
return self.cards[3].cmp(&other.cards[3]);
|
||||
}
|
||||
return self.cards[4].cmp(&other.cards[4]);
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Hand {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Hand {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.cards == other.cards
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let file_path = "input/07input.txt";
|
||||
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||
let mut lines = contents.lines();
|
||||
let mut hands: Vec<Hand> = Vec::new();
|
||||
loop {
|
||||
let line = lines.next();
|
||||
if line.is_none() {
|
||||
break;
|
||||
}
|
||||
let mut line_parts = line.unwrap().split_whitespace();
|
||||
let hand_cards: Vec<Card> = line_parts.next().unwrap().chars().map(|x| match x{
|
||||
'2' => Card::Two,
|
||||
'3' => Card::Three,
|
||||
'4' => Card::Four,
|
||||
'5' => Card::Five,
|
||||
'6' => Card::Six,
|
||||
'7' => Card::Seven,
|
||||
'8' => Card::Eight,
|
||||
'9' => Card::Nine,
|
||||
'T' => Card::Ten,
|
||||
'J' => Card::Jack,
|
||||
'Q' => Card::Queen,
|
||||
'K' => Card::King,
|
||||
'A' => Card::Ace,
|
||||
_ => Card::None,
|
||||
}).collect();
|
||||
let bet = line_parts.next().unwrap().parse::<u128>().ok().unwrap();
|
||||
let hand = hand_from_cards(bet, hand_cards);
|
||||
let loc_val: usize;
|
||||
match hands.binary_search_by(|probe| probe.cmp(&hand)) {
|
||||
Ok(v) => loc_val = v,
|
||||
Err(v) => loc_val = v,
|
||||
}
|
||||
hands.insert(loc_val, hand);
|
||||
}
|
||||
let mut total_winnings: u128 = 0;
|
||||
for i in 0..hands.len() {
|
||||
total_winnings += hands[i].bet * (i + 1).to_string().parse::<u128>().ok().unwrap();
|
||||
}
|
||||
println!("{}", total_winnings);
|
||||
}
|
||||
|
||||
fn hand_from_cards(bet: u128, cards: Vec<Card>) -> Hand {
|
||||
let hand_type: HandType;
|
||||
if cards[0] == cards[1] && cards[1] == cards[2] && cards[2] == cards[3] && cards[3] == cards[4] { // AAAAA
|
||||
hand_type = HandType::FiveOfAKind;
|
||||
} else if
|
||||
(cards[0] == cards[1] && cards[1] == cards[2] && cards[2] == cards[3]) || // AAAAB
|
||||
(cards[0] == cards[2] && cards[2] == cards[3] && cards[3] == cards[4]) || // ABAAA
|
||||
(cards[0] == cards[1] && cards[1] == cards[3] && cards[3] == cards[4]) || // AABAA
|
||||
(cards[0] == cards[1] && cards[1] == cards[2] && cards[2] == cards[4]) || // AAABA
|
||||
(cards[1] == cards[2] && cards[2] == cards[3] && cards[3] == cards[4]) // BAAAA
|
||||
{
|
||||
hand_type = HandType::FourOfAKind;
|
||||
} else if
|
||||
(cards[0] == cards[1] && cards[1] == cards[2] && cards[3] == cards[4]) || // AAABB
|
||||
(cards[0] == cards[1] && cards[1] == cards[3] && cards[2] == cards[4]) || // AABAB
|
||||
(cards[0] == cards[1] && cards[1] == cards[4] && cards[2] == cards[3]) || // AABBA
|
||||
(cards[0] == cards[2] && cards[2] == cards[3] && cards[1] == cards[4]) || // ABAAB
|
||||
(cards[0] == cards[2] && cards[2] == cards[4] && cards[1] == cards[3]) || // ABABA
|
||||
(cards[0] == cards[3] && cards[3] == cards[4] && cards[1] == cards[2]) || // ABBAA
|
||||
(cards[1] == cards[2] && cards[2] == cards[3] && cards[0] == cards[4]) || // BAAAB
|
||||
(cards[1] == cards[2] && cards[2] == cards[4] && cards[0] == cards[3]) || // BAABA
|
||||
(cards[1] == cards[3] && cards[3] == cards[4] && cards[0] == cards[2]) || // BABAA
|
||||
(cards[2] == cards[3] && cards[3] == cards[4] && cards[0] == cards[1]) // BBAAA
|
||||
{
|
||||
hand_type = HandType::FullHouse;
|
||||
} else if
|
||||
(cards[0] == cards[1] && cards[1] == cards[2]) || // AAABC
|
||||
(cards[0] == cards[1] && cards[1] == cards[3]) || // AABAC
|
||||
(cards[0] == cards[1] && cards[1] == cards[4]) || // AABCA
|
||||
(cards[0] == cards[2] && cards[2] == cards[3]) || // ABAAC
|
||||
(cards[0] == cards[2] && cards[2] == cards[4]) || // ABACA
|
||||
(cards[0] == cards[3] && cards[3] == cards[4]) || // ABCAA
|
||||
(cards[1] == cards[2] && cards[2] == cards[3]) || // BAAAC
|
||||
(cards[1] == cards[2] && cards[2] == cards[4]) || // BAACA
|
||||
(cards[1] == cards[3] && cards[3] == cards[4]) || // BACAA
|
||||
(cards[2] == cards[3] && cards[3] == cards[4]) // BCAAA
|
||||
{
|
||||
hand_type = HandType::ThreeOfAKind;
|
||||
} else if
|
||||
(cards[0] == cards[1] && cards[2] == cards[3]) || // AABBC
|
||||
(cards[0] == cards[1] && cards[2] == cards[4]) || // AABCB
|
||||
(cards[0] == cards[1] && cards[3] == cards[4]) || // AACBB
|
||||
(cards[0] == cards[2] && cards[1] == cards[3]) || // ABABC
|
||||
(cards[0] == cards[2] && cards[1] == cards[4]) || // ABACB
|
||||
(cards[0] == cards[2] && cards[3] == cards[4]) || // ACABB
|
||||
(cards[0] == cards[3] && cards[1] == cards[2]) || // ABBAC
|
||||
(cards[0] == cards[3] && cards[1] == cards[4]) || // ABCAB
|
||||
(cards[0] == cards[3] && cards[2] == cards[4]) || // ACBAB
|
||||
(cards[0] == cards[4] && cards[1] == cards[2]) || // ABBCA
|
||||
(cards[0] == cards[4] && cards[1] == cards[3]) || // ABCBA
|
||||
(cards[0] == cards[4] && cards[2] == cards[3]) || // ACBBA
|
||||
(cards[1] == cards[2] && cards[3] == cards[4]) || // CAABB
|
||||
(cards[1] == cards[3] && cards[2] == cards[4]) || // CABAB
|
||||
(cards[1] == cards[4] && cards[2] == cards[3]) // CABBA
|
||||
{
|
||||
hand_type = HandType::TwoPair;
|
||||
} else if
|
||||
cards[0] == cards[1] || // AABCD
|
||||
cards[0] == cards[2] || // ABACD
|
||||
cards[0] == cards[3] || // ABCAD
|
||||
cards[0] == cards[4] || // ABCDA
|
||||
cards[1] == cards[2] || // BAACD
|
||||
cards[1] == cards[3] || // BACAD
|
||||
cards[1] == cards[4] || // BACDA
|
||||
cards[2] == cards[3] || // BCAAD
|
||||
cards[2] == cards[4] || // BCADA
|
||||
cards[3] == cards[4] // BCDAA
|
||||
{
|
||||
hand_type = HandType::OnePair;
|
||||
} else { // ABCDE
|
||||
hand_type = HandType::HighCard;
|
||||
}
|
||||
return Hand {bet, hand_type, cards};
|
||||
}
|
203
src/07part2.rs
Normal file
203
src/07part2.rs
Normal file
|
@ -0,0 +1,203 @@
|
|||
use std::{fs, cmp::Ordering, collections::HashMap};
|
||||
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
|
||||
enum Card {
|
||||
None = 0,
|
||||
Joker = 1,
|
||||
Two = 2,
|
||||
Three = 3,
|
||||
Four = 4,
|
||||
Five = 5,
|
||||
Six = 6,
|
||||
Seven = 7,
|
||||
Eight = 8,
|
||||
Nine = 9,
|
||||
Ten = 10,
|
||||
Queen = 12,
|
||||
King = 13,
|
||||
Ace = 14
|
||||
}
|
||||
|
||||
impl Copy for Card {}
|
||||
|
||||
impl Clone for Card {
|
||||
fn clone(&self) -> Self {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
enum HandType {
|
||||
FiveOfAKind = 6,
|
||||
FourOfAKind = 5,
|
||||
FullHouse = 4,
|
||||
ThreeOfAKind = 3,
|
||||
TwoPair = 2,
|
||||
OnePair = 1,
|
||||
HighCard = 0,
|
||||
}
|
||||
|
||||
#[derive(Eq, Debug)]
|
||||
struct Hand {
|
||||
bet: u128,
|
||||
hand_type: HandType,
|
||||
cards: Vec<Card>,
|
||||
}
|
||||
|
||||
impl Ord for Hand {
|
||||
fn cmp(&self, other: &Self) -> Ordering {
|
||||
if self.hand_type.ne(&other.hand_type) {
|
||||
return self.hand_type.cmp(&other.hand_type);
|
||||
}
|
||||
if self.cards[0].ne(&other.cards[0]) {
|
||||
return self.cards[0].cmp(&other.cards[0]);
|
||||
}
|
||||
if self.cards[1].ne(&other.cards[1]) {
|
||||
return self.cards[1].cmp(&other.cards[1]);
|
||||
}
|
||||
if self.cards[2].ne(&other.cards[2]) {
|
||||
return self.cards[2].cmp(&other.cards[2]);
|
||||
}
|
||||
if self.cards[3].ne(&other.cards[3]) {
|
||||
return self.cards[3].cmp(&other.cards[3]);
|
||||
}
|
||||
return self.cards[4].cmp(&other.cards[4]);
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Hand {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Hand {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.cards == other.cards
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let file_path = "input/07input.txt";
|
||||
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||
let mut lines = contents.lines();
|
||||
let mut hands: Vec<Hand> = Vec::new();
|
||||
loop {
|
||||
let line = lines.next();
|
||||
if line.is_none() {
|
||||
break;
|
||||
}
|
||||
let mut line_parts = line.unwrap().split_whitespace();
|
||||
let hand_cards: Vec<Card> = line_parts.next().unwrap().chars().map(|x| match x{
|
||||
'2' => Card::Two,
|
||||
'3' => Card::Three,
|
||||
'4' => Card::Four,
|
||||
'5' => Card::Five,
|
||||
'6' => Card::Six,
|
||||
'7' => Card::Seven,
|
||||
'8' => Card::Eight,
|
||||
'9' => Card::Nine,
|
||||
'T' => Card::Ten,
|
||||
'J' => Card::Joker,
|
||||
'Q' => Card::Queen,
|
||||
'K' => Card::King,
|
||||
'A' => Card::Ace,
|
||||
_ => Card::None,
|
||||
}).collect();
|
||||
let bet = line_parts.next().unwrap().parse::<u128>().ok().unwrap();
|
||||
let hand = hand_from_cards(bet, hand_cards);
|
||||
let loc_val: usize;
|
||||
match hands.binary_search_by(|probe| probe.cmp(&hand)) {
|
||||
Ok(v) => loc_val = v,
|
||||
Err(v) => loc_val = v,
|
||||
}
|
||||
hands.insert(loc_val, hand);
|
||||
}
|
||||
let mut total_winnings: u128 = 0;
|
||||
for i in 0..hands.len() {
|
||||
total_winnings += hands[i].bet * (i + 1).to_string().parse::<u128>().ok().unwrap();
|
||||
}
|
||||
println!("{}", total_winnings);
|
||||
}
|
||||
|
||||
fn hand_from_cards(bet: u128, cards: Vec<Card>) -> Hand {
|
||||
let hand_type: HandType;
|
||||
let mut cards_map = HashMap::new();
|
||||
for card in cards.iter() {
|
||||
if cards_map.get(&card).is_none() {
|
||||
cards_map.insert(card, 0);
|
||||
}
|
||||
cards_map.insert(&card, 1+cards_map.get(&card).unwrap());
|
||||
}
|
||||
let mut hand_cards: Vec<Card> = Vec::new();
|
||||
let mut hand_card_counts = Vec::new();
|
||||
for card in cards_map.keys() {
|
||||
for _i in 0..cards_map[card] {
|
||||
let mut matched = false;
|
||||
for j in 0..hand_card_counts.len() {
|
||||
if hand_card_counts[j] > cards_map[card] {
|
||||
hand_card_counts.insert(j, cards_map[card]);
|
||||
hand_cards.insert(j, *card.to_owned());
|
||||
matched = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if !matched && hand_card_counts.len() > 0 {
|
||||
hand_card_counts.insert(hand_card_counts.len()-1, cards_map[card]);
|
||||
hand_cards.insert(hand_card_counts.len()-1, *card.to_owned());
|
||||
} else if !matched {
|
||||
hand_card_counts.insert(0, cards_map[card]);
|
||||
hand_cards.insert(0, *card.to_owned());
|
||||
}
|
||||
}
|
||||
}
|
||||
hand_cards.reverse();
|
||||
if
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[1] == hand_cards[2] && hand_cards[2] == hand_cards[3] && hand_cards[3] == hand_cards[4]) || // AAAAA
|
||||
(hand_cards[4] == Card::Joker && hand_cards[0] == hand_cards[1] && hand_cards[1] == hand_cards[2] && hand_cards[2] == hand_cards[3]) || // AAAAJ
|
||||
(hand_cards[3] == Card::Joker && hand_cards[4] == Card::Joker && hand_cards[0] == hand_cards[1] && hand_cards[1] == hand_cards[2]) || // AAAJJ
|
||||
(hand_cards[0] == Card::Joker && hand_cards[1] == Card::Joker && hand_cards[2] == Card::Joker && hand_cards[3] == hand_cards[4]) || // JJJAA
|
||||
(hand_cards[2] == Card::Joker && hand_cards[3] == Card::Joker && hand_cards[0] == Card::Joker && hand_cards[1] == Card::Joker) // JJJJA
|
||||
{
|
||||
hand_type = HandType::FiveOfAKind;
|
||||
} else if
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[1] == hand_cards[2] && hand_cards[2] == hand_cards[3]) || // AAAAB
|
||||
(hand_cards[3] == Card::Joker && hand_cards[1] == hand_cards[2] && hand_cards[2] == hand_cards[0]) || // AAAJB
|
||||
(hand_cards[4] == Card::Joker && hand_cards[1] == hand_cards[2] && hand_cards[2] == hand_cards[0]) || // AAABJ
|
||||
(hand_cards[2] == Card::Joker && hand_cards[3] == Card::Joker && hand_cards[0] == hand_cards[1]) || // AAJJB
|
||||
(hand_cards[0] == Card::Joker && hand_cards[1] == Card::Joker && hand_cards[2] == hand_cards[3]) || // JJAAB
|
||||
(hand_cards[1] == Card::Joker && hand_cards[2] == Card::Joker && hand_cards[0] == Card::Joker) // JJJAB
|
||||
{
|
||||
hand_type = HandType::FourOfAKind;
|
||||
} else if
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[1] == hand_cards[2] && hand_cards[3] == hand_cards[4]) || // AAABB
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[2] == hand_cards[3] && hand_cards[4] == Card::Joker) // AABBJ
|
||||
{
|
||||
hand_type = HandType::FullHouse;
|
||||
} else if
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[1] == hand_cards[2]) || // AAABC
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[2] == Card::Joker) || // AAJBC
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[3] == Card::Joker) || // AABJC
|
||||
(hand_cards[0] == hand_cards[1] && hand_cards[4] == Card::Joker) || // AABCJ
|
||||
(hand_cards[0] == Card::Joker && hand_cards[1] == Card::Joker) // JJABC
|
||||
{
|
||||
hand_type = HandType::ThreeOfAKind;
|
||||
} else if
|
||||
hand_cards[0] == hand_cards[1] && hand_cards[2] == hand_cards[3] // AABBC
|
||||
{
|
||||
hand_type = HandType::TwoPair;
|
||||
} else if
|
||||
hand_cards[0] == hand_cards[1] || // AABCD
|
||||
hand_cards[0] == Card::Joker || // JABCD
|
||||
hand_cards[1] == Card::Joker || // AJBCD
|
||||
hand_cards[2] == Card::Joker || // ABJCD
|
||||
hand_cards[3] == Card::Joker || // ABCJD
|
||||
hand_cards[4] == Card::Joker // ABCDJ
|
||||
{
|
||||
hand_type = HandType::OnePair;
|
||||
} else { // ABCDE
|
||||
hand_type = HandType::HighCard;
|
||||
}
|
||||
// println!("{:?} {:?}", hand_cards, hand_type);
|
||||
return Hand {bet, hand_type, cards};
|
||||
}
|
Loading…
Reference in New Issue
Block a user