The function defined below generates a starting position, $i$, for the word in the range (1 - 15) along either a row or column as specified by the boolean variable across
. The word only fits in the grid if its length is less than or equal to $16-i$.
def word_fits(word, position, across):
""" Determine if a given word fits in a scrabble grid.
Given a word and starting position, determine whether the word fits
within the standard Scrabble grid. The position is specified as a string
giving the grid reference as a row letter (A-O) followed by a column
number (1-15); across is True if the word is to be placed along a row and
False if it is to be placed down a column from the starting position.
"""
if across:
# Get the starting column position (starting at 1)
i = int(position[1:])
else:
# Get the starting row position (starting at 'A'=1)
i = ord(position[0]) - 64 # NB ord('A') is 65 ... ord('O') is 79
return len(word) <= 16 - i
def report(word, position, across):
across_down = 'across' if across else 'down'
mod = 'not' if not word_fits(word, position, across) else ''
return '"{}" {} at {} does {} fit'.format(word, across_down, position, mod)
print(report('HELLO', 'I2', across=False))
print(report('HELLO', 'J2', across=False))
print(report('HELLO', 'K2', across=False))
print(report('HELLO', 'L2', across=False))
print(report('HELLO', 'M2', across=False))
print(report('HELLO', 'N2', across=False))
print(report('HELLO', 'O2', across=False))
print(report('LO', 'A12', across=True))
print(report('LO', 'A13', across=True))
print(report('LO', 'A14', across=True))
print(report('LO', 'A15', across=True))
The output:
"HELLO" down at I2 does fit
"HELLO" down at J2 does fit
"HELLO" down at K2 does fit
"HELLO" down at L2 does not fit
"HELLO" down at M2 does not fit
"HELLO" down at N2 does not fit
"HELLO" down at O2 does not fit
"LO" across at A12 does fit
"LO" across at A13 does fit
"LO" across at A14 does fit
"LO" across at A15 does not fit