]> www.fi.muni.cz Git - aoc2020.git/blob - 28.pl
Task 9 Perl Golf-style
[aoc2020.git] / 28.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 no warnings 'portable';
5
6 my %mem;
7
8 my ($floatm, $orm);
9 while (<>) {
10         chomp;
11         if (/mask = (\S+)/) {
12                 ($orm, $floatm) = ($1, $1);
13                 $floatm =~ s/1/0/g;
14                 $orm  =~ s/X/0/g; $orm  = oct "0b$orm";
15                 next;
16         }
17         if (/mem\[(\d+)\] = (\d+)/) {
18                 my $data = $2;
19                 for my $addr (addr2list($1|$orm, $floatm)) {
20                         $mem{$addr} = $data;
21                         # print "mem[$addr=", pack("b*", $addr),"] = $2\n";
22                 }
23         }
24 }
25
26 my $sum;
27 for (keys %mem) { $sum += $mem{$_} };
28 print "Sum=$sum\n";
29
30 sub addr2list {
31         my ($addr, $mask) = @_;
32         if ($mask =~ s/X/0/) {
33                 my $off = length $';
34                 return (addr2list($addr | (1 << $off), $mask),
35                         addr2list($addr & ~(1 << $off), $mask));
36         } else {
37                 return ($addr);
38         }
39 }