aboutsummaryrefslogtreecommitdiff
path: root/challenge-014/paulo-custodio/perl/ch-2.pl
blob: 3e5b8b16f8405fad1aa2bfd8efd3f5ab00ba4dd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/perl

# Challenge 014
#
# Challenge #2
# Using only the official postal (2-letter) abbreviations for the 50 U.S.
# states, write a script to find the longest English word you can spell? Here
# is the list of U.S. states abbreviations as per wikipedia page. This challenge
# was proposed by team member Neil Bowers.
#
# For example,
# Pennsylvania + Connecticut = PACT
# Wisconsin + North Dakota = WIND
# Maine + Alabama = MEAL
# California + Louisiana + Massachusetts + Rhode Island = Calamari

use Modern::Perl;

my %us_states = (
    AL => 'Alabama',
    AK => 'Alaska',
    AZ => 'Arizona',
    AR => 'Arkansas',
    CA => 'California',
    CO => 'Colorado',
    CT => 'Connecticut',
    DE => 'Delaware',
    FL => 'Florida',
    GA => 'Georgia',
    HI => 'Hawaii',
    ID => 'Idaho',
    IL => 'Illinois',
    IN => 'Indiana',
    IA => 'Iowa',
    KS => 'Kansas',
    KY => 'Kentucky',
    LA => 'Louisiana',
    ME => 'Maine',
    MD => 'Maryland',
    MA => 'Massachusetts',
    MI => 'Michigan',
    MN => 'Minnesota',
    MS => 'Mississippi',
    MO => 'Missouri',
    MT => 'Montana',
    NE => 'Nebraska',
    NV => 'Nevada',
    NH => 'New Hampshire',
    NJ => 'New Jersey',
    NM => 'New Mexico',
    NY => 'New York',
    NC => 'North Carolina',
    ND => 'North Dakota',
    OH => 'Ohio',
    OK => 'Oklahoma',
    OR => 'Oregon',
    PA => 'Pennsylvania',
    RI => 'Rhode Island',
    SC => 'South Carolina',
    SD => 'South Dakota',
    TN => 'Tennessee',
    TX => 'Texas',
    UT => 'Utah',
    VT => 'Vermont',
    VA => 'Virginia',
    WA => 'Washington',
    WV => 'West Virginia',
    WI => 'Wisconsin',
    WY => 'Wyoming',
);

my @codes = keys %us_states;            # all states two letter codes
my $codes = join("|", @codes);          # regex to match any codes
my $regex = qr/^($codes)+$/i;           # regex to match word composed of codes

# find all words that match, save longest ones
@ARGV==1 or die "usage: ch-2.pl dictionary.txt\n";
my $words = shift;

my @longest;
open(my $fh, "<", $words) or die "open $words: $!\n";
while (<$fh>) {
    chomp;
    next unless /$regex/;               # filter words that match state codes
    if (!@longest || length($_) > length($longest[0])) {
        @longest = ($_);
    }
    elsif (length($_) == length($longest[0])) {
        push @longest, $_;
    }
}

# show longest words in form: word = state + state + ...
for my $word (@longest) {
    my @states = map {$_ = $us_states{uc($_)}} grep {$_} split /(..)/, $word;
    say $word, " = ", join(" + ", @states);
}