y2015d13
This commit is contained in:
parent
ea1e7aadec
commit
3486d23f09
56
y2015/resources/13_input.txt
Normal file
56
y2015/resources/13_input.txt
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
Alice would gain 54 happiness units by sitting next to Bob.
|
||||||
|
Alice would lose 81 happiness units by sitting next to Carol.
|
||||||
|
Alice would lose 42 happiness units by sitting next to David.
|
||||||
|
Alice would gain 89 happiness units by sitting next to Eric.
|
||||||
|
Alice would lose 89 happiness units by sitting next to Frank.
|
||||||
|
Alice would gain 97 happiness units by sitting next to George.
|
||||||
|
Alice would lose 94 happiness units by sitting next to Mallory.
|
||||||
|
Bob would gain 3 happiness units by sitting next to Alice.
|
||||||
|
Bob would lose 70 happiness units by sitting next to Carol.
|
||||||
|
Bob would lose 31 happiness units by sitting next to David.
|
||||||
|
Bob would gain 72 happiness units by sitting next to Eric.
|
||||||
|
Bob would lose 25 happiness units by sitting next to Frank.
|
||||||
|
Bob would lose 95 happiness units by sitting next to George.
|
||||||
|
Bob would gain 11 happiness units by sitting next to Mallory.
|
||||||
|
Carol would lose 83 happiness units by sitting next to Alice.
|
||||||
|
Carol would gain 8 happiness units by sitting next to Bob.
|
||||||
|
Carol would gain 35 happiness units by sitting next to David.
|
||||||
|
Carol would gain 10 happiness units by sitting next to Eric.
|
||||||
|
Carol would gain 61 happiness units by sitting next to Frank.
|
||||||
|
Carol would gain 10 happiness units by sitting next to George.
|
||||||
|
Carol would gain 29 happiness units by sitting next to Mallory.
|
||||||
|
David would gain 67 happiness units by sitting next to Alice.
|
||||||
|
David would gain 25 happiness units by sitting next to Bob.
|
||||||
|
David would gain 48 happiness units by sitting next to Carol.
|
||||||
|
David would lose 65 happiness units by sitting next to Eric.
|
||||||
|
David would gain 8 happiness units by sitting next to Frank.
|
||||||
|
David would gain 84 happiness units by sitting next to George.
|
||||||
|
David would gain 9 happiness units by sitting next to Mallory.
|
||||||
|
Eric would lose 51 happiness units by sitting next to Alice.
|
||||||
|
Eric would lose 39 happiness units by sitting next to Bob.
|
||||||
|
Eric would gain 84 happiness units by sitting next to Carol.
|
||||||
|
Eric would lose 98 happiness units by sitting next to David.
|
||||||
|
Eric would lose 20 happiness units by sitting next to Frank.
|
||||||
|
Eric would lose 6 happiness units by sitting next to George.
|
||||||
|
Eric would gain 60 happiness units by sitting next to Mallory.
|
||||||
|
Frank would gain 51 happiness units by sitting next to Alice.
|
||||||
|
Frank would gain 79 happiness units by sitting next to Bob.
|
||||||
|
Frank would gain 88 happiness units by sitting next to Carol.
|
||||||
|
Frank would gain 33 happiness units by sitting next to David.
|
||||||
|
Frank would gain 43 happiness units by sitting next to Eric.
|
||||||
|
Frank would gain 77 happiness units by sitting next to George.
|
||||||
|
Frank would lose 3 happiness units by sitting next to Mallory.
|
||||||
|
George would lose 14 happiness units by sitting next to Alice.
|
||||||
|
George would lose 12 happiness units by sitting next to Bob.
|
||||||
|
George would lose 52 happiness units by sitting next to Carol.
|
||||||
|
George would gain 14 happiness units by sitting next to David.
|
||||||
|
George would lose 62 happiness units by sitting next to Eric.
|
||||||
|
George would lose 18 happiness units by sitting next to Frank.
|
||||||
|
George would lose 17 happiness units by sitting next to Mallory.
|
||||||
|
Mallory would lose 36 happiness units by sitting next to Alice.
|
||||||
|
Mallory would gain 76 happiness units by sitting next to Bob.
|
||||||
|
Mallory would lose 34 happiness units by sitting next to Carol.
|
||||||
|
Mallory would gain 37 happiness units by sitting next to David.
|
||||||
|
Mallory would gain 40 happiness units by sitting next to Eric.
|
||||||
|
Mallory would gain 18 happiness units by sitting next to Frank.
|
||||||
|
Mallory would gain 7 happiness units by sitting next to George.
|
20
y2015/src/bin/d13.rs
Normal file
20
y2015/src/bin/d13.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
use std::fs;
|
||||||
|
|
||||||
|
use y2015::days::d13;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
part1();
|
||||||
|
part2();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1() {
|
||||||
|
let root = env!("CARGO_MANIFEST_DIR");
|
||||||
|
let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap();
|
||||||
|
println!("{}", d13::process_part1(&content));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2() {
|
||||||
|
let root = env!("CARGO_MANIFEST_DIR");
|
||||||
|
let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap();
|
||||||
|
println!("{}", d13::process_part2(&content));
|
||||||
|
}
|
183
y2015/src/days/d13.rs
Normal file
183
y2015/src/days/d13.rs
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
use core::panic;
|
||||||
|
use std::{collections::HashMap, error::Error};
|
||||||
|
|
||||||
|
pub fn process_part1(input: &str) -> i32 {
|
||||||
|
let mut happiness_table = HashMap::new();
|
||||||
|
let mut people = Vec::new();
|
||||||
|
input.lines().for_each(|line| {
|
||||||
|
let words = line.split_whitespace().collect::<Vec<&str>>();
|
||||||
|
let happiness = match words[2] {
|
||||||
|
"gain" => words[3].parse::<i32>().expect("Should be number"),
|
||||||
|
"lose" => -words[3].parse::<i32>().expect("Should be number"),
|
||||||
|
_ => panic!("Should not happen"),
|
||||||
|
};
|
||||||
|
let person = words[0].to_string();
|
||||||
|
let mut next_to = words[10].to_string();
|
||||||
|
next_to.pop();
|
||||||
|
if !people.contains(&person) {
|
||||||
|
people.push(person.clone());
|
||||||
|
}
|
||||||
|
happiness_table.insert((person, next_to), happiness);
|
||||||
|
});
|
||||||
|
|
||||||
|
let num_people = people.len();
|
||||||
|
|
||||||
|
let possible_permutations = factorial(num_people);
|
||||||
|
|
||||||
|
let mut highest_happiness = 0;
|
||||||
|
for idx in 1..possible_permutations {
|
||||||
|
let mut happiness = 0;
|
||||||
|
let permutation = permutation(people.clone(), idx).unwrap();
|
||||||
|
|
||||||
|
for (pos, person) in permutation.clone().iter().enumerate() {
|
||||||
|
let left_neighbor = {
|
||||||
|
if pos == 0 {
|
||||||
|
permutation[num_people - 1].clone()
|
||||||
|
} else {
|
||||||
|
permutation[pos - 1].clone()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let right_neighbor = {
|
||||||
|
if pos == num_people - 1 {
|
||||||
|
permutation[0].clone()
|
||||||
|
} else {
|
||||||
|
permutation[pos + 1].clone()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let left_happiness = happiness_table
|
||||||
|
.get(&(person.to_owned(), left_neighbor))
|
||||||
|
.unwrap();
|
||||||
|
let right_happiness = happiness_table
|
||||||
|
.get(&(person.to_owned(), right_neighbor))
|
||||||
|
.unwrap();
|
||||||
|
happiness += left_happiness + right_happiness;
|
||||||
|
}
|
||||||
|
|
||||||
|
if happiness > highest_happiness {
|
||||||
|
highest_happiness = happiness;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
highest_happiness
|
||||||
|
}
|
||||||
|
|
||||||
|
fn permutation(mut people: Vec<String>, nth: usize) -> Result<Vec<String>, Box<dyn Error>> {
|
||||||
|
people.sort();
|
||||||
|
if nth == 1 {
|
||||||
|
return Ok(people);
|
||||||
|
}
|
||||||
|
if nth > factorial(people.len()) || nth == 0 {
|
||||||
|
return Err(Box::from("Out of bounds"));
|
||||||
|
}
|
||||||
|
let mut perm = Vec::new();
|
||||||
|
let num_unique_locations = people.len();
|
||||||
|
let mut remainder = nth - 1;
|
||||||
|
for idx in 1..=people.len() {
|
||||||
|
let permutations = remainder / factorial(num_unique_locations - idx);
|
||||||
|
remainder %= factorial(num_unique_locations - idx);
|
||||||
|
perm.push(people[permutations].clone());
|
||||||
|
people.remove(permutations);
|
||||||
|
}
|
||||||
|
Ok(perm)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn factorial(num: usize) -> usize {
|
||||||
|
let mut fact = 1;
|
||||||
|
for n in 1..=num {
|
||||||
|
fact *= n;
|
||||||
|
}
|
||||||
|
fact
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn process_part2(input: &str) -> i32 {
|
||||||
|
let mut happiness_table = HashMap::new();
|
||||||
|
let mut people = Vec::new();
|
||||||
|
input.lines().for_each(|line| {
|
||||||
|
let words = line.split_whitespace().collect::<Vec<&str>>();
|
||||||
|
let happiness = match words[2] {
|
||||||
|
"gain" => words[3].parse::<i32>().expect("Should be number"),
|
||||||
|
"lose" => -words[3].parse::<i32>().expect("Should be number"),
|
||||||
|
_ => panic!("Should not happen"),
|
||||||
|
};
|
||||||
|
let person = words[0].to_string();
|
||||||
|
let mut next_to = words[10].to_string();
|
||||||
|
next_to.pop();
|
||||||
|
if !people.contains(&person) {
|
||||||
|
people.push(person.clone());
|
||||||
|
}
|
||||||
|
happiness_table.insert((person, next_to), happiness);
|
||||||
|
});
|
||||||
|
|
||||||
|
for person in &people {
|
||||||
|
happiness_table.insert(("Fabian".to_string(), person.to_owned()), 0);
|
||||||
|
happiness_table.insert((person.to_owned(), "Fabian".to_string()), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
people.push("Fabian".to_string());
|
||||||
|
|
||||||
|
let num_people = people.len();
|
||||||
|
|
||||||
|
let possible_permutations = factorial(num_people);
|
||||||
|
|
||||||
|
let mut highest_happiness = 0;
|
||||||
|
for idx in 1..possible_permutations {
|
||||||
|
let mut happiness = 0;
|
||||||
|
let permutation = permutation(people.clone(), idx).unwrap();
|
||||||
|
|
||||||
|
for (pos, person) in permutation.clone().iter().enumerate() {
|
||||||
|
let left_neighbor = {
|
||||||
|
if pos == 0 {
|
||||||
|
permutation[num_people - 1].clone()
|
||||||
|
} else {
|
||||||
|
permutation[pos - 1].clone()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let right_neighbor = {
|
||||||
|
if pos == num_people - 1 {
|
||||||
|
permutation[0].clone()
|
||||||
|
} else {
|
||||||
|
permutation[pos + 1].clone()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let left_happiness = happiness_table
|
||||||
|
.get(&(person.to_owned(), left_neighbor))
|
||||||
|
.unwrap();
|
||||||
|
let right_happiness = happiness_table
|
||||||
|
.get(&(person.to_owned(), right_neighbor))
|
||||||
|
.unwrap();
|
||||||
|
happiness += left_happiness + right_happiness;
|
||||||
|
}
|
||||||
|
|
||||||
|
if happiness > highest_happiness {
|
||||||
|
highest_happiness = happiness;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
highest_happiness
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests_13 {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const INPUT: &str = "Alice would gain 54 happiness units by sitting next to Bob.
|
||||||
|
Alice would lose 79 happiness units by sitting next to Carol.
|
||||||
|
Alice would lose 2 happiness units by sitting next to David.
|
||||||
|
Bob would gain 83 happiness units by sitting next to Alice.
|
||||||
|
Bob would lose 7 happiness units by sitting next to Carol.
|
||||||
|
Bob would lose 63 happiness units by sitting next to David.
|
||||||
|
Carol would lose 62 happiness units by sitting next to Alice.
|
||||||
|
Carol would gain 60 happiness units by sitting next to Bob.
|
||||||
|
Carol would gain 55 happiness units by sitting next to David.
|
||||||
|
David would gain 46 happiness units by sitting next to Alice.
|
||||||
|
David would lose 7 happiness units by sitting next to Bob.
|
||||||
|
David would gain 41 happiness units by sitting next to Carol.";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_works() {
|
||||||
|
let result = process_part1(INPUT);
|
||||||
|
assert_eq!(result, 330);
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@ pub mod d1;
|
|||||||
pub mod d10;
|
pub mod d10;
|
||||||
pub mod d11;
|
pub mod d11;
|
||||||
pub mod d12;
|
pub mod d12;
|
||||||
|
pub mod d13;
|
||||||
pub mod d2;
|
pub mod d2;
|
||||||
pub mod d3;
|
pub mod d3;
|
||||||
pub mod d4;
|
pub mod d4;
|
||||||
|
Loading…
Reference in New Issue
Block a user