aboutsummaryrefslogtreecommitdiff
path: root/challenge-014/andrezgz/perl5/ch-2.pl
blob: 71ef27622a395125e98f43b67ed89346f7d4ae2d (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
#!/usr/bin/perl

# https://perlweeklychallenge.org/blog/perl-weekly-challenge-012/
# 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.
#  https://en.wikipedia.org/wiki/List_of_U.S._state_abbreviations
# 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 strict;
use warnings;

die "Usage: $0 <words_file>" unless $ARGV[0];

my $words_file = $ARGV[0];
open(my $fh, "<", $words_file) or die "Could not open words file '$words_file': $!";

my %usps = (
    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 @max = ('');
while( my $word = <$fh> ) {
    chomp $word; # remove new line trailing string

    next if length $word < length $max[0];               # shorter than max
    next if $word !~ /^[a-z]+$/i;                        # non-alphabetic characters
    next if length($word) % 2 != 0;                      # odd number of characters
    next if grep { !$usps{uc $_} } $word =~ m/../g;      # non usps pair of alphabetic characters

    ( length $word > length $max[0] )
        ? @max = ($word)    #reset the list
        : push @max,$word;  #add to the list

}
close $fh;

print 'Longest words: '. join(', ', @max)."\n\n";

print "Sum of states for each word:\n"; #Just for fun
print join(' + ', map { $usps{uc $_} } map { $_ =~ m/../g } $_ ) .' = '. $_ ."\n" for @max ;


__END__

Longest words: Concorde, Ganymede, Mandarin, calamine, mainland, malarial, mandarin, memorial, moorland

Sum of states for each word:
Colorado + North Carolina + Oregon + Delaware = Concorde
Georgia + New York + Maine + Delaware = Ganymede
Massachusetts + North Dakota + Arkansas + Indiana = Mandarin
California + Louisiana + Michigan + Nebraska = calamine
Massachusetts + Indiana + Louisiana + North Dakota = mainland
Massachusetts + Louisiana + Rhode Island + Alabama = malarial
Massachusetts + North Dakota + Arkansas + Indiana = mandarin
Maine + Missouri + Rhode Island + Alabama = memorial
Missouri + Oregon + Louisiana + North Dakota = moorland