## 41. `Puzzle.__reduceSlot()`: Eliminate choices for one slot

kkck
```# - - -   P u z z l e . _ _ r e d u c e S l o t

def __reduceSlot ( self, cell, slot, letterSet ):
'''Remove choices for a slot that don't have given letters.

[ (cell is a Cell in self) and
(slot is a Slot in self that contains cell) and
(letterSet is a set of one-character strings) ->
self.__wordBank  :=  self.__wordBank - (choices for
slots whose characters at cell's position
are not in letterSet ]
'''
```

We first materialize the set of choices into a separate list, `wordList`. We'll also need to know the position (`k`) of the letter relative to the start of the slot; that is computed by Section 59, “`Slot.findCoord()`: Puzzle position to slot position”.

kkck
```        #-- 1 --
# [ wordList  :=  list of word choices in self.__wordBank
#       for slot, as a list of Word instances
#   cellx  :=  position of cell relative to slot ]
wordList = [ word
for word in
self.__wordBank.genSlotChoices ( slot ) ]
cellx = slot.findCoord ( cell.coord )
```

Next, work through `wordList` and, for each choice that has a letter at the position `cellx` that is not in `letterSet`, we remove it from the slot choices by calling Section 68, “`WordBank.isNot()`: Remove one word from a slot's list of choices”.

kkck
```        #-- 2 --
# [ self.__wordBank  :=  self.__wordBank - (choices for slot
#       that have letters in position cellx that are not in
#       letterSet ]
for word in wordList:
#-- 2 body --
# [ if word[cellx] is not in letterSet ->
#     self.__wordBank  :=  self.__wordBank - (choice
#         of word for slot)
if word[cellx] not in letterSet:
if VERBOSE:
print ( "*** Removing %s from %s because "
"word [%d] is not in %r." %
(word, slot, cellx, ''.join(list(letterSet))) )
self.__wordBank.isNot ( slot, word )
```