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);
}
|