From 85f5e44fff9d6f56014a3513852532e05e824f59 Mon Sep 17 00:00:00 2001 From: Sebastian Bugge Date: Mon, 2 Dec 2024 14:50:24 +0100 Subject: [PATCH 1/4] Complete day 2. --- .gitignore | 1 + day02.pl | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 .gitignore create mode 100644 day02.pl 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; +} From ec64f175762191eb8722d05ef79c9484b2d13b98 Mon Sep 17 00:00:00 2001 From: Sebastian Bugge Date: Mon, 2 Dec 2024 15:46:27 +0100 Subject: [PATCH 2/4] Complete day 1. --- day01.pl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 day01.pl diff --git a/day01.pl b/day01.pl new file mode 100644 index 0000000..8d6ec4d --- /dev/null +++ b/day01.pl @@ -0,0 +1,32 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my @list1; +my @list2; + +while (<>) { + my @nums = split; + next unless @nums; + push @list1, $nums[0]; + push @list2, $nums[1]; +} + +@list1 = sort { $a <=> $b } @list1; +@list2 = sort { $a <=> $b } @list2; + +my $elementwise_diff = 0; +for (my $i = 0; $i < @list1; $i++) { + my $diff = abs($list1[$i] - $list2[$i]); + $elementwise_diff += $diff; +} + +print $elementwise_diff . "\n"; + +my $similarity_score = 0; +for my $element (@list1) { + $similarity_score += $element * grep { $_ == $element } @list2; +} + +print $similarity_score . "\n"; From db746faeaaba83ad2b0af1b0943b54d859e725c5 Mon Sep 17 00:00:00 2001 From: Sebastian Bugge Date: Mon, 2 Dec 2024 14:50:24 +0100 Subject: [PATCH 3/4] Complete day 2. --- .gitignore | 1 + day02.pl | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 .gitignore create mode 100644 day02.pl 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; +} From 670651476075c5b32edec60f78ce6cf0e2197d12 Mon Sep 17 00:00:00 2001 From: Sebastian Bugge Date: Mon, 2 Dec 2024 15:46:27 +0100 Subject: [PATCH 4/4] Complete day 1. --- day01.pl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 day01.pl diff --git a/day01.pl b/day01.pl new file mode 100644 index 0000000..8d6ec4d --- /dev/null +++ b/day01.pl @@ -0,0 +1,32 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my @list1; +my @list2; + +while (<>) { + my @nums = split; + next unless @nums; + push @list1, $nums[0]; + push @list2, $nums[1]; +} + +@list1 = sort { $a <=> $b } @list1; +@list2 = sort { $a <=> $b } @list2; + +my $elementwise_diff = 0; +for (my $i = 0; $i < @list1; $i++) { + my $diff = abs($list1[$i] - $list2[$i]); + $elementwise_diff += $diff; +} + +print $elementwise_diff . "\n"; + +my $similarity_score = 0; +for my $element (@list1) { + $similarity_score += $element * grep { $_ == $element } @list2; +} + +print $similarity_score . "\n";