Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- $filename = "8.txt";
- open(FILE, $filename);
- @data = <FILE>;
- close(FILE);
- $ucount = 0;
- #7-segment decoding hash array
- %reverse = ('1110111' => '0','0010010' => '1','1011101' => '2','1011011' => '3','0111010' => '4','1101011' => '5','1101111' => '6','1010010' => '7','1111111' => '8','1111011' => '9');
- foreach $line (@data) {
- @segments = ();
- $line =~ s/\n//sgi;
- ($input, $output) = split(/ \| /, $line);
- @do = split(" ", $output);
- @vu = split(" ", $input);
- foreach $inp (@vu) {
- if (length($inp) == 2) {
- ($segmentone, $segmenttwo) = split("", $inp);
- }
- if (length($inp) == 3) {
- $seven = $inp;
- }
- }
- $seven =~ s/$segmentone//;
- $seven =~ s/$segmenttwo//;
- $segments[0] = $seven;
- #seven now contains the signal name for the TOP segment, like:
- # ###
- # . .
- # . .
- # . .
- # ...
- # . .
- # . .
- # . .
- # ...
- #By "subtracting" 1 from 7
- #Use the information to get which segments that is the top part of 1, and bottom part of 1, by comparing it to 6.
- #6 is the only 6-segment digit that lacks one of the element belongning to 1, so by testing for a 6-segment digit
- #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
- #that is top and that is bottom.
- foreach $inp (@vu) {
- $segcount = 0;
- if (length($inp) == 6) {
- if ($inp =~ m/$segmentone/) {
- $segcount++;
- }
- if ($inp =~ m/$segmenttwo/) {
- $segcount++;
- }
- if ($segcount == 1) {
- $numbersix = $inp;
- if ($inp =~ m/$segmentone/) {
- $segments[5] = $segmentone;
- $segments[2] = $segmenttwo;
- }
- if ($inp =~ m/$segmenttwo/) {
- $segments[2] = $segmentone;
- $segments[5] = $segmenttwo;
- }
- }
- }
- }
- #Now since we know which number is 6 (only 6-segment digit that lacks one of the elements belongning to 1)
- #subtract 5 from 6 to get which is the bottom left segment.
- foreach $inp (@vu) {
- if (length($inp) == 5) {
- $newvalue = $numbersix;
- @fivechars = split("", $inp);
- $ccount = 0;
- foreach $sc (@fivechars) {
- if ($numbersix =~ m/$sc/) {
- $ccount++;
- $newvalue =~ s/$sc//;
- }
- }
- if ($ccount == 5) {
- $segments[4] = $newvalue;
- }
- }
- }
- #Now we have the following:
- # ###
- # . #
- # . #
- # . #
- # ...
- # # #
- # # #
- # # #
- # ...
- #Find the 6-element digit that have all above segments. Its guranteed to be digit 0.
- #Subtract 0 from every segment to get the middle segment.
- foreach $inp (@vu) {
- $allsegments = "abcdefg";
- if (length($inp) == 6) {
- if (($inp =~ $segments[0])&&($inp =~ $segments[2])&&($inp =~ $segments[4])&&($inp =~ $segments[5])) {
- @zerochars = split("", $inp);
- foreach $zc (@zerochars) {
- $allsegments =~ s/$zc//;
- }
- $segments[3] = $allsegments;
- }
- }
- }
- #Now we have the following:
- # ###
- # . #
- # . #
- # . #
- # ###
- # # #
- # # #
- # # #
- # ...
- #Now subtract those 3 segments from digit 4, to get the upper left segment.
- foreach $inp (@vu) {
- if (length($inp) == 4) {
- $inp =~ s/$segments[2]//;
- $inp =~ s/$segments[3]//;
- $inp =~ s/$segments[5]//;
- $segments[1] = $inp;
- }
- }
- #Only one segment left. Subtract all known segments from all segments to get it.
- $allsegments = "abcdefg";
- $allsegments =~ s/$segments[0]//;
- $allsegments =~ s/$segments[1]//;
- $allsegments =~ s/$segments[2]//;
- $allsegments =~ s/$segments[3]//;
- $allsegments =~ s/$segments[4]//;
- $allsegments =~ s/$segments[5]//;
- $segments[6] = $allsegments;
- #Get the 4-digit code for this line
- $code = "";
- foreach $cd (@do) {
- if ((length($cd) == 2)||(length($cd) == 4)||(length($cd) == 7)||(length($cd) == 3)) {
- $ucount++; #part1
- }
- $outputstack = "";
- for ($i = 0; $i < 7; $i++) {
- if ($cd =~ m/$segments[$i]/) {
- $outputstack = $outputstack . "1";
- }
- else
- {
- $outputstack = $outputstack . "0";
- }
- }
- $code = $code . $reverse{$outputstack};
- }
- print $code."\n";
- $codesum = $codesum + $code;
- }
- print "--------------------------------------------\n";
- print "Easy: $ucount\n";
- print "Hard: $codesum\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement