Added day 22

This commit is contained in:
Sebastian 2020-12-22 19:59:44 +01:00
parent 95029de42b
commit 32a9676926
4 changed files with 222 additions and 4 deletions

53
inputs/day22.txt Normal file
View File

@ -0,0 +1,53 @@
Player 1:
4
25
3
11
2
29
41
23
30
21
50
8
1
24
27
10
42
43
38
15
18
13
32
37
34
Player 2:
12
6
36
35
40
47
31
9
46
49
19
16
5
26
39
48
7
44
45
20
17
14
33
28
22

View File

@ -1,4 +1,13 @@
mxmxvkd kfcds sqjhc nhms (contains dairy, fish)
trh fvjkl sbzzf mxmxvkd (contains dairy)
sqjhc fvjkl (contains soy)
sqjhc mxmxvkd sbzzf (contains fish)
Player 1:
9
2
6
3
1
Player 2:
5
8
4
7
10

60
src/bin/day22.rs Normal file
View File

@ -0,0 +1,60 @@
use std::error::Error;
use std::fs::File;
use std::io::{self, BufRead};
use std::vec::Vec;
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("inputs/day22.txt")?;
let mut lines = io::BufReader::new(file).lines().map(|l| l.unwrap());
lines.next();
let mut deck1: Vec<u32> = Vec::new();
while let Some(line) = lines.next() {
if line == "" {
break;
}
deck1.push(line.parse().expect("Unable to parse card number"));
}
lines.next();
let mut deck2: Vec<u32> = Vec::new();
while let Some(line) = lines.next() {
if line == "" {
break;
}
deck2.push(line.parse().expect("Unable to parse card number"));
}
while deck1.len() != 0 && deck2.len() != 0 {
println!("Deck 1: {:?}", deck1);
println!("Deck 2: {:?}", deck2);
let card1 = deck1.remove(0);
let card2 = deck2.remove(0);
if card1 > card2 {
println!("Player 1 wins");
deck1.push(card1);
deck1.push(card2);
} else {
println!("Player 2 wins");
deck2.push(card2);
deck2.push(card1);
}
}
let winning_deck = if deck1.len() != 0 { deck1 } else { deck2 };
let points = winning_deck
.iter()
.rev()
.enumerate()
.map(|(pos, card)| ((pos + 1) as u32) * card)
.fold(0, |p, acc| p + acc);
println!("Points: {}", points);
Ok(())
}
#[cfg(test)]
mod tests {
use crate::*;
}

96
src/bin/day22_part2.rs Normal file
View File

@ -0,0 +1,96 @@
use std::collections::HashSet;
use std::error::Error;
use std::fs::File;
use std::io::{self, BufRead};
use std::vec::Vec;
fn recursive_combat(mut deck1: Vec<u32>, mut deck2: Vec<u32>) -> (Vec<u32>, Vec<u32>) {
let mut deck_configs1: HashSet<Vec<u32>> = HashSet::new();
let mut deck_configs2: HashSet<Vec<u32>> = HashSet::new();
while deck1.len() != 0 && deck2.len() != 0 {
println!("Deck 1: {:?}", deck1);
println!("Deck 2: {:?}", deck2);
if deck_configs1.contains(&deck1) || deck_configs2.contains(&deck2) {
println!("Player 1 wins by deck configuration.");
return (deck1, Vec::new());
}
deck_configs1.insert(deck1.clone());
deck_configs2.insert(deck2.clone());
let card1 = deck1.remove(0);
let card2 = deck2.remove(0);
if deck1.len() as u32 >= card1 && deck2.len() as u32 >= card2 {
println!("Recursing !");
let rec_deck1: Vec<u32> = deck1.iter().cloned().take(card1 as usize).collect();
let rec_deck2: Vec<u32> = deck2.iter().cloned().take(card2 as usize).collect();
let (result_deck1, result_deck2) = recursive_combat(rec_deck1, rec_deck2);
if result_deck1.len() > result_deck2.len() {
println!("Player 1 wins by recursion");
deck1.push(card1);
deck1.push(card2);
} else {
println!("Player 2 wins by recursion");
deck2.push(card2);
deck2.push(card1);
}
} else {
if card1 > card2 {
println!("Player 1 wins");
deck1.push(card1);
deck1.push(card2);
} else {
println!("Player 2 wins");
deck2.push(card2);
deck2.push(card1);
}
}
}
return (deck1, deck2);
}
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("inputs/day22.txt")?;
let mut lines = io::BufReader::new(file).lines().map(|l| l.unwrap());
lines.next();
let mut deck1: Vec<u32> = Vec::new();
while let Some(line) = lines.next() {
if line == "" {
break;
}
deck1.push(line.parse().expect("Unable to parse card number"));
}
lines.next();
let mut deck2: Vec<u32> = Vec::new();
while let Some(line) = lines.next() {
if line == "" {
break;
}
deck2.push(line.parse().expect("Unable to parse card number"));
}
let (deck1, deck2) = recursive_combat(deck1, deck2);
let winning_deck = if deck1.len() != 0 { deck1 } else { deck2 };
let points = winning_deck
.iter()
.rev()
.enumerate()
.map(|(pos, card)| ((pos + 1) as u32) * card)
.fold(0, |p, acc| p + acc);
println!("Points: {}", points);
Ok(())
}
#[cfg(test)]
mod tests {
use crate::*;
}