Important notice: All Credly Certification exam badges that have been unclaimed for 30 or more days will expire on August 28, 2024. To keep your badges active, log in to your Credly account and claim your badge before the deadline. (Don’t worry, this does not affect your Community badges!)

Weekly Challenges

Solve the challenge, share your solution and summit the ranks of our Community!

Also available in | Français | Português | Español | 日本語
IDEAS WANTED

Want to get involved? We're always looking for ideas and content for Weekly Challenges.

SUBMIT YOUR IDEA

Challenge #245: Zip It Real Good

ed_hayter
12 - Quasar
Spoiler
ed_hayter_0-1686928971243.png

ugly solution but its a worker

JPPPP
8 - Asteroid
Spoiler
solution attached
tristank
11 - Bolide

Took some extra steps with filters that probably would've dropped out with the join. Couldn't conceptualize the correct order to approach it which is why I used the filters.

 

Spoiler
Screenshot 2023-07-07 122503.png

 

Christina_H
14 - Magnetar

My solution attached

OzlemSigbeku
8 - Asteroid
Spoiler
245.png

mithily
8 - Asteroid

zip zip

gawa
16 - Nebula
16 - Nebula

Done

jdbaldwin
7 - Meteor

Yes, I understand that this is an Alteryx assignment. But when I see one of these that I consider fairly unsuited to Alteryx as a problem-solving tool, I like to whip out a solution in Python. And I have done so here and gotten identical results to the given output. So check it out if you are curious, feedback welcome:

 

#!/usr/bin/python3

import csv
from pprint import PrettyPrinter

pp = PrettyPrinter()

assignments_dict = dict()

def count_tokens( t ):
# Takes a string in form "x-y" and splits it into x, y and returns
# the *list* [x, y] where x and y are strings in %0d format.
#
# Example: "12-047" returns ["012", "047"]
    return_list = list()
    ( start_t, end_t ) = t.split( '-' )
    b = int(start_t)
    e = int(end_t)
    for i in range( b, e+1):
        return_list.append( f"%03d" % i )

    return return_list

def parse_tokens( s ):
# Takes a string of all the ZIP prefix assignments, or other
# strings indicating totality, etc. Returns a list of all the
# three-digit prefixes (or list of other strings) represented by
# the input.
#
# Examples:
#
# "12, 047-051, 093" returns [ "012", "047", "048", "049", "050", "051", "093" ]
#
# "entire" or "International" returns [ "entire" ]
#
# NOTE: "rest" is returned in a context where it may be added to
# other prefixes. When "entire" is returned, the data constraints
# say it will be the only element for that state/region code. The
# script does not error-check for this.

# Handle the special cases and return immediately:

    if s == "rest of state":
        return [ "rest" ]
    elif s == "entire state" or s == "entire area":
        return [ "entire" ]
    elif s == "International":
        return [ "entire" ]

    s.replace( " ", "" )
    tokens = s.split( ',' )

    return_list = list()

    for t in tokens:
    # If a string is in form "x-y" handle with count_tokens and
    # add the elements:
        if "-" in t:
            return_list += count_tokens( t )
        else:
        # Otherwise, just convert to three-character integer and
        # append this element:
            t_i = int( t )
            t = "%03d" % t_i
            return_list.append( t )

    # Just return the list we spent the loop above building:
    return return_list

# Read in all the assignments into assignments_dict, keyed by state.
# Each elemnt is a dictionary keyed on prefixes with values of the
# relevant "assignment":
with open('assignments.csv', newline='') as csvfile:
    assignments_reader = csv.reader(csvfile)
    # Throw away the headers
    next(assignments_reader, None) # skip the headers
    for row in assignments_reader:
        ( state, tokens, assignment ) = row
        t_list = parse_tokens( tokens )

        for t in t_list:
            if state not in assignments_dict:
                assignments_dict[state] = dict()

            if t not in assignments_dict[ state ]:
                assignments_dict[ state ][ t ] = assignment
            else:
                print( "FATAL: duplicate assignment of state / tokens assignment: %s / %s / %s "
                            % ( state, tokens, assignment ) )
                exit( 1 )

# Read in each zipcode element, determine the state, match the special
# cases if present, then match the first three digits. Any given
# combination should lead to an assignment, which can be printed
# immediately. If a case doesn't work, error out the whole script
# with a fatal error:
with open('zipcodes.csv', newline='') as csvfile:
    zipcodes_reader = csv.reader(csvfile)
    # Throw away the headers
    next( zipcodes_reader, None )
    for row in zipcodes_reader:
        ( state, zip ) = row
        if state not in assignments_dict:
            assignment = assignments_dict[ 'International' ][ 'entire' ]
        elif 'entire' in assignments_dict[ state ]:
            assignment = assignments_dict[ state ][ 'entire' ]
        elif zip[0:3] in assignments_dict[ state ]:
            assignment = assignments_dict[ state ][ zip[0:3] ]
        elif 'rest' in assignments_dict[ state ]:
            assignment = assignments_dict[ state ][ 'rest' ]
        else:
            print( "FATAL: can't happen case" )
            exit( 1 )

        print( "%s,%s,%s" % (state, zip, assignment) )

 

-

alacoume
9 - Comet

a solution

Dani_Lin
8 - Asteroid

solved