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
Factor
: get-input ( -- left-list right-list )
"vocab:aoc-2024/01/input.txt" utf8 file-lines
[ split-words harvest ] map unzip
[ [ string>number ] map ] bi@ ;
: part1 ( -- n )
get-input
[ sort ] bi@
[ - abs ] 2map-sum ;
: part2 ( -- n )
get-input
histogram
'[ dup _ at 0 or * ] map-sum ;
Viml
I think viml is a very fun language, i like weird languages lol, so this year im doing it in viml while trying to use as many of the original ed/ex commands as i can (:d, :p, :a, :g, …)
Part 1
!cp ./puzzle1 ./puzzle1.editing
e ./puzzle1.editing
1,$sort
let row1 = []
g/^\d/let row1 = add(row1, str2nr(expand("<cword>"))) | norm 0dw
1d
1,$sort
g/^\d/execute 'norm cc' .. string(abs(expand("<cword>") - row1[line('.') - 1]))
$a|---ANSWER---
0
.
1,$-1g/^\d/call setline("$", str2nr(getline("$")) + str2nr(expand("<cword>")))
Part 2
read ./puzzle1
let cnt = 0
g/^\d/let cnt += expand("<cword>") *
\ searchcount(#{pattern: '\s\+' .. expand("<cword>")}).total
echo cnt .. "\n"
w! ./puzzle1.editing
Raku
I’m trying warm up to Raku again.
Solution
use v6;
sub MAIN($input) {
my $file = open $input;
grammar LocationList {
token TOP { <row>+%"\n" "\n"* }
token row { <left=.id> " "+ <right=.id> }
token id { \d+ }
}
my $locations = LocationList.parse($file.slurp);
my @rows = $locations<row>.map({ (.<left>.Int, .<right>.Int)});
my $part-one-solution = (@rows[*;0].sort Z- @rows[*;1].sort)».abs.sum;
say "part 1: $part-one-solution";
my $rbag = bag(@rows[*;1].sort);
my $part-two-solution = @rows[*;0].map({ $_ * $rbag{$_}}).sum;
say "part 2: $part-two-solution";
}
I’m happy to see that Lemmy no longer eats Raku code.
python
I didn’t realize it was december until this afternoon. I’ve generally chosen a new or spartan lang to challenge myself, but I’m going easy mode this year with python and just focusing on meeting the requirement.
solution
import aoc
def setup():
lines = aoc.get_lines(1)
l = [int(x.split()[0]) for x in lines]
r = [int(x.split()[1]) for x in lines]
return (l, r, 0)
def one():
l, r, acc = setup()
for p in zip(sorted(l), sorted(r)):
acc += abs(p[0] - p[1])
print(acc)
def two():
l, r, acc = setup()
for n in l:
acc += n * r.count(n)
print(acc)
one()
two()