The weekly challenge 282 - Task 1: Good Integer

 1 #!/usr/bin/env perl
 2 # https://theweeklychallenge.org/blog/perl-weekly-challenge-282/#TASK1
 3 #
 4 # Task 1: Good Integer
 5 # ====================
 6 #
 7 # You are given a positive integer, $int, having 3 or more digits.
 8 #
 9 # Write a script to return the Good Integer in the given integer or -1 if none found.
10 #
11 ### A good integer is exactly three consecutive matching digits.
12 #
13 ## Example 1
14 ##
15 ## Input: $int = 12344456
16 ## Output: "444"
17 #
18 ## Example 2
19 ##
20 ## Input: $int = 1233334
21 ## Output: -1
22 #
23 ## Example 3
24 ##
25 ## Input: $int = 10020003
26 ## Output: "000"
27 #
28 ############################################################
29 ##
30 ## discussion
31 ##
32 ############################################################
33 #
34 # We just walk the digits, taking note of the previous digit
35 # and how often it occured already. If the current digit is
36 # different from the previous one and we have seen the
37 # previous digit exactly 3 times, we return that digit
38 # 3 times. If we reached the end of $int, we just have to check
39 # whether the last digit was seen 3 times as well.
40 
41 use strict;
42 use warnings;
43 
44 good_integer(12344456);
45 good_integer(1233334);
46 good_integer(10020003);
47 
48 sub good_integer {
49    my $int = shift;
50    print "Input: $int\n";
51    my $prev_digit = "";
52    my $seen = 0;
53    foreach my $digit (split //, $int) {
54       if($prev_digit eq $digit) {
55          $seen++;
56       } elsif ($seen == 3) {
57          return print "Output: $prev_digit$prev_digit$prev_digit\n";
58       } else {
59          $prev_digit = $digit;
60          $seen = 1;
61       }
62    }
63    if($seen == 3) {
64       return print "Output: $prev_digit$prev_digit$prev_digit\n";
65    }
66    print "Output: -1\n";
67 }