Guest User

Untitled

a guest
Dec 16th, 2021
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.22 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3.  
  4. $packet = "<ENTER PACKET HERE>";
  5.  
  6. $packet =~ s/1/Q/g;
  7. $packet =~ s/0/P/g;
  8. $packet =~ s/F/1111/g;
  9. $packet =~ s/E/1110/g;
  10. $packet =~ s/D/1101/g;
  11. $packet =~ s/C/1100/g;
  12. $packet =~ s/B/1011/g;
  13. $packet =~ s/A/1010/g;
  14. $packet =~ s/9/1001/g;
  15. $packet =~ s/8/1000/g;
  16. $packet =~ s/7/0111/g;
  17. $packet =~ s/6/0110/g;
  18. $packet =~ s/5/0101/g;
  19. $packet =~ s/4/0100/g;
  20. $packet =~ s/3/0011/g;
  21. $packet =~ s/2/0010/g;
  22. $packet =~ s/Q/0001/g;
  23. $packet =~ s/P/0000/g;
  24.  
  25.  
  26. $vsum = 0;
  27.  
  28. print $packet."\n\n";
  29. ($result, $leftover) = subpacket($packet);
  30.  
  31. print "VSUM: $vsum\n";
  32. print $leftover."\n";
  33. print $result."\n";
  34.  
  35. sub subpacket() {
  36.         my $spacket = $_[0];
  37.         my @stack = ();
  38.         my $read = "";
  39.         my $newpacket;
  40.         my $version;
  41.         my $type;
  42.         my $input;
  43.         my $ltype;
  44.         my $plength;
  45.         my $result;
  46.         my $c;
  47.         my $calcsum;
  48.         my $val;
  49.  
  50.         $version = substr($spacket, 0, 3);
  51.         $spacket = substr($spacket, 3, length($spacket) - 3);
  52.  
  53.         $vsum = $vsum + oct("0b".$version);
  54.  
  55.         $type = substr($spacket, 0, 3);
  56.         $spacket = substr($spacket, 3, length($spacket) - 3);
  57.  
  58.         if ($type eq "100") {
  59.                 $read = "";
  60.                 while (substr($spacket, 0, 1) eq "1") {
  61.                         $input = substr($spacket, 1, 4);
  62.                         $spacket = substr($spacket, 5, length($spacket) - 5);
  63.                         $read = $read . $input;
  64.                 }
  65.                 $input = substr($spacket, 1, 4);
  66.                 $spacket = substr($spacket, 5, length($spacket) - 5);
  67.                 $read = $read . $input;
  68.                 return (oct("0b".$read),$spacket);
  69.         }
  70.         else
  71.         {
  72.                 $ltype = substr($spacket, 0, 1);
  73.                 $spacket = substr($spacket, 1, length($spacket) - 1);
  74.  
  75.                 if ($ltype eq "0") {
  76.                         $plength = substr($spacket, 0, 15);
  77.                         $spacket = substr($spacket, 15, length($spacket) - 15);
  78.  
  79.                         $plength = oct("0b".$plength);
  80.                         $newpacket = substr($spacket, 0, $plength);
  81.                         $spacket = substr($spacket, $plength, length($spacket) - $plength);
  82.                         while ($newpacket =~ m/1/) {
  83.                                 ($result, $newpacket) = subpacket($newpacket);
  84.                                 push(@stack, int($result));
  85.                         }
  86.                 }
  87.                 else
  88.                 {
  89.  
  90.                         $plength = substr($spacket, 0, 11);
  91.                         $spacket = substr($spacket, 11, length($spacket) - 11);
  92.                         $plength = oct("0b".$plength);
  93.                         for ($c = 0; $c < $plength; $c++) {
  94.                                 ($result, $spacket) = subpacket($spacket);
  95.                                 push(@stack, int($result));
  96.                         }
  97.                 }
  98.                 $calcsum = 0;
  99.                 if ($type eq "000") {
  100.                         foreach $val (@stack) {
  101.                                 $calcsum = $calcsum + $val;
  102.                         }
  103.                         return ($calcsum, $spacket);
  104.                 }
  105.                 if ($type eq "001") {
  106.                         $calcsum = shift(@stack);
  107.                         foreach $val (@stack) {
  108.                                 $calcsum = $calcsum * $val;
  109.                         }
  110.                         return ($calcsum, $spacket);
  111.                 }
  112.                 if ($type eq "010") {
  113.                         $calcsum = 10000000000000000000;
  114.                         foreach $val (@stack) {
  115.                                 if ($calcsum > $val) {
  116.                                         $calcsum = $val;
  117.                                 }
  118.                         }
  119.                         return ($calcsum, $spacket);
  120.                 }
  121.                 if ($type eq "011") {
  122.                         foreach $val (@stack) {
  123.                                 if ($calcsum < $val) {
  124.                                         $calcsum = $val;
  125.                                 }
  126.                         }
  127.                         return ($calcsum, $spacket);
  128.                 }
  129.                 if ($type eq "101") {
  130.                         if ($stack[0] > $stack[1]) {
  131.                                 return(1, $spacket);
  132.                         }
  133.                         else
  134.                         {
  135.                                 return(0, $spacket);
  136.                         }
  137.                 }
  138.                 if ($type eq "110") {
  139.                         if ($stack[0] < $stack[1]) {
  140.                                 return(1, $spacket);
  141.                         }
  142.                         else
  143.                         {
  144.                                 return(0, $spacket);
  145.                         }
  146.                 }
  147.                 if ($type eq "111") {
  148.                         if ($stack[0] == $stack[1]) {
  149.                                 return(1, $spacket);
  150.                         }
  151.                         else
  152.                         {
  153.                                 return(0, $spacket);
  154.                         }
  155.                 }
  156.         }
  157. }
  158.  
Advertisement
Add Comment
Please, Sign In to add comment