Day 1: Historian Hysteria
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/22323136
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Uiua
For entertainment purposes only, Iβll be trying a solution in Uiua each day until it all gets too much for meβ¦
$ 3 4
$ 4 3
$ 2 5
$ 1 3
$ 3 9
$ 3 3
βββΈβ @\n # Partition at \n.
β(ββ΅β)βΈβ @\s # Partition at space, parse ints, sort.
&p/+/(β΅-). # Part1 : Get abs differences, sum, print.
&p/+Γβ(/+ββ‘β)Β°β # Part 2 : Count instances, mul out, sum, print.
Haskell
Plenty of scope for making part 2 faster, but I think simple is best here. Forgot to sort the lists in the first part, which pushed me waaay off the leaderboard.
import Data.List
main = do
[as, bs] <- transpose . map (map read . words) . lines <$> readFile "input01"
print . sum $ map abs $ zipWith (-) (sort as) (sort bs)
print . sum $ map (\a -> a * length (filter (== a) bs)) as
Nim
Iβve got my first sub-1000 rank today (998 for part 2). Yay!
Simple and straightforward challenge, very fitting for 1st day. Gonna enjoy it while it lasts.
proc solve(input: string): AOCSolution[int, int] =
var l1,l2: seq[int]
for line in input.splitLines():
let pair = line.splitWhitespace()
l1.add parseInt(pair[0])
l2.add parseInt(pair[1])
l1.sort()
l2.sort()
block p1:
for i in 0..l1.high:
result.part1 += abs(l1[i] - l2[i])
block p2:
for n in l1:
result.part2 += n * l2.count(n)
Rust
Right IDs are directly read into a hash map counter.
use std::str::FromStr;
use std::collections::HashMap;
fn part1(input: String) {
let mut left = Vec::new();
let mut right = Vec::new();
for line in input.lines() {
let mut parts = line.split_whitespace()
.map(|p| u32::from_str(p).unwrap());
left.push(parts.next().unwrap());
right.push(parts.next().unwrap());
}
left.sort_unstable();
right.sort_unstable();
let diff: u32 = left.iter().zip(right)
.map(|(l, r)| l.abs_diff(r))
.sum();
println!("{diff}");
}
fn part2(input: String) {
let mut left = Vec::new();
let mut right: HashMap<u32, u32> = HashMap::new();
for line in input.lines() {
let mut parts = line.split_whitespace()
.map(|p| u32::from_str(p).unwrap());
left.push(parts.next().unwrap());
*right.entry(parts.next().unwrap()).or_default() += 1;
}
let similar: u32 = left.iter()
.map(|n| n * right.get(n).copied().unwrap_or_default())
.sum();
println!("{similar}");
}
util::aoc_main!();
TypeScript
Solution
import { AdventOfCodeSolutionFunction } from "./solutions";
function InstancesOf(sorted_array: Array<number>, value: number) {
const index = sorted_array.indexOf(value);
if(index == -1)
return 0;
let sum = 1;
for (let array_index = index + 1; array_index < sorted_array.length; array_index++) {
if(sorted_array[array_index] != value)
break;
sum += 1;
}
return sum;
}
export const solution_1: AdventOfCodeSolutionFunction = (input) => {
const left: Array<number> = [];
const right: Array<number> = [];
const lines = input.split("\n");
for (let index = 0; index < lines.length; index++) {
const element = lines[index].trim();
if(!element)
continue;
const leftRight = element.split(" ");
left.push(Number(leftRight[0]));
right.push(Number(leftRight[1]));
}
const numSort = (a: number, b: number) => a - b;
left.sort(numSort);
right.sort(numSort);
let sum = 0;
for (let index = 0; index < left.length; index++) {
const leftValue = left[index];
const rightValue = right[index];
sum += Math.abs(leftValue - rightValue);
}
const part1 = `Part 1: ${sum}`;
sum = 0;
for (let index = 0; index < left.length; index++) {
sum += left[index] * InstancesOf(right, left[index]);
}
const part2 = `Part 2: ${sum}`;
return `${part1}\n${part2}`;
};
Not the most elegant solution but it works. Decided to reuse the array since it is sorted for both sides.