Day 1 Part 1 and Part 2
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
|||||||
/target
|
/target
|
||||||
Days/*/target
|
Days/*/*/target
|
||||||
|
|||||||
6
.idea/adventofcode.iml
generated
6
.idea/adventofcode.iml
generated
@@ -2,9 +2,11 @@
|
|||||||
<module type="EMPTY_MODULE" version="4">
|
<module type="EMPTY_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<sourceFolder url="file://$MODULE_DIR$/Days/One/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/Days/One/OnePart1/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/Days/One/OnePart2/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/Days/One/target" />
|
<excludeFolder url="file://$MODULE_DIR$/Days/One/OnePart1/target" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/Days/One/OnePart2/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
|
|||||||
@@ -57,16 +57,44 @@
|
|||||||
//
|
//
|
||||||
// Your actual left and right lists contain many location IDs. What is the total distance between your lists?
|
// Your actual left and right lists contain many location IDs. What is the total distance between your lists?
|
||||||
|
|
||||||
use std::fs;
|
use std::fs::File;
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
fn compute(left: Vec<i64>, right: Vec<i64>) -> i64 {
|
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>) {
|
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() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
let (left, right) = load_lists();
|
||||||
|
println!("{:?}", compute(left, right));
|
||||||
}
|
}
|
||||||
7
Days/One/OnePart2/Cargo.lock
generated
Normal file
7
Days/One/OnePart2/Cargo.lock
generated
Normal 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"
|
||||||
6
Days/One/OnePart2/Cargo.toml
Normal file
6
Days/One/OnePart2/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "OnePart2"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
1000
Days/One/OnePart2/Input
Normal file
1000
Days/One/OnePart2/Input
Normal file
File diff suppressed because it is too large
Load Diff
129
Days/One/OnePart2/src/main.rs
Normal file
129
Days/One/OnePart2/src/main.rs
Normal 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());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user