adventofcode/2020/14/part2.pm

45 lines
864 B
Perl

package part2;
use 5.20.0;
use warnings;
use List::AllUtils qw/ zip pairmap sum reduce/;
require './part1.pm';
use experimental qw/ signatures postderef /;
sub solution(@lines) {
my @mask;
my %mem;
while( my $line = shift @lines ) {
warn $line;
if( $line =~ /mask = (.*)/ ) {
@mask = split '', $1;
next;
}
$line =~ /mem\[(\d+)\] = (\d+)/ or die;
my $value = $2;
my @num = split '', sprintf "%036b", $1;
my $l = join '', pairmap { $a || $b } zip @mask, @num;
my $num = $l =~ s/X/%d/g;
for( 0..(2**$num)-1 ) {
my $address = reduce {
2*$a + $b
} split '', sprintf $l, split '', sprintf "%0${num}b", $_;
$mem{$address} = $value;
}
}
no warnings;
return sum values %mem;
}
1;