X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=31.pl;fp=31.pl;h=9f8f7539e84afb18a1dd28209affe22a7ba65b6d;hb=7b38251c28fdddfa775d93e882173d4c6a9a30ab;hp=0000000000000000000000000000000000000000;hpb=0febc3a8a728adf5c84e9049f443b85414bfcb79;p=aoc2021.git diff --git a/31.pl b/31.pl new file mode 100755 index 0000000..9f8f753 --- /dev/null +++ b/31.pl @@ -0,0 +1,60 @@ +#!/usr/bin/perl -w + +use v5.16; + +chomp(my $packet = <>); +$packet =~ s/./sprintf("%04b", hex $&)/ge if $packet =~ /[2-9A-F]/; + +sub get_b (\$$) { + my ($ppack, $bits) = @_; + my $rv; + $$ppack =~ s/.{$bits}/$rv=eval"0b$&";''/e; + return $rv; +} + +my $ver_sum; +my $result; +sub parse { + my $pp = shift; + + my $l = length $pp; + my $ver = get_b($pp, 3); + $ver_sum += $ver; + my $typ = get_b($pp, 3); + if ($typ == 4) { + my $num = 0; + while (get_b($pp, 1)) { + $num *= 16; + $num += get_b($pp, 4); + } + $num *= 16; + $num += get_b($pp, 4); + $result .= "$num,"; + } else { + $result .= "op($typ,"; + my $li = get_b($pp, 1); + if ($li) { + my $subp = get_b($pp, 11); + for (1 .. $subp) { + my $l1 = parse($pp); + $pp =~ s/.{$l1}//; + } + } else { + my $subl = get_b($pp, 15); + my $s = substr($pp, 0, $subl); + $pp =~ s/.{$subl}//; + while ($subl) { + my $l1 = parse($s); + $s =~ s/.{$l1}//; + $subl -= $l1; + } + } + $result .= ")"; + } + return $l - length($pp); +} + +parse($packet); +say $result; +say $ver_sum; +