From c97f1fb794a096dcda4910dd4275f6c741136913 Mon Sep 17 00:00:00 2001 From: Sebastian Bugge Date: Sat, 7 Dec 2024 06:26:58 +0100 Subject: [PATCH] Add day 7. --- day07.pl | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 day07.pl diff --git a/day07.pl b/day07.pl new file mode 100644 index 0000000..79a8045 --- /dev/null +++ b/day07.pl @@ -0,0 +1,60 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + + +my @results = (); +my @expressions = (); +while (<>) { + next if !/(\d+): ((?:\d+ ?)+)/; + push @results, $1; + + my @numbers = split ' ', $2; + push @expressions, \@numbers; +} + +my $answer = 0; +for my $i (0 .. $#results) { + print "$i/$#results\n"; + my $result = $results[$i]; + my $expression = $expressions[$i]; + + my @operators = map { 0 } 0..($#$expression - 1); + while (1) { + my $total = $expression->[0]; + for my $i (0 .. $#operators) { + my $operator = $operators[$i]; + my $number = $expression->[$i + 1]; + if ($operator == 0) { + $total += $number; + } elsif ($operator == 1) { + $total *= $number; + } elsif ($operator == 2) { + $total .= $number; + } + } + + if ($total == $result) { + $answer += $result; + last; + } + + my $done = 0; + $operators[0]++; + for $i (0 .. $#operators) { + my $operator = $operators[$i]; + if ($operator == 3) { + if (!defined($operators[$i + 1])) { + $done = 1; + last; + } + $operators[$i] = 0; + $operators[$i + 1]++; + } + } + last if $done; + } +} + +print "$answer\n";