Day 1 Part 1 and Part 2

This commit is contained in:
2024-12-01 02:01:12 -05:00
parent 5dc85071e6
commit caca9c927d
10 changed files with 1180 additions and 8 deletions

View File

@@ -57,16 +57,44 @@
//
// Your actual left and right lists contain many location IDs. What is the total distance between your lists?
use std::fs;
fn compute(left: Vec<i64>, right: Vec<i64>) -> i64 {
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
// Function to do the computing
fn compute(mut left: Vec<i64>, mut right: Vec<i64>) -> i64 {
let mut sum: i64 = 0;
let mut idx = 0;
// Sort the lists
left.sort();
right.sort();
// Compare and sum the lists
for left_item in left.clone() {
let right_item = right[idx];
sum = sum + (left_item - right_item).abs();
idx += 1;
}
sum
}
// Function to load the lists
fn load_lists() -> (Vec<i64>, Vec<i64>) {
let mut left: Vec<i64> = vec![0];
let mut right: Vec<i64> = vec![0];
// Load the inputs file in
let file = File::open(Path::new("./input")).unwrap();
let reader = BufReader::new(file);
for line in reader.lines() {
let line = line.unwrap();
let mut split = line.split(" ");
let collection = split.collect::<Vec<&str>>();
left.push(collection[0].parse::<i64>().unwrap());
right.push(collection[1].parse::<i64>().unwrap());
}
(left, right)
}
fn main() {
println!("Hello, world!");
let (left, right) = load_lists();
println!("{:?}", compute(left, right));
}

7
Days/One/OnePart2/Cargo.lock generated Normal file
View File

@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "OnePart2"
version = "0.1.0"

View File

@@ -0,0 +1,6 @@
[package]
name = "OnePart2"
version = "0.1.0"
edition = "2021"
[dependencies]

1000
Days/One/OnePart2/Input Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,129 @@
// --- Day 1: Historian Hysteria ---
// The Chief Historian is always present for the big Christmas sleigh launch, but nobody has seen
// him in months! Last anyone heard, he was visiting locations that are historically significant to
// the North Pole; a group of Senior Historians has asked you to accompany them as they check the
// places they think he was most likely to visit.
//
// As each location is checked, they will mark it on their list with a star. They figure the Chief
// Historian must be in one of the first fifty places they'll look, so in order to save Christmas,
// you need to help them get fifty stars on their list before Santa takes off on December 25th.
//
// Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent
// calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one star.
// Good luck!
//
// You haven't even left yet and the group of Elvish Senior Historians has already hit a problem:
// their list of locations to check is currently empty. Eventually, someone decides that the best
// place to check first would be the Chief Historian's office.
//
// Upon pouring into the office, everyone confirms that the Chief Historian is indeed nowhere to be
// found. Instead, the Elves discover an assortment of notes and lists of historically significant
// locations! This seems to be the planning the Chief Historian was doing before he left. Perhaps
// these notes can be used to determine which locations to search?
//
// Throughout the Chief's office, the historically significant locations are listed not by name but
// by a unique number called the location ID. To make sure they don't miss anything, The Historians
// split into two groups, each searching the office and trying to create their own complete list of location IDs.
//
// There's just one problem: by holding the two lists up side by side (your puzzle input), it
// quickly becomes clear that the lists aren't very similar.
// Maybe you can help The Historians reconcile their lists?
//
// For example:
//
// 3 4
// 4 3
// 2 5
// 1 3
// 3 9
// 3 3
// Maybe the lists are only off by a small amount! To find out, pair up the numbers and measure
// how far apart they are. Pair up the smallest number in the left list with the smallest number in
// the right list, then the second-smallest left number with the second-smallest right number, and so on.
//
// Within each pair, figure out how far apart the two numbers are; you'll need to add up all of
// those distances. For example, if you pair up a 3 from the left list with a 7 from the right list,
// the distance apart is 4; if you pair up a 9 with a 3, the distance apart is 6.
//
// In the example list above, the pairs and distances would be as follows:
//
// The smallest number in the left list is 1, and the smallest number in the right list is 3. The
// distance between them is 2.
// The second-smallest number in the left list is 2, and the second-smallest number in the right
// list is another 3. The distance between them is 1.
// The third-smallest number in both lists is 3, so the distance between them is 0.
// The next numbers to pair up are 3 and 4, a distance of 1.
// The fifth-smallest numbers in each list are 3 and 5, a distance of 2.
// Finally, the largest number in the left list is 4, while the largest number in the right list is
// 9; these are a distance 5 apart.
// To find the total distance between the left list and the right list, add up the distances between
// all of the pairs you found. In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11!
//
// Your actual left and right lists contain many location IDs. What is the total distance between
// your lists?
//
// --- Part Two ---
// Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very
// different.
//
// Or are they?
//
// The Historians can't agree on which group made the mistakes or how to read most of the Chief's
// handwriting, but in the commotion you notice an interesting detail: a lot of location IDs appear
// in both lists! Maybe the other numbers aren't location IDs at all but rather misinterpreted handwriting.
//
// This time, you'll need to figure out exactly how often each number from the left list appears in
// the right list. Calculate a total similarity score by adding up each number in the left list
// after multiplying it by the number of times that number appears in the right list.
//
// Here are the same example lists again:
//
// 3 4
// 4 3
// 2 5
// 1 3
// 3 9
// 3 3
// For these example lists, here is the process of finding the similarity score:
//
// The first number in the left list is 3. It appears in the right list three times, so the similarity score increases by 3 * 3 = 9.
// The second number in the left list is 4. It appears in the right list once, so the similarity score increases by 4 * 1 = 4.
// The third number in the left list is 2. It does not appear in the right list, so the similarity score does not increase (2 * 0 = 0).
// The fourth number, 1, also does not appear in the right list.
// The fifth number, 3, appears in the right list three times; the similarity score increases by 9.
// The last number, 3, appears in the right list three times; the similarity score again increases by 9.
// So, for these example lists, the similarity score at the end of this process is 31 (9 + 4 + 0 + 0 + 9 + 9).
//
// Once again consider your left and right lists. What is their similarity score?
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
fn compute(mut left: Vec<i64>, mut right: Vec<i64>) -> i64 {
left.iter().fold(0, |sum, left_item| sum + (left_item * (right.iter().fold(0, |count, right_item| count + (left_item == right_item) as i64))))
}
fn load_lists() -> (Vec<i64>, Vec<i64>) {
let mut left: Vec<i64> = vec![0];
let mut right: Vec<i64> = vec![0];
let file = File::open(Path::new("./input")).unwrap();
let reader = BufReader::new(file);
for line in reader.lines() {
let line = line.unwrap();
let mut split = line.split(" ");
let collection = split.collect::<Vec<&str>>();
left.push(collection[0].parse::<i64>().unwrap());
right.push(collection[1].parse::<i64>().unwrap());
}
(left, right)
}
fn main() {
let (left, right) = load_lists();
use std::time::Instant;
let now = Instant::now();
println!("{:?}", compute(left, right));
let elapsed = now.elapsed();
println!("Elapsed: {:?} seconds.", elapsed.as_micros());
}