commit db746faeaaba83ad2b0af1b0943b54d859e725c5 Author: Sebastian Bugge Date: Mon Dec 2 14:50:24 2024 +0100 Complete day 2. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2211df6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.txt diff --git a/day02.pl b/day02.pl new file mode 100644 index 0000000..4e21ca2 --- /dev/null +++ b/day02.pl @@ -0,0 +1,68 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use List::Util qw(reduce); + +my @reports; +while (<>) { + my @numbers = split; + next unless @numbers; + push @reports, \@numbers; +} + +print "Part 1:\n"; +my $safe_reports = reduce { $a + $b } map { is_safe(@$_) } @reports; +print $safe_reports . "\n"; + +print "Part 2:\n"; +$safe_reports = reduce { $a + $b } map { is_safe_with_modification(@$_) } @reports; +print $safe_reports . "\n"; + +sub is_safe { + return (is_increasing(@_) || is_decreasing(@_)) && max_diff(@_); +} + +sub is_safe_with_modification { + return 1 if is_safe(@_); + + # This is really dumb... + for (my $i = 0; $i < @_; $i++) { + my @to_test = @_; + splice @to_test, $i, 1; + return 1 if is_safe(@to_test); + } + + return 0; +} + +sub is_increasing { + my $prev = shift; + for (@_) { + return 0 if ($_ <= $prev); + $prev = $_; + } + return 1; +} + +sub is_decreasing { + my $prev = shift; + for (@_) { + return 0 if ($_ >= $prev); + $prev = $_; + } + return 1; +} + +sub max_diff { + my $prev = shift; + + for (@_) { + if ((abs($_ - $prev) > 3) || (abs($_ - $prev) < 1)) { + return 0; + } + $prev = $_; + } + return 1; +}