Advertisement
Guest User

Untitled

a guest
Dec 8th, 2021
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.17 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. $filename = "8.txt";
  4.  
  5. open(FILE, $filename);
  6. @data = <FILE>;
  7. close(FILE);
  8.  
  9. $ucount = 0;
  10.  
  11. #7-segment decoding hash array
  12. %reverse = ('1110111' => '0','0010010' => '1','1011101' => '2','1011011' => '3','0111010' => '4','1101011' => '5','1101111' => '6','1010010' => '7','1111111' => '8','1111011' => '9');
  13.  
  14. foreach $line (@data) {
  15.     @segments = ();
  16.     $line =~ s/\n//sgi;
  17.     ($input, $output) = split(/ \| /, $line);
  18.  
  19.     @do = split(" ", $output);
  20.     @vu = split(" ", $input);
  21.  
  22.     foreach $inp (@vu) {
  23.         if (length($inp) == 2) {
  24.         ($segmentone, $segmenttwo) = split("", $inp);
  25.         }
  26.         if (length($inp) == 3) {
  27.             $seven = $inp;
  28.         }
  29.     }
  30.     $seven =~ s/$segmentone//;
  31.     $seven =~ s/$segmenttwo//;
  32.  
  33.     $segments[0] = $seven;
  34.  
  35.     #seven now contains the signal name for the TOP segment, like:
  36.     #  ###
  37.     # .   .
  38.     # .   .
  39.     # .   .
  40.     #  ...
  41.     # .   .
  42.     # .   .
  43.     # .   .
  44.     #  ...
  45.     #By "subtracting" 1 from 7
  46.  
  47.     #Use the information to get which segments that is the top part of 1, and bottom part of 1, by comparing it to 6.
  48.     #6 is the only 6-segment digit that lacks one of the element belongning to 1, so by testing for a 6-segment digit
  49.     #that only contains one of the elements from 1, we know its 6. In addition, we get to know which of the elements in 1
  50.     #that is top and that is bottom.
  51.  
  52.     foreach $inp (@vu) {
  53.         $segcount = 0;
  54.         if (length($inp) == 6) {
  55.  
  56.             if ($inp =~ m/$segmentone/) {
  57.                 $segcount++;
  58.             }
  59.             if ($inp =~ m/$segmenttwo/) {
  60.                 $segcount++;
  61.             }
  62.             if ($segcount == 1) {
  63.                 $numbersix = $inp;
  64.                 if ($inp =~ m/$segmentone/) {
  65.                     $segments[5] = $segmentone;
  66.                     $segments[2] = $segmenttwo;
  67.                 }
  68.                 if ($inp =~ m/$segmenttwo/) {
  69.                     $segments[2] = $segmentone;
  70.                     $segments[5] = $segmenttwo;
  71.                 }
  72.             }
  73.         }
  74.     }
  75.  
  76.  
  77.     #Now since we know which number is 6 (only 6-segment digit that lacks one of the elements belongning to 1)
  78.     #subtract 5 from 6 to get which is the bottom left segment.
  79.  
  80.     foreach $inp (@vu) {
  81.         if (length($inp) == 5) {
  82.             $newvalue = $numbersix;
  83.             @fivechars = split("", $inp);
  84.             $ccount = 0;
  85.             foreach $sc (@fivechars) {
  86.                 if ($numbersix =~ m/$sc/) {
  87.                     $ccount++;
  88.                     $newvalue =~ s/$sc//;
  89.                 }
  90.             }
  91.             if ($ccount == 5) {
  92.                 $segments[4] = $newvalue;
  93.             }
  94.  
  95.         }
  96.     }
  97.  
  98.     #Now we have the following:
  99.     #  ###
  100.     # .   #
  101.     # .   #
  102.     # .   #
  103.     #  ...
  104.     # #   #
  105.     # #   #
  106.     # #   #
  107.     #  ...
  108.  
  109.     #Find the 6-element digit that have all above segments. Its guranteed to be digit 0.
  110.     #Subtract 0 from every segment to get the middle segment.
  111.  
  112.     foreach $inp (@vu) {
  113.         $allsegments = "abcdefg";
  114.         if (length($inp) == 6) {
  115.             if (($inp =~ $segments[0])&&($inp =~ $segments[2])&&($inp =~ $segments[4])&&($inp =~ $segments[5])) {
  116.  
  117.                 @zerochars = split("", $inp);
  118.                 foreach $zc (@zerochars) {
  119.                     $allsegments =~ s/$zc//;
  120.                 }
  121.  
  122.                 $segments[3] = $allsegments;
  123.  
  124.             }
  125.         }
  126.     }
  127.  
  128.     #Now we have the following:
  129.     #  ###
  130.     # .   #
  131.     # .   #
  132.     # .   #
  133.     #  ###
  134.     # #   #
  135.     # #   #
  136.     # #   #
  137.     #  ...
  138.  
  139.     #Now subtract those 3 segments from digit 4, to get the upper left segment.
  140.  
  141.     foreach $inp (@vu) {
  142.         if (length($inp) == 4) {
  143.             $inp =~ s/$segments[2]//;
  144.             $inp =~ s/$segments[3]//;
  145.             $inp =~ s/$segments[5]//;
  146.             $segments[1] = $inp;
  147.         }
  148.     }
  149.  
  150.     #Only one segment left. Subtract all known segments from all segments to get it.
  151.  
  152.     $allsegments = "abcdefg";
  153.     $allsegments =~ s/$segments[0]//;
  154.     $allsegments =~ s/$segments[1]//;
  155.     $allsegments =~ s/$segments[2]//;
  156.     $allsegments =~ s/$segments[3]//;
  157.     $allsegments =~ s/$segments[4]//;
  158.     $allsegments =~ s/$segments[5]//;
  159.     $segments[6] = $allsegments;
  160.  
  161.     #Get the 4-digit code for this line
  162.     $code = "";
  163.     foreach $cd (@do) {
  164.  
  165.         if ((length($cd) == 2)||(length($cd) == 4)||(length($cd) == 7)||(length($cd) == 3)) {
  166.             $ucount++; #part1
  167.         }
  168.  
  169.         $outputstack = "";
  170.         for ($i = 0; $i < 7; $i++) {
  171.             if ($cd =~ m/$segments[$i]/) {
  172.                 $outputstack = $outputstack . "1";
  173.             }
  174.             else
  175.             {
  176.                 $outputstack = $outputstack . "0";
  177.             }
  178.         }
  179.         $code = $code . $reverse{$outputstack};
  180.     }
  181.  
  182.     print $code."\n";
  183.  
  184.     $codesum = $codesum + $code;
  185.  
  186. }
  187.  
  188.  
  189. print "--------------------------------------------\n";
  190. print "Easy: $ucount\n";
  191. print "Hard: $codesum\n";
  192.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement