Advent of Code is one of these things I wanna do every year and then I end up in fucking end-of-the-year crunch time every December and work for 10-12 hours and really don't wanna code after work anymore.
But hey, here's a quick solution for day 1. Let's see how far I make it.
Day 1
use strict;
use List::Util qw( min max );
open(FH, '<', $ARGV[0]) or die $!;
my @left;
my @right;
while (<FH>) {
my @nums = split /\s+/, $_;
push(@left, $nums[0]);
push(@right, $nums[1]);
}
@left = sort { $b <=> $a } @left;
@right = sort { $b <=> $a } @right;
my $dist = 0;
my $sim = 0;
my $i = 0;
foreach my $lnum (@left) {
$sim += $lnum * grep { $_ == $lnum } @right;
my $rnum = $right[$i++];
$dist += max($lnum, $rnum) - min($lnum, $rnum);
}
print 'Part 1: ', $dist, "\n";
print 'Part 2: ', $sim, "\n";
close(FH);
use strict;
use List::Util qw( min max );
open(FH, '<', $ARGV[0]) or die $!;
my @lines;
while (<FH>) {
my @report = split /\s/, $_;
push @lines, \@report;
}
close FH;
sub in_range {
my $diff = max($_[0], $_[1]) - min($_[0], $_[1]);
return $diff >= 1 && $diff <= 3;
}
sub is_safe {
my $prev = @$_[0];
my $dir = 0;
for (my $i = 1; $i < scalar @$_; ++$i) {
my $el = @$_[$i];
if ($el > $prev) {
return 0 unless $dir >= 0;
$dir = 1;
} elsif ($el < $prev) {
return 0 unless $dir <= 0;
$dir = -1;
}
return 0 unless in_range $prev, $el;
$prev = $el;
}
return 1;
}
sub part1 {
my $safe_reports = 0;
foreach (@_) {
$safe_reports++ if is_safe @$_;
}
return $safe_reports;
}
print 'Part 1: ', part1(@lines), "\n";
My part 2 solution didn't work with the real input but worked with all the test cases I threw at it, so I couldn't figure out what was wrong with it and I'm too lazy to debug any more right now.