Provides a score representing the distance between two characters on a
    QWERTY keyboard, utilizing a simple matrix to represent the keyboard:

        | 0   1   2   3   4   5   6   7   8   9   10  11  12  13
      --+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
      0 | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |   |
      1 |   | q | w | e | r | t | y | u | i | o | p | [ | ] | \ |
      2 |   | a | s | d | f | g | h | j | k | l | ; | ' |   |   |
      3 |   |   | z | x | c | v | b | n | m | , | . | / |   |   |
      --+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

    For example, a score of 0 means the characters are the same, while a score
    of 5 means that it takes 5 position changes to get from c1 to c2. However,
    for characters that are 1 diagonal move away (such as q to s), the score is
    reduced from 2 to 1 to prevent any horizontal / vertical bias.

    Arguments:
        - c1 (str) Character to compare to 'c2'
        - c2 (str) Character to compare to 'c1'

    Returns:
        - (int) Number representing distance between two characters

    Raises:
        - ValueError: If the length of c1 or c2 is greater than 1

def compute_qwerty_distance(c1, c2):
    '''
    Provides a score representing the distance between two characters on a
    QWERTY keyboard, utilizing a simple matrix to represent the keyboard:

        | 0   1   2   3   4   5   6   7   8   9   10  11  12  13
      --+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
      0 | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |   |
      1 |   | q | w | e | r | t | y | u | i | o | p | [ | ] | \ |
      2 |   | a | s | d | f | g | h | j | k | l | ; | ' |   |   |
      3 |   |   | z | x | c | v | b | n | m | , | . | / |   |   |
      --+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

    For example, a score of 0 means the characters are the same, while a score
    of 5 means that it takes 5 position changes to get from c1 to c2. However,
    for characters that are 1 diagonal move away (such as q to s), the score is
    reduced from 2 to 1 to prevent any horizontal / vertical bias.

    Arguments:
        - c1 (str) Character to compare to 'c2'
        - c2 (str) Character to compare to 'c1'

    Returns:
        - (int) Number representing distance between two characters

    Raises:
        - ValueError: If the length of c1 or c2 is greater than 1
    '''

    # build table
    keyboard = [
        ['`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', ''],
        ['', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\'],
        ['', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '', ''],
        ['', '', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '', '']
    ]

    loc_c1 = find_in_matrix_2d(c1, keyboard)
    loc_c2 = find_in_matrix_2d(c2, keyboard)

    # euclidean distance
    distance = ((loc_c2[0] - loc_c1[0])**2 + (loc_c2[1] - loc_c1[1])**2)**0.5

    return distance