Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- $packet = "<ENTER PACKET HERE>";
- $packet =~ s/1/Q/g;
- $packet =~ s/0/P/g;
- $packet =~ s/F/1111/g;
- $packet =~ s/E/1110/g;
- $packet =~ s/D/1101/g;
- $packet =~ s/C/1100/g;
- $packet =~ s/B/1011/g;
- $packet =~ s/A/1010/g;
- $packet =~ s/9/1001/g;
- $packet =~ s/8/1000/g;
- $packet =~ s/7/0111/g;
- $packet =~ s/6/0110/g;
- $packet =~ s/5/0101/g;
- $packet =~ s/4/0100/g;
- $packet =~ s/3/0011/g;
- $packet =~ s/2/0010/g;
- $packet =~ s/Q/0001/g;
- $packet =~ s/P/0000/g;
- $vsum = 0;
- print $packet."\n\n";
- ($result, $leftover) = subpacket($packet);
- print "VSUM: $vsum\n";
- print $leftover."\n";
- print $result."\n";
- sub subpacket() {
- my $spacket = $_[0];
- my @stack = ();
- my $read = "";
- my $newpacket;
- my $version;
- my $type;
- my $input;
- my $ltype;
- my $plength;
- my $result;
- my $c;
- my $calcsum;
- my $val;
- $version = substr($spacket, 0, 3);
- $spacket = substr($spacket, 3, length($spacket) - 3);
- $vsum = $vsum + oct("0b".$version);
- $type = substr($spacket, 0, 3);
- $spacket = substr($spacket, 3, length($spacket) - 3);
- if ($type eq "100") {
- $read = "";
- while (substr($spacket, 0, 1) eq "1") {
- $input = substr($spacket, 1, 4);
- $spacket = substr($spacket, 5, length($spacket) - 5);
- $read = $read . $input;
- }
- $input = substr($spacket, 1, 4);
- $spacket = substr($spacket, 5, length($spacket) - 5);
- $read = $read . $input;
- return (oct("0b".$read),$spacket);
- }
- else
- {
- $ltype = substr($spacket, 0, 1);
- $spacket = substr($spacket, 1, length($spacket) - 1);
- if ($ltype eq "0") {
- $plength = substr($spacket, 0, 15);
- $spacket = substr($spacket, 15, length($spacket) - 15);
- $plength = oct("0b".$plength);
- $newpacket = substr($spacket, 0, $plength);
- $spacket = substr($spacket, $plength, length($spacket) - $plength);
- while ($newpacket =~ m/1/) {
- ($result, $newpacket) = subpacket($newpacket);
- push(@stack, int($result));
- }
- }
- else
- {
- $plength = substr($spacket, 0, 11);
- $spacket = substr($spacket, 11, length($spacket) - 11);
- $plength = oct("0b".$plength);
- for ($c = 0; $c < $plength; $c++) {
- ($result, $spacket) = subpacket($spacket);
- push(@stack, int($result));
- }
- }
- $calcsum = 0;
- if ($type eq "000") {
- foreach $val (@stack) {
- $calcsum = $calcsum + $val;
- }
- return ($calcsum, $spacket);
- }
- if ($type eq "001") {
- $calcsum = shift(@stack);
- foreach $val (@stack) {
- $calcsum = $calcsum * $val;
- }
- return ($calcsum, $spacket);
- }
- if ($type eq "010") {
- $calcsum = 10000000000000000000;
- foreach $val (@stack) {
- if ($calcsum > $val) {
- $calcsum = $val;
- }
- }
- return ($calcsum, $spacket);
- }
- if ($type eq "011") {
- foreach $val (@stack) {
- if ($calcsum < $val) {
- $calcsum = $val;
- }
- }
- return ($calcsum, $spacket);
- }
- if ($type eq "101") {
- if ($stack[0] > $stack[1]) {
- return(1, $spacket);
- }
- else
- {
- return(0, $spacket);
- }
- }
- if ($type eq "110") {
- if ($stack[0] < $stack[1]) {
- return(1, $spacket);
- }
- else
- {
- return(0, $spacket);
- }
- }
- if ($type eq "111") {
- if ($stack[0] == $stack[1]) {
- return(1, $spacket);
- }
- else
- {
- return(0, $spacket);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment