X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=aoc2020.git;a=blobdiff_plain;f=28.pl;fp=28.pl;h=edf339ee7a7a65cc6c6a826b75178b0c3217623f;hp=0000000000000000000000000000000000000000;hb=0c26b846783563f208ecedc83fe18f12f8f24293;hpb=b957ac325434a1623becbe1850127821a94c38fe diff --git a/28.pl b/28.pl new file mode 100755 index 0000000..edf339e --- /dev/null +++ b/28.pl @@ -0,0 +1,39 @@ +#!/usr/bin/perl -w + +use strict; +no warnings 'portable'; + +my %mem; + +my ($floatm, $orm); +while (<>) { + chomp; + if (/mask = (\S+)/) { + ($orm, $floatm) = ($1, $1); + $floatm =~ s/1/0/g; + $orm =~ s/X/0/g; $orm = oct "0b$orm"; + next; + } + if (/mem\[(\d+)\] = (\d+)/) { + my $data = $2; + for my $addr (addr2list($1|$orm, $floatm)) { + $mem{$addr} = $data; + # print "mem[$addr=", pack("b*", $addr),"] = $2\n"; + } + } +} + +my $sum; +for (keys %mem) { $sum += $mem{$_} }; +print "Sum=$sum\n"; + +sub addr2list { + my ($addr, $mask) = @_; + if ($mask =~ s/X/0/) { + my $off = length $'; + return (addr2list($addr | (1 << $off), $mask), + addr2list($addr & ~(1 << $off), $mask)); + } else { + return ($addr); + } +}