61 lines
1.5 KiB
Rust
61 lines
1.5 KiB
Rust
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::*;
|
|
}
|