CMU Coding Bootcamp

various things I was too lazy to split

thecoded.prof 8973cae2 56e6efb5

verified
Changed files
+2832 -71
python
oct3
oct6
blackjack
snake
wordle
+21 -9
python/oct3/level0/date.py
··· 2 2 return not (yyyy % 4 or (yyyy % 400 and not yyyy % 100)) 3 3 4 4 5 - 6 5 def sum_months(mm: int, yyyy: int) -> int: 7 - months = [31, 29 if is_leap_year(yyyy) else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 6 + months = [ 7 + 31, 8 + 29 if is_leap_year(yyyy) else 28, 9 + 31, 10 + 30, 11 + 31, 12 + 30, 13 + 31, 14 + 31, 15 + 30, 16 + 31, 17 + 30, 18 + 31, 19 + ] 8 20 return sum(months[:mm]) 9 21 10 22 11 23 def nth_day(s: str) -> int: 12 24 """Calculate the nth day since the beginning of the year.""" 13 25 mm, dd, yyyy = map(int, [s[:2], s[2:4], s[4:]]) 14 - day_since_new_year = dd + sum_months(mm-1, yyyy) 15 - return yyyy*1000 + day_since_new_year 26 + day_since_new_year = dd + sum_months(mm - 1, yyyy) 27 + return yyyy * 1000 + day_since_new_year 16 28 17 29 18 - print("we're testing the nth day function...", end='') 19 - assert(nth_day("02072016") == 2016038) 20 - assert(nth_day("12201996") == 1996355) 30 + print("we're testing the nth day function...", end="") 31 + assert nth_day("02072016") == 2016038 32 + assert nth_day("12201996") == 1996355 21 33 # assert(nth_day("abcdef") == None) 22 - assert(nth_day("12312020") == 2020366) 23 - assert(nth_day("12312021") == 2021365) 34 + assert nth_day("12312020") == 2020366 35 + assert nth_day("12312021") == 2021365 24 36 print("and it passes the example cases")
+23 -29
python/oct3/level4/runSimpleProgram.py
··· 11 11 12 12 def parse(args: List[int], values: List[int], arg: str) -> int: 13 13 """Parse an argument string into an integer value""" 14 - arg_var = 0 14 + arg_val = 0 15 15 16 16 if arg.isdigit(): 17 - arg_var = int(arg) 17 + arg_val = int(arg) 18 18 elif arg.startswith("L"): 19 - arg_var = values[int(arg[1:])] 19 + arg_val = values[int(arg[1:])] 20 20 elif arg.startswith("A"): 21 - arg_var = args[int(arg[1:])] 21 + arg_val = args[int(arg[1:])] 22 22 23 - return arg_var 23 + return arg_val 24 24 25 25 26 26 def runL(args: List[int], values: List[int], line: List[str]): ··· 34 34 if op.isdigit(): 35 35 values[out_var] = int(op) 36 36 else: 37 - op1, op2 = line[2], line[3] 38 - op1_val, op2_val = parse(args, values, op1), parse(args, values, op2) 37 + var1, var2 = line[2], line[3] 38 + var1_val, var2_val = parse(args, values, var1), parse(args, values, var2) 39 39 if op == "+": 40 - values[out_var] = op1_val + op2_val 40 + values[out_var] = var1_val + var2_val 41 41 elif op == "-": 42 - values[out_var] = op1_val - op2_val 42 + values[out_var] = var1_val - var2_val 43 43 else: 44 44 raise ValueError(f"Invalid Operator: {op}") 45 45 46 46 47 + def handleTargetError(target: int, lines: List[List[str]]) -> int | None: 48 + if target < 0 or target >= len(lines): 49 + raise ValueError(f"Invalid Jump Target: {target}") 50 + return target 51 + 52 + 47 53 def runJMP(args: List[int], values: List[int], line: List[str], lines) -> int | None: 48 54 """Return the target line number or None for a JMP command""" 49 55 command = line[0] ··· 51 57 jump_targ = line[1] 52 58 if jump_targ.isdigit(): 53 59 target = int(line[1]) 54 - if target < 0 or target >= len(lines): 55 - raise ValueError(f"Invalid Jump Target: {target}") 56 - return target 60 + return handleTargetError(target, lines) 57 61 else: 58 62 target = findLabel(lines, line[1]) 59 - if target < 0 or target >= len(lines): 60 - raise ValueError(f"Invalid Jump Target: {target}") 61 - return target 63 + return handleTargetError(target, lines) 62 64 else: 63 65 expr = line[1] 64 66 if command[3] == "+": 65 67 var = int(expr[1]) 66 68 if values[var] > 0: 67 69 target = findLabel(lines, line[2]) 68 - if target < 0 or target >= len(lines): 69 - raise ValueError(f"Invalid Jump Target: {target}") 70 - return target 71 - return 70 + return handleTargetError(target, lines) 71 + return None 72 72 elif command[3] == "0": 73 73 var = int(expr[1]) 74 74 if values[var] == 0: 75 75 target = findLabel(lines, line[2]) 76 - if target < 0 or target >= len(lines): 77 - raise ValueError(f"Invalid Jump Target: {target}") 78 - return target 79 - return 76 + return handleTargetError(target, lines) 77 + return None 80 78 else: 81 79 raise ValueError(f"Invalid Jump Target: {line[0]}") 82 80 ··· 88 86 lines = [line.split() for line in lines if not line.startswith("!")] 89 87 90 88 values: List[int] = [] 91 - target = None 92 89 i = 0 93 90 return_value = None 94 91 while not return_value: 95 92 line = lines[i] 93 + i += 1 96 94 # print(f"executing {i}: {line}, L: {values}, A: {args}") 97 95 command = line[0] 98 - if ":" in line or (target and target != i): 99 - i += 1 96 + if ":" in line: 100 97 continue 101 - if target == i: 102 - target = None 103 - i += 1 104 98 if command.startswith("L"): 105 99 runL(args, values, line) 106 100 elif command.startswith("JMP"):
+88 -33
python/oct6/blackjack/main.py
··· 14 14 app_inst.dealerHand[0].hidden = True 15 15 app_inst.playerDrawing = True 16 16 17 + 17 18 def getScore(hand): 18 19 score = 0 19 20 aces = 0 20 21 for card in hand: 21 - if card.rank == 'Ace': 22 + if card.rank == "Ace": 22 23 aces += 1 23 24 score += 11 24 - elif card.rank in ['Jack', 'Queen', 'King']: 25 + elif card.rank in ["Jack", "Queen", "King"]: 25 26 score += 10 26 27 else: 27 28 score += int(card.rank) ··· 32 33 33 34 34 35 def onKeyPress(app_inst: AppWrapper, key): 35 - if key == 'h' and app_inst.playerDrawing: 36 + if key == "h" and app_inst.playerDrawing: 36 37 app_inst.playerHand.append(app_inst.deck.pop()) 37 - elif key == 's': 38 + elif key == "s": 38 39 app_inst.playerDrawing = False 39 40 app_inst.dealerHand[0].hidden = False 40 41 app_inst.dealerHand[1].hidden = False 41 - elif key == 'r': 42 + elif key == "r": 42 43 onAppStart(app_inst) 43 44 return 44 - elif key == 'q': 45 + elif key == "q": 45 46 exit() 46 47 47 48 dealer_score = getScore(app_inst.dealerHand) 48 49 player_score = getScore(app_inst.playerHand) 49 50 if player_score > 21: 50 - app_inst.status = 'loss' 51 + app_inst.status = "loss" 51 52 app_inst.playerDrawing = False 52 53 return 53 54 ··· 58 59 while dealer_score < 17: 59 60 app_inst.dealerHand.append(app_inst.deck.pop()) 60 61 if dealer_score > 21: 61 - app_inst.status = 'win' 62 + app_inst.status = "win" 62 63 app_inst.playerDrawing = False 63 64 return 64 65 if not app_inst.playerDrawing and dealer_score >= 17: 65 66 if player_score > dealer_score: 66 - app_inst.status = 'win' 67 + app_inst.status = "win" 67 68 elif player_score < dealer_score: 68 - app_inst.status = 'loss' 69 + app_inst.status = "loss" 69 70 else: 70 71 if len(app_inst.dealerHand) < len(app_inst.playerHand): 71 - app_inst.status = 'win' 72 + app_inst.status = "win" 72 73 else: 73 - app_inst.status = 'loss' 74 + app_inst.status = "loss" 74 75 75 - def redrawAll(app_inst: AppWrapper): 76 + 77 + def redrawAll(app_inst: AppWrapper): 76 78 print(app_inst.status, getScore(app_inst.dealerHand), getScore(app_inst.playerHand)) 77 79 match app_inst.status: 78 80 case "win": 79 81 app_inst.dealerHand[0].hidden = False 80 - drawLabel(f"Dealer's score: {getScore(app_inst.dealerHand)}", app_inst.width//2, 30) 81 - drawRect(app_inst.width//2-100, app_inst.height//2-50, 200, 100, fill="lightGreen") 82 - drawLabel("You Win!", app_inst.width//2, app_inst.height//2) 82 + drawLabel( 83 + f"Dealer's score: {getScore(app_inst.dealerHand)}", 84 + app_inst.width // 2, 85 + 30, 86 + ) 87 + drawRect( 88 + app_inst.width // 2 - 100, 89 + app_inst.height // 2 - 50, 90 + 200, 91 + 100, 92 + fill="lightGreen", 93 + ) 94 + drawLabel("You Win!", app_inst.width // 2, app_inst.height // 2) 83 95 case "loss": 84 96 app_inst.dealerHand[0].hidden = False 85 - drawLabel(f"Dealer's score: {getScore(app_inst.dealerHand)}", app_inst.width//2, 30) 86 - drawRect(app_inst.width//2-100, app_inst.height//2-50, 200, 100, fill="pink") 87 - drawLabel("You Lose!", app_inst.width//2, app_inst.height//2, fill="red") 97 + drawLabel( 98 + f"Dealer's score: {getScore(app_inst.dealerHand)}", 99 + app_inst.width // 2, 100 + 30, 101 + ) 102 + drawRect( 103 + app_inst.width // 2 - 100, 104 + app_inst.height // 2 - 50, 105 + 200, 106 + 100, 107 + fill="pink", 108 + ) 109 + drawLabel( 110 + "You Lose!", app_inst.width // 2, app_inst.height // 2, fill="red" 111 + ) 88 112 case _: 89 113 pass 90 114 91 115 dealer_card_count = len(app_inst.dealerHand) 92 116 for i, card in enumerate(app_inst.dealerHand): 93 - drawCard(app_inst, card, app_inst.width//2+25*dealer_card_count//2-i*37.5, 60+i*2) 117 + drawCard( 118 + app_inst, 119 + card, 120 + app_inst.width // 2 + 25 * dealer_card_count // 2 - i * 37.5, 121 + 60 + i * 2, 122 + ) 94 123 95 - drawLabel(f"Score: {getScore(app_inst.playerHand)}", app_inst.width//2, app_inst.height*3//4-20, size=18) 124 + drawLabel( 125 + f"Score: {getScore(app_inst.playerHand)}", 126 + app_inst.width // 2, 127 + app_inst.height * 3 // 4 - 20, 128 + size=18, 129 + ) 96 130 card_count = len(app_inst.playerHand) 97 131 for i, card in enumerate(app_inst.playerHand): 98 - drawCard(app_inst, card, app_inst.width//2+25*card_count//2-i*37.5, app_inst.height-60+i*2) 132 + drawCard( 133 + app_inst, 134 + card, 135 + app_inst.width // 2 + 25 * card_count // 2 - i * 37.5, 136 + app_inst.height - 60 + i * 2, 137 + ) 99 138 pass 139 + 100 140 101 141 def getSuitLabelAndColor(suit): 102 - if suit[0] == 'C': return '♣', 'black' 103 - elif suit[0] == 'D': return '♦', 'red' 104 - elif suit[0] == 'H': return '♥', 'red' 105 - else: return '♠', 'black' 142 + if suit[0] == "C": 143 + return "♣", "black" 144 + elif suit[0] == "D": 145 + return "♦", "red" 146 + elif suit[0] == "H": 147 + return "♥", "red" 148 + else: 149 + return "♠", "black" 150 + 106 151 107 152 def makeRandomDeck(): 108 153 # first make a sorted deck 109 - ranks = 'Ace,2,3,4,5,6,7,8,9,10,Jack,Queen,King'.split(',') 110 - suits = 'Clubs,Diamonds,Hearts,Spades'.split(',') 154 + ranks = "Ace,2,3,4,5,6,7,8,9,10,Jack,Queen,King".split(",") 155 + suits = "Clubs,Diamonds,Hearts,Spades".split(",") 111 156 deck = [makeCard(rank, suit) for rank in ranks for suit in suits] 112 157 # now shuffle and return the deck 113 158 random.shuffle(deck) 114 159 print([card.rank for card in deck]) 115 160 return deck 161 + 116 162 117 163 def makeCard(rank, suit): 118 164 card = SimpleNamespace() ··· 120 166 card.suit = suit 121 167 card.hidden = False 122 168 return card 169 + 123 170 124 171 def drawCard(app_inst: AppWrapper, card, x, y): 125 172 label, color = getSuitLabelAndColor(card.suit) 126 - drawRect(x-25, y-37.5, 50, 75, fill='white', border='black') 173 + drawRect(x - 25, y - 37.5, 50, 75, fill="white", border="black") 127 174 if card.hidden: 128 - drawRect(x-25, y-37.5, 50, 75, fill='gray', border='black') 175 + drawRect(x - 25, y - 37.5, 50, 75, fill="gray", border="black") 129 176 else: 130 - drawLabel(f'{label}', x-15, y-27.5, fill=color, size=20) 131 - drawLabel(f'{label}', x+15, y+27.5, fill=color, rotateAngle=180, size=20) 132 - drawLabel(f'{card.rank[0] if not card.rank.isdigit() else card.rank}', x, y, fill=color, size=20) 177 + drawLabel(f"{label}", x - 15, y - 27.5, fill=color, size=20) 178 + drawLabel(f"{label}", x + 15, y + 27.5, fill=color, rotateAngle=180, size=20) 179 + drawLabel( 180 + f"{card.rank[0] if not card.rank.isdigit() else card.rank}", 181 + x, 182 + y, 183 + fill=color, 184 + size=20, 185 + ) 186 + 133 187 134 188 def main(): 135 189 runApp() 190 + 136 191 137 192 main()
+249
python/oct6/snake/main.py
··· 1 + from cmu_graphics.cmu_graphics import app, AppWrapper 2 + from cmu_graphics import * 3 + from random import randint 4 + from time import sleep 5 + from sys import exit 6 + 7 + 8 + def onAppStart(app_inst: AppWrapper): 9 + app_inst.rows = 8 10 + app_inst.cols = 10 11 + app_inst.boardLeft = 25 12 + app_inst.boardTop = 85 13 + app_inst.boardWidth = 350 14 + app_inst.boardHeight = 280 15 + app_inst.cellBorderWidth = 1 16 + app_inst.snake = [(randint(0, app_inst.rows - 1), randint(0, app_inst.cols - 1))] 17 + app_inst.direction = [0, 0] 18 + app_inst.fruit = None 19 + app_inst.gameOver = False 20 + app_inst.portals = [(-1, -1), (-1, -1)] 21 + makePortals(app_inst) 22 + app_inst.poison = None 23 + 24 + 25 + def makePortals(app_inst: AppWrapper): 26 + while ( 27 + manhattenDist(app_inst.portals[0], app_inst.portals[1]) < 5 28 + or distanceToWall(app_inst, app_inst.portals[0]) < 2 29 + or distanceToWall(app_inst, app_inst.portals[1]) < 2 30 + ): 31 + app_inst.portals = [ 32 + (randint(0, app_inst.rows - 1), randint(0, app_inst.cols - 1)), 33 + (randint(0, app_inst.rows - 1), randint(0, app_inst.cols - 1)), 34 + ] 35 + 36 + 37 + def distanceToWall(app_inst: AppWrapper, pos): 38 + return min(pos[0], app_inst.rows - pos[0] - 1, pos[1], app_inst.cols - pos[1] - 1) 39 + 40 + 41 + def manhattenDist(p1, p2): 42 + return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1]) 43 + 44 + 45 + def onKeyPress(app_inst: AppWrapper, key): 46 + if key == "up" and not app_inst.direction[0]: 47 + app_inst.direction = [-1, 0] 48 + elif key == "down" and not app_inst.direction[0]: 49 + app_inst.direction = [1, 0] 50 + elif key == "left" and not app_inst.direction[1]: 51 + app_inst.direction = [0, -1] 52 + elif key == "right" and not app_inst.direction[1]: 53 + app_inst.direction = [0, 1] 54 + elif key == "r": 55 + onAppStart(app_inst) 56 + elif key == "q": 57 + exit() 58 + elif key == "space": 59 + app_inst.gameOver = True 60 + 61 + 62 + def moveSnake(app_inst: AppWrapper): 63 + if app_inst.gameOver: 64 + return 65 + head = app_inst.snake[0] 66 + newHead = ( 67 + (head[0] + app_inst.direction[0]) % app_inst.rows, 68 + (head[1] + app_inst.direction[1]) % app_inst.cols, 69 + ) 70 + app_inst.snake.insert(0, newHead) 71 + if newHead in app_inst.portals: 72 + app_inst.snake[0] = app_inst.portals[1 - app_inst.portals.index(newHead)] 73 + elif newHead == app_inst.poison: 74 + app_inst.gameOver = True 75 + if len(app_inst.snake) > 1: 76 + app_inst.snake.pop() 77 + for segment in app_inst.snake[1:]: 78 + if app_inst.snake[0] == segment: 79 + app_inst.gameOver = True 80 + 81 + 82 + def onStep(app_inst: AppWrapper): 83 + if not app_inst.fruit: 84 + makeFruit(app_inst) 85 + makePoison(app_inst) 86 + head = app_inst.snake[0] 87 + if head == app_inst.fruit: 88 + app_inst.fruit = None 89 + app_inst.snake.append(app_inst.snake[-1]) 90 + moveSnake(app_inst) 91 + 92 + 93 + def getCell(app_inst: AppWrapper, pos): 94 + if pos in app_inst.snake: 95 + return "snake" 96 + elif pos == app_inst.fruit: 97 + return "fruit" 98 + elif pos in app_inst.portals: 99 + return "portal" 100 + elif pos == app_inst.poison: 101 + return "poison" 102 + elif pos == None: 103 + return "empty" 104 + return None 105 + 106 + 107 + def makeFruit(app_inst: AppWrapper): 108 + fruit = None 109 + while getCell(app_inst, fruit) is not None: 110 + fruit = (randint(0, app_inst.rows - 1), randint(0, app_inst.cols - 1)) 111 + app_inst.fruit = fruit 112 + break 113 + 114 + 115 + def makePoison(app_inst: AppWrapper): 116 + poison = None 117 + while getCell(app_inst, poison) is not None: 118 + poison = (randint(0, app_inst.rows - 1), randint(0, app_inst.cols - 1)) 119 + app_inst.poison = poison 120 + break 121 + 122 + 123 + def redrawAll(app_inst: AppWrapper): 124 + drawLabel("Snake!", 200, 30, size=16) 125 + drawBoard(app_inst) 126 + drawBoardBorder(app_inst) 127 + drawFruit(app_inst) 128 + drawPoison(app_inst) 129 + drawPortals(app_inst) 130 + drawSnake(app_inst) 131 + sleep(0.1875) 132 + if app_inst.gameOver: 133 + drawGameOver(app_inst) 134 + 135 + 136 + def drawPoison(app_inst: AppWrapper): 137 + if app_inst.poison is not None: 138 + cellLeft, cellTop = getCellLeftTop(app_inst, *app_inst.poison) 139 + cellWidth, cellHeight = getCellSize(app_inst) 140 + drawCircle( 141 + cellLeft + cellWidth / 2, 142 + cellTop + cellHeight / 2, 143 + cellWidth / 2 - 6, 144 + fill="purple", 145 + ) 146 + 147 + 148 + def drawPortals(app_inst: AppWrapper): 149 + for portal in app_inst.portals: 150 + cellLeft, cellTop = getCellLeftTop(app_inst, portal[0], portal[1]) 151 + cellWidth, cellHeight = getCellSize(app_inst) 152 + drawCircle( 153 + cellLeft + cellWidth / 2, 154 + cellTop + cellHeight / 2, 155 + cellWidth / 2 - 6, 156 + fill="black", 157 + ) 158 + 159 + 160 + def drawGameOver(app_inst: AppWrapper): 161 + drawRect(app_inst.width / 2 - 150, app_inst.height / 2 - 50, 300, 100, fill="white") 162 + drawLabel("Game Over!", app_inst.width / 2, app_inst.height / 2 - 20, size=16) 163 + drawLabel( 164 + f"Score: {len(app_inst.snake)-1}", 165 + app_inst.width / 2, 166 + app_inst.height / 2, 167 + size=12, 168 + ) 169 + drawLabel( 170 + "Press R to restart", app_inst.width / 2, app_inst.height / 2 + 20, size=12 171 + ) 172 + drawLabel("Press Q to quit", app_inst.width / 2, app_inst.height / 2 + 40, size=12) 173 + 174 + 175 + def drawFruit(app_inst: AppWrapper): 176 + if app_inst.fruit is not None: 177 + cellLeft, cellTop = getCellLeftTop(app_inst, *app_inst.fruit) 178 + cellWidth, cellHeight = getCellSize(app_inst) 179 + drawCircle( 180 + cellLeft + cellWidth / 2, 181 + cellTop + cellHeight / 2, 182 + cellWidth / 2 - 8, 183 + fill="red", 184 + ) 185 + 186 + 187 + def drawSnake(app_inst: AppWrapper): 188 + cellWidth, cellHeight = getCellSize(app_inst) 189 + for i, segment in enumerate(app_inst.snake): 190 + cellLeft, cellTop = getCellLeftTop(app_inst, segment[0], segment[1]) 191 + color = "green" if i == 0 else "gray" 192 + drawCircle( 193 + cellLeft + cellWidth / 2, 194 + cellTop + cellHeight / 2, 195 + cellWidth / 2 - 4, 196 + fill=color, 197 + ) 198 + 199 + 200 + def drawBoard(app_inst: AppWrapper): 201 + for row in range(app_inst.rows): 202 + for col in range(app_inst.cols): 203 + drawCell(app_inst, row, col) 204 + 205 + 206 + def drawBoardBorder(app_inst: AppWrapper): 207 + drawRect( 208 + app_inst.boardLeft, 209 + app_inst.boardTop, 210 + app_inst.boardWidth, 211 + app_inst.boardHeight, 212 + fill=None, 213 + border="black", 214 + borderWidth=2 * app_inst.cellBorderWidth, 215 + ) 216 + 217 + 218 + def drawCell(app_inst: AppWrapper, row, col): 219 + cellLeft, cellTop = getCellLeftTop(app_inst, row, col) 220 + cellWidth, cellHeight = getCellSize(app_inst) 221 + drawRect( 222 + cellLeft, 223 + cellTop, 224 + cellWidth, 225 + cellHeight, 226 + fill=None, 227 + border="gray", 228 + borderWidth=app_inst.cellBorderWidth, 229 + ) 230 + 231 + 232 + def getCellLeftTop(app_inst: AppWrapper, row, col): 233 + cellWidth, cellHeight = getCellSize(app_inst) 234 + cellLeft = app_inst.boardLeft + col * cellWidth 235 + cellTop = app_inst.boardTop + row * cellHeight 236 + return (cellLeft, cellTop) 237 + 238 + 239 + def getCellSize(app_inst: AppWrapper): 240 + cellWidth = app_inst.boardWidth / app_inst.cols 241 + cellHeight = app_inst.boardHeight / app_inst.rows 242 + return (cellWidth, cellHeight) 243 + 244 + 245 + def main(): 246 + runApp() 247 + 248 + 249 + main()
+2451
python/oct6/wordle/main.py
··· 1 + from cmu_graphics.cmu_graphics import AppWrapper, app, runApp 2 + from cmu_graphics import * 3 + from random import choice 4 + from typing import List 5 + 6 + 7 + def onAppStart(app_inst: AppWrapper): 8 + app_inst.word = getWord() 9 + app_inst.guesses = [ 10 + ["", "", "", "", ""], 11 + ["", "", "", "", ""], 12 + ["", "", "", "", ""], 13 + ["", "", "", "", ""], 14 + ["", "", "", "", ""], 15 + ["", "", "", "", ""], 16 + ] 17 + app_inst.invalid_word = False 18 + app_inst.current_guess = 0 19 + app_inst.game_over = False 20 + 21 + 22 + def wordHistory(app_inst: AppWrapper): 23 + return ["".join(guess) for guess in app_inst.guesses[: app_inst.current_guess]] 24 + 25 + 26 + def onKeyPress(app_inst: AppWrapper, key): 27 + guess = ( 28 + app_inst.guesses[app_inst.current_guess] if app_inst.current_guess < 6 else [""] 29 + ) 30 + if key == "backspace": 31 + app_inst.invalid_word = False 32 + current_letter = guess.index("") if guess[4] == "" else 5 33 + app_inst.guesses[app_inst.current_guess][current_letter - 1] = "" 34 + elif key == "enter": 35 + if "".join(guess) not in getWords() or "".join(guess) in wordHistory(app_inst): 36 + app_inst.invalid_word = True 37 + return 38 + if app_inst.current_guess <= 6: 39 + app_inst.current_guess += 1 40 + if "".join(guess) == app_inst.word or app_inst.current_guess == 6: 41 + app_inst.game_over = True 42 + elif key == "r" and app_inst.game_over: 43 + onAppStart(app_inst) 44 + elif len(key) == 1 and key.isalpha(): 45 + current_letter = guess.index("") if guess[4] == "" else 4 46 + app_inst.guesses[app_inst.current_guess][current_letter] = key.lower() 47 + 48 + 49 + def letterCount(word): 50 + letter_count = {} 51 + for letter in word: 52 + if letter == "": 53 + continue 54 + letter_count[letter] = letter_count.get(letter, 0) + 1 55 + return letter_count 56 + 57 + 58 + def checkWord(app_inst: AppWrapper, word: List[str], index): 59 + if not index < app_inst.current_guess: 60 + if app_inst.invalid_word: 61 + return ["red", "red", "red", "red", "red"] 62 + return ["white", "white", "white", "white", "white"] 63 + letter_colors = ["gray", "gray", "gray", "gray", "gray"] 64 + correct_letter_count = letterCount(app_inst.word) 65 + for i, letter in enumerate(word): 66 + if letter == app_inst.word[i]: 67 + correct_letter_count[letter] -= 1 68 + letter_colors[i] = "green" 69 + for i, letter in enumerate(word): 70 + if letter in app_inst.word and correct_letter_count[letter] >= 1: 71 + letter_colors[i] = "yellow" 72 + correct_letter_count[letter] -= 1 73 + return letter_colors 74 + 75 + 76 + def drawCell(app_inst: AppWrapper, x, y, letter, color): 77 + cell_size = (app_inst.width - 150) / 5 78 + drawRect( 79 + x - cell_size / 2, 80 + y - cell_size / 2, 81 + cell_size, 82 + cell_size, 83 + fill=color, 84 + border="black", 85 + borderWidth=1, 86 + ) 87 + drawLabel(letter.upper(), x, y, size=cell_size * 0.8) 88 + 89 + 90 + def redrawAll(app_inst: AppWrapper): 91 + padding = 8 92 + x_play_area = app_inst.width - 150 93 + y_play_area = app_inst.height - 100 94 + x_center = x_play_area / 2 95 + y_center = y_play_area / 2 96 + x_border = x_center - (x_play_area / 10) - (padding * 2.5) 97 + y_border = y_center - (y_play_area / 4) - (padding * 3) 98 + for i, guess in enumerate(app_inst.guesses): 99 + if i > app_inst.current_guess: 100 + continue 101 + word_colors = checkWord(app_inst, guess, i) 102 + for j, letter in enumerate(guess): 103 + x_cell_center = x_border + (x_play_area / 5 + padding) * j 104 + y_cell_center = y_border + (y_play_area / 6 + padding) * i 105 + drawCell(app_inst, x_cell_center, y_cell_center, letter, word_colors[j]) 106 + guess = "".join(app_inst.guesses[app_inst.current_guess - 1]) 107 + if app_inst.game_over: 108 + text = "Game Over :(" 109 + if guess == app_inst.word: 110 + text = "You Win!" 111 + drawRect( 112 + app_inst.width / 2 - 150, 113 + app_inst.height / 2 - 50, 114 + 300, 115 + 100, 116 + fill="white", 117 + border="black", 118 + borderWidth=1, 119 + ) 120 + drawLabel(text, app_inst.width / 2, app_inst.height / 2, size=32) 121 + 122 + 123 + def getWord(): 124 + # Return a random wordle word 125 + # words from: https://www.wordunscrambler.net/word-list/wordle-word-list 126 + words = getWords() 127 + return choice(words) 128 + 129 + 130 + def getWords(): 131 + # Return a list of all 2309 wordle words 132 + # words from: https://www.wordunscrambler.net/word-list/wordle-word-list 133 + words = [ 134 + "aback", 135 + "abase", 136 + "abate", 137 + "abbey", 138 + "abbot", 139 + "abhor", 140 + "abide", 141 + "abled", 142 + "abode", 143 + "abort", 144 + "about", 145 + "above", 146 + "abuse", 147 + "abyss", 148 + "acorn", 149 + "acrid", 150 + "actor", 151 + "acute", 152 + "adage", 153 + "adapt", 154 + "adept", 155 + "admin", 156 + "admit", 157 + "adobe", 158 + "adopt", 159 + "adore", 160 + "adorn", 161 + "adult", 162 + "affix", 163 + "afire", 164 + "afoot", 165 + "afoul", 166 + "after", 167 + "again", 168 + "agape", 169 + "agate", 170 + "agent", 171 + "agile", 172 + "aging", 173 + "aglow", 174 + "agony", 175 + "agree", 176 + "ahead", 177 + "aider", 178 + "aisle", 179 + "alarm", 180 + "album", 181 + "alert", 182 + "algae", 183 + "alibi", 184 + "alien", 185 + "align", 186 + "alike", 187 + "alive", 188 + "allay", 189 + "alley", 190 + "allot", 191 + "allow", 192 + "alloy", 193 + "aloft", 194 + "alone", 195 + "along", 196 + "aloof", 197 + "aloud", 198 + "alpha", 199 + "altar", 200 + "alter", 201 + "amass", 202 + "amaze", 203 + "amber", 204 + "amble", 205 + "amend", 206 + "amiss", 207 + "amity", 208 + "among", 209 + "ample", 210 + "amply", 211 + "amuse", 212 + "angel", 213 + "anger", 214 + "angle", 215 + "angry", 216 + "angst", 217 + "anime", 218 + "ankle", 219 + "annex", 220 + "annoy", 221 + "annul", 222 + "anode", 223 + "antic", 224 + "anvil", 225 + "aorta", 226 + "apart", 227 + "aphid", 228 + "aping", 229 + "apnea", 230 + "apple", 231 + "apply", 232 + "apron", 233 + "aptly", 234 + "arbor", 235 + "ardor", 236 + "arena", 237 + "argue", 238 + "arise", 239 + "armor", 240 + "aroma", 241 + "arose", 242 + "array", 243 + "arrow", 244 + "arson", 245 + "artsy", 246 + "ascot", 247 + "ashen", 248 + "aside", 249 + "askew", 250 + "assay", 251 + "asset", 252 + "atoll", 253 + "atone", 254 + "attic", 255 + "audio", 256 + "audit", 257 + "augur", 258 + "aunty", 259 + "avail", 260 + "avert", 261 + "avian", 262 + "avoid", 263 + "await", 264 + "awake", 265 + "award", 266 + "aware", 267 + "awash", 268 + "awful", 269 + "awoke", 270 + "axial", 271 + "axiom", 272 + "axion", 273 + "azure", 274 + "bacon", 275 + "badge", 276 + "badly", 277 + "bagel", 278 + "baggy", 279 + "baker", 280 + "baler", 281 + "balmy", 282 + "banal", 283 + "banjo", 284 + "barge", 285 + "baron", 286 + "basal", 287 + "basic", 288 + "basil", 289 + "basin", 290 + "basis", 291 + "baste", 292 + "batch", 293 + "bathe", 294 + "baton", 295 + "batty", 296 + "bawdy", 297 + "bayou", 298 + "beach", 299 + "beady", 300 + "beard", 301 + "beast", 302 + "beech", 303 + "beefy", 304 + "befit", 305 + "began", 306 + "begat", 307 + "beget", 308 + "begin", 309 + "begun", 310 + "being", 311 + "belch", 312 + "belie", 313 + "belle", 314 + "belly", 315 + "below", 316 + "bench", 317 + "beret", 318 + "berry", 319 + "berth", 320 + "beset", 321 + "betel", 322 + "bevel", 323 + "bezel", 324 + "bible", 325 + "bicep", 326 + "biddy", 327 + "bigot", 328 + "bilge", 329 + "billy", 330 + "binge", 331 + "bingo", 332 + "biome", 333 + "birch", 334 + "birth", 335 + "bison", 336 + "bitty", 337 + "black", 338 + "blade", 339 + "blame", 340 + "bland", 341 + "blank", 342 + "blare", 343 + "blast", 344 + "blaze", 345 + "bleak", 346 + "bleat", 347 + "bleed", 348 + "bleep", 349 + "blend", 350 + "bless", 351 + "blimp", 352 + "blind", 353 + "blink", 354 + "bliss", 355 + "blitz", 356 + "bloat", 357 + "block", 358 + "bloke", 359 + "blond", 360 + "blood", 361 + "bloom", 362 + "blown", 363 + "bluer", 364 + "bluff", 365 + "blunt", 366 + "blurb", 367 + "blurt", 368 + "blush", 369 + "board", 370 + "boast", 371 + "bobby", 372 + "boney", 373 + "bongo", 374 + "bonus", 375 + "booby", 376 + "boost", 377 + "booth", 378 + "booty", 379 + "booze", 380 + "boozy", 381 + "borax", 382 + "borne", 383 + "bosom", 384 + "bossy", 385 + "botch", 386 + "bough", 387 + "boule", 388 + "bound", 389 + "bowel", 390 + "boxer", 391 + "brace", 392 + "braid", 393 + "brain", 394 + "brake", 395 + "brand", 396 + "brash", 397 + "brass", 398 + "brave", 399 + "bravo", 400 + "brawl", 401 + "brawn", 402 + "bread", 403 + "break", 404 + "breed", 405 + "briar", 406 + "bribe", 407 + "brick", 408 + "bride", 409 + "brief", 410 + "brine", 411 + "bring", 412 + "brink", 413 + "briny", 414 + "brisk", 415 + "broad", 416 + "broil", 417 + "broke", 418 + "brood", 419 + "brook", 420 + "broom", 421 + "broth", 422 + "brown", 423 + "brunt", 424 + "brush", 425 + "brute", 426 + "buddy", 427 + "budge", 428 + "buggy", 429 + "bugle", 430 + "build", 431 + "built", 432 + "bulge", 433 + "bulky", 434 + "bully", 435 + "bunch", 436 + "bunny", 437 + "burly", 438 + "burnt", 439 + "burst", 440 + "bused", 441 + "bushy", 442 + "butch", 443 + "butte", 444 + "buxom", 445 + "buyer", 446 + "bylaw", 447 + "cabal", 448 + "cabby", 449 + "cabin", 450 + "cable", 451 + "cacao", 452 + "cache", 453 + "cacti", 454 + "caddy", 455 + "cadet", 456 + "cagey", 457 + "cairn", 458 + "camel", 459 + "cameo", 460 + "canal", 461 + "candy", 462 + "canny", 463 + "canoe", 464 + "canon", 465 + "caper", 466 + "caput", 467 + "carat", 468 + "cargo", 469 + "carol", 470 + "carry", 471 + "carve", 472 + "caste", 473 + "catch", 474 + "cater", 475 + "catty", 476 + "caulk", 477 + "cause", 478 + "cavil", 479 + "cease", 480 + "cedar", 481 + "cello", 482 + "chafe", 483 + "chaff", 484 + "chain", 485 + "chair", 486 + "chalk", 487 + "champ", 488 + "chant", 489 + "chaos", 490 + "chard", 491 + "charm", 492 + "chart", 493 + "chase", 494 + "chasm", 495 + "cheap", 496 + "cheat", 497 + "check", 498 + "cheek", 499 + "cheer", 500 + "chess", 501 + "chest", 502 + "chick", 503 + "chide", 504 + "chief", 505 + "child", 506 + "chili", 507 + "chill", 508 + "chime", 509 + "china", 510 + "chirp", 511 + "chock", 512 + "choir", 513 + "choke", 514 + "chord", 515 + "chore", 516 + "chose", 517 + "chuck", 518 + "chump", 519 + "chunk", 520 + "churn", 521 + "chute", 522 + "cider", 523 + "cigar", 524 + "cinch", 525 + "circa", 526 + "civic", 527 + "civil", 528 + "clack", 529 + "claim", 530 + "clamp", 531 + "clang", 532 + "clank", 533 + "clash", 534 + "clasp", 535 + "class", 536 + "clean", 537 + "clear", 538 + "cleat", 539 + "cleft", 540 + "clerk", 541 + "click", 542 + "cliff", 543 + "climb", 544 + "cling", 545 + "clink", 546 + "cloak", 547 + "clock", 548 + "clone", 549 + "close", 550 + "cloth", 551 + "cloud", 552 + "clout", 553 + "clove", 554 + "clown", 555 + "cluck", 556 + "clued", 557 + "clump", 558 + "clung", 559 + "coach", 560 + "coast", 561 + "cobra", 562 + "cocoa", 563 + "colon", 564 + "color", 565 + "comet", 566 + "comfy", 567 + "comic", 568 + "comma", 569 + "conch", 570 + "condo", 571 + "conic", 572 + "copse", 573 + "coral", 574 + "corer", 575 + "corny", 576 + "couch", 577 + "cough", 578 + "could", 579 + "count", 580 + "coupe", 581 + "court", 582 + "coven", 583 + "cover", 584 + "covet", 585 + "covey", 586 + "cower", 587 + "coyly", 588 + "crack", 589 + "craft", 590 + "cramp", 591 + "crane", 592 + "crank", 593 + "crash", 594 + "crass", 595 + "crate", 596 + "crave", 597 + "crawl", 598 + "craze", 599 + "crazy", 600 + "creak", 601 + "cream", 602 + "credo", 603 + "creed", 604 + "creek", 605 + "creep", 606 + "creme", 607 + "crepe", 608 + "crept", 609 + "cress", 610 + "crest", 611 + "crick", 612 + "cried", 613 + "crier", 614 + "crime", 615 + "crimp", 616 + "crisp", 617 + "croak", 618 + "crock", 619 + "crone", 620 + "crony", 621 + "crook", 622 + "cross", 623 + "croup", 624 + "crowd", 625 + "crown", 626 + "crude", 627 + "cruel", 628 + "crumb", 629 + "crump", 630 + "crush", 631 + "crust", 632 + "crypt", 633 + "cubic", 634 + "cumin", 635 + "curio", 636 + "curly", 637 + "curry", 638 + "curse", 639 + "curve", 640 + "curvy", 641 + "cutie", 642 + "cyber", 643 + "cycle", 644 + "cynic", 645 + "daddy", 646 + "daily", 647 + "dairy", 648 + "daisy", 649 + "dally", 650 + "dance", 651 + "dandy", 652 + "datum", 653 + "daunt", 654 + "dealt", 655 + "death", 656 + "debar", 657 + "debit", 658 + "debug", 659 + "debut", 660 + "decal", 661 + "decay", 662 + "decor", 663 + "decoy", 664 + "decry", 665 + "defer", 666 + "deign", 667 + "deity", 668 + "delay", 669 + "delta", 670 + "delve", 671 + "demon", 672 + "demur", 673 + "denim", 674 + "dense", 675 + "depot", 676 + "depth", 677 + "derby", 678 + "deter", 679 + "detox", 680 + "deuce", 681 + "devil", 682 + "diary", 683 + "dicey", 684 + "digit", 685 + "dilly", 686 + "dimly", 687 + "diner", 688 + "dingo", 689 + "dingy", 690 + "diode", 691 + "dirge", 692 + "dirty", 693 + "disco", 694 + "ditch", 695 + "ditto", 696 + "ditty", 697 + "diver", 698 + "dizzy", 699 + "dodge", 700 + "dodgy", 701 + "dogma", 702 + "doing", 703 + "dolly", 704 + "donor", 705 + "donut", 706 + "dopey", 707 + "doubt", 708 + "dough", 709 + "dowdy", 710 + "dowel", 711 + "downy", 712 + "dowry", 713 + "dozen", 714 + "draft", 715 + "drain", 716 + "drake", 717 + "drama", 718 + "drank", 719 + "drape", 720 + "drawl", 721 + "drawn", 722 + "dread", 723 + "dream", 724 + "dress", 725 + "dried", 726 + "drier", 727 + "drift", 728 + "drill", 729 + "drink", 730 + "drive", 731 + "droit", 732 + "droll", 733 + "drone", 734 + "drool", 735 + "droop", 736 + "dross", 737 + "drove", 738 + "drown", 739 + "druid", 740 + "drunk", 741 + "dryer", 742 + "dryly", 743 + "duchy", 744 + "dully", 745 + "dummy", 746 + "dumpy", 747 + "dunce", 748 + "dusky", 749 + "dusty", 750 + "dutch", 751 + "duvet", 752 + "dwarf", 753 + "dwell", 754 + "dwelt", 755 + "dying", 756 + "eager", 757 + "eagle", 758 + "early", 759 + "earth", 760 + "easel", 761 + "eaten", 762 + "eater", 763 + "ebony", 764 + "eclat", 765 + "edict", 766 + "edify", 767 + "eerie", 768 + "egret", 769 + "eight", 770 + "eject", 771 + "eking", 772 + "elate", 773 + "elbow", 774 + "elder", 775 + "elect", 776 + "elegy", 777 + "elfin", 778 + "elide", 779 + "elite", 780 + "elope", 781 + "elude", 782 + "email", 783 + "embed", 784 + "ember", 785 + "emcee", 786 + "empty", 787 + "enact", 788 + "endow", 789 + "enema", 790 + "enemy", 791 + "enjoy", 792 + "ennui", 793 + "ensue", 794 + "enter", 795 + "entry", 796 + "envoy", 797 + "epoch", 798 + "epoxy", 799 + "equal", 800 + "equip", 801 + "erase", 802 + "erect", 803 + "erode", 804 + "error", 805 + "erupt", 806 + "essay", 807 + "ester", 808 + "ether", 809 + "ethic", 810 + "ethos", 811 + "etude", 812 + "evade", 813 + "event", 814 + "every", 815 + "evict", 816 + "evoke", 817 + "exact", 818 + "exalt", 819 + "excel", 820 + "exert", 821 + "exile", 822 + "exist", 823 + "expel", 824 + "extol", 825 + "extra", 826 + "exult", 827 + "eying", 828 + "fable", 829 + "facet", 830 + "faint", 831 + "fairy", 832 + "faith", 833 + "false", 834 + "fancy", 835 + "fanny", 836 + "farce", 837 + "fatal", 838 + "fatty", 839 + "fault", 840 + "fauna", 841 + "favor", 842 + "feast", 843 + "fecal", 844 + "feign", 845 + "fella", 846 + "felon", 847 + "femme", 848 + "femur", 849 + "fence", 850 + "feral", 851 + "ferry", 852 + "fetal", 853 + "fetch", 854 + "fetid", 855 + "fetus", 856 + "fever", 857 + "fewer", 858 + "fiber", 859 + "ficus", 860 + "field", 861 + "fiend", 862 + "fiery", 863 + "fifth", 864 + "fifty", 865 + "fight", 866 + "filer", 867 + "filet", 868 + "filly", 869 + "filmy", 870 + "filth", 871 + "final", 872 + "finch", 873 + "finer", 874 + "first", 875 + "fishy", 876 + "fixer", 877 + "fizzy", 878 + "fjord", 879 + "flack", 880 + "flail", 881 + "flair", 882 + "flake", 883 + "flaky", 884 + "flame", 885 + "flank", 886 + "flare", 887 + "flash", 888 + "flask", 889 + "fleck", 890 + "fleet", 891 + "flesh", 892 + "flick", 893 + "flier", 894 + "fling", 895 + "flint", 896 + "flirt", 897 + "float", 898 + "flock", 899 + "flood", 900 + "floor", 901 + "flora", 902 + "floss", 903 + "flour", 904 + "flout", 905 + "flown", 906 + "fluff", 907 + "fluid", 908 + "fluke", 909 + "flume", 910 + "flung", 911 + "flunk", 912 + "flush", 913 + "flute", 914 + "flyer", 915 + "foamy", 916 + "focal", 917 + "focus", 918 + "foggy", 919 + "foist", 920 + "folio", 921 + "folly", 922 + "foray", 923 + "force", 924 + "forge", 925 + "forgo", 926 + "forte", 927 + "forth", 928 + "forty", 929 + "forum", 930 + "found", 931 + "foyer", 932 + "frail", 933 + "frame", 934 + "frank", 935 + "fraud", 936 + "freak", 937 + "freed", 938 + "freer", 939 + "fresh", 940 + "friar", 941 + "fried", 942 + "frill", 943 + "frisk", 944 + "fritz", 945 + "frock", 946 + "frond", 947 + "front", 948 + "frost", 949 + "froth", 950 + "frown", 951 + "froze", 952 + "fruit", 953 + "fudge", 954 + "fugue", 955 + "fully", 956 + "fungi", 957 + "funky", 958 + "funny", 959 + "furor", 960 + "furry", 961 + "fussy", 962 + "fuzzy", 963 + "gaffe", 964 + "gaily", 965 + "gamer", 966 + "gamma", 967 + "gamut", 968 + "gassy", 969 + "gaudy", 970 + "gauge", 971 + "gaunt", 972 + "gauze", 973 + "gavel", 974 + "gawky", 975 + "gayer", 976 + "gayly", 977 + "gazer", 978 + "gecko", 979 + "geeky", 980 + "geese", 981 + "genie", 982 + "genre", 983 + "ghost", 984 + "ghoul", 985 + "giant", 986 + "giddy", 987 + "gipsy", 988 + "girly", 989 + "girth", 990 + "given", 991 + "giver", 992 + "glade", 993 + "gland", 994 + "glare", 995 + "glass", 996 + "glaze", 997 + "gleam", 998 + "glean", 999 + "glide", 1000 + "glint", 1001 + "gloat", 1002 + "globe", 1003 + "gloom", 1004 + "glory", 1005 + "gloss", 1006 + "glove", 1007 + "glyph", 1008 + "gnash", 1009 + "gnome", 1010 + "godly", 1011 + "going", 1012 + "golem", 1013 + "golly", 1014 + "gonad", 1015 + "goner", 1016 + "goody", 1017 + "gooey", 1018 + "goofy", 1019 + "goose", 1020 + "gorge", 1021 + "gouge", 1022 + "gourd", 1023 + "grace", 1024 + "grade", 1025 + "graft", 1026 + "grail", 1027 + "grain", 1028 + "grand", 1029 + "grant", 1030 + "grape", 1031 + "graph", 1032 + "grasp", 1033 + "grass", 1034 + "grate", 1035 + "grave", 1036 + "gravy", 1037 + "graze", 1038 + "great", 1039 + "greed", 1040 + "green", 1041 + "greet", 1042 + "grief", 1043 + "grill", 1044 + "grime", 1045 + "grimy", 1046 + "grind", 1047 + "gripe", 1048 + "groan", 1049 + "groin", 1050 + "groom", 1051 + "grope", 1052 + "gross", 1053 + "group", 1054 + "grout", 1055 + "grove", 1056 + "growl", 1057 + "grown", 1058 + "gruel", 1059 + "gruff", 1060 + "grunt", 1061 + "guard", 1062 + "guava", 1063 + "guess", 1064 + "guest", 1065 + "guide", 1066 + "guild", 1067 + "guile", 1068 + "guilt", 1069 + "guise", 1070 + "gulch", 1071 + "gully", 1072 + "gumbo", 1073 + "gummy", 1074 + "guppy", 1075 + "gusto", 1076 + "gusty", 1077 + "gypsy", 1078 + "habit", 1079 + "hairy", 1080 + "halve", 1081 + "handy", 1082 + "happy", 1083 + "hardy", 1084 + "harem", 1085 + "harpy", 1086 + "harry", 1087 + "harsh", 1088 + "haste", 1089 + "hasty", 1090 + "hatch", 1091 + "hater", 1092 + "haunt", 1093 + "haute", 1094 + "haven", 1095 + "havoc", 1096 + "hazel", 1097 + "heady", 1098 + "heard", 1099 + "heart", 1100 + "heath", 1101 + "heave", 1102 + "heavy", 1103 + "hedge", 1104 + "hefty", 1105 + "heist", 1106 + "helix", 1107 + "hello", 1108 + "hence", 1109 + "heron", 1110 + "hilly", 1111 + "hinge", 1112 + "hippo", 1113 + "hippy", 1114 + "hitch", 1115 + "hoard", 1116 + "hobby", 1117 + "hoist", 1118 + "holly", 1119 + "homer", 1120 + "honey", 1121 + "honor", 1122 + "horde", 1123 + "horny", 1124 + "horse", 1125 + "hotel", 1126 + "hotly", 1127 + "hound", 1128 + "house", 1129 + "hovel", 1130 + "hover", 1131 + "howdy", 1132 + "human", 1133 + "humid", 1134 + "humor", 1135 + "humph", 1136 + "humus", 1137 + "hunch", 1138 + "hunky", 1139 + "hurry", 1140 + "husky", 1141 + "hussy", 1142 + "hutch", 1143 + "hydro", 1144 + "hyena", 1145 + "hymen", 1146 + "hyper", 1147 + "icily", 1148 + "icing", 1149 + "ideal", 1150 + "idiom", 1151 + "idiot", 1152 + "idler", 1153 + "idyll", 1154 + "igloo", 1155 + "iliac", 1156 + "image", 1157 + "imbue", 1158 + "impel", 1159 + "imply", 1160 + "inane", 1161 + "inbox", 1162 + "incur", 1163 + "index", 1164 + "inept", 1165 + "inert", 1166 + "infer", 1167 + "ingot", 1168 + "inlay", 1169 + "inlet", 1170 + "inner", 1171 + "input", 1172 + "inter", 1173 + "intro", 1174 + "ionic", 1175 + "irate", 1176 + "irony", 1177 + "islet", 1178 + "issue", 1179 + "itchy", 1180 + "ivory", 1181 + "jaunt", 1182 + "jazzy", 1183 + "jelly", 1184 + "jerky", 1185 + "jetty", 1186 + "jewel", 1187 + "jiffy", 1188 + "joint", 1189 + "joist", 1190 + "joker", 1191 + "jolly", 1192 + "joust", 1193 + "judge", 1194 + "juice", 1195 + "juicy", 1196 + "jumbo", 1197 + "jumpy", 1198 + "junta", 1199 + "junto", 1200 + "juror", 1201 + "kappa", 1202 + "karma", 1203 + "kayak", 1204 + "kebab", 1205 + "khaki", 1206 + "kinky", 1207 + "kiosk", 1208 + "kitty", 1209 + "knack", 1210 + "knave", 1211 + "knead", 1212 + "kneed", 1213 + "kneel", 1214 + "knelt", 1215 + "knife", 1216 + "knock", 1217 + "knoll", 1218 + "known", 1219 + "koala", 1220 + "krill", 1221 + "label", 1222 + "labor", 1223 + "laden", 1224 + "ladle", 1225 + "lager", 1226 + "lance", 1227 + "lanky", 1228 + "lapel", 1229 + "lapse", 1230 + "large", 1231 + "larva", 1232 + "lasso", 1233 + "latch", 1234 + "later", 1235 + "lathe", 1236 + "latte", 1237 + "laugh", 1238 + "layer", 1239 + "leach", 1240 + "leafy", 1241 + "leaky", 1242 + "leant", 1243 + "leapt", 1244 + "learn", 1245 + "lease", 1246 + "leash", 1247 + "least", 1248 + "leave", 1249 + "ledge", 1250 + "leech", 1251 + "leery", 1252 + "lefty", 1253 + "legal", 1254 + "leggy", 1255 + "lemon", 1256 + "lemur", 1257 + "leper", 1258 + "level", 1259 + "lever", 1260 + "libel", 1261 + "liege", 1262 + "light", 1263 + "liken", 1264 + "lilac", 1265 + "limbo", 1266 + "limit", 1267 + "linen", 1268 + "liner", 1269 + "lingo", 1270 + "lipid", 1271 + "lithe", 1272 + "liver", 1273 + "livid", 1274 + "llama", 1275 + "loamy", 1276 + "loath", 1277 + "lobby", 1278 + "local", 1279 + "locus", 1280 + "lodge", 1281 + "lofty", 1282 + "logic", 1283 + "login", 1284 + "loopy", 1285 + "loose", 1286 + "lorry", 1287 + "loser", 1288 + "louse", 1289 + "lousy", 1290 + "lover", 1291 + "lower", 1292 + "lowly", 1293 + "loyal", 1294 + "lucid", 1295 + "lucky", 1296 + "lumen", 1297 + "lumpy", 1298 + "lunar", 1299 + "lunch", 1300 + "lunge", 1301 + "lupus", 1302 + "lurch", 1303 + "lurid", 1304 + "lusty", 1305 + "lying", 1306 + "lymph", 1307 + "lyric", 1308 + "macaw", 1309 + "macho", 1310 + "macro", 1311 + "madam", 1312 + "madly", 1313 + "mafia", 1314 + "magic", 1315 + "magma", 1316 + "maize", 1317 + "major", 1318 + "maker", 1319 + "mambo", 1320 + "mamma", 1321 + "mammy", 1322 + "manga", 1323 + "mange", 1324 + "mango", 1325 + "mangy", 1326 + "mania", 1327 + "manic", 1328 + "manly", 1329 + "manor", 1330 + "maple", 1331 + "march", 1332 + "marry", 1333 + "marsh", 1334 + "mason", 1335 + "masse", 1336 + "match", 1337 + "matey", 1338 + "mauve", 1339 + "maxim", 1340 + "maybe", 1341 + "mayor", 1342 + "mealy", 1343 + "meant", 1344 + "meaty", 1345 + "mecca", 1346 + "medal", 1347 + "media", 1348 + "medic", 1349 + "melee", 1350 + "melon", 1351 + "mercy", 1352 + "merge", 1353 + "merit", 1354 + "merry", 1355 + "metal", 1356 + "meter", 1357 + "metro", 1358 + "micro", 1359 + "midge", 1360 + "midst", 1361 + "might", 1362 + "milky", 1363 + "mimic", 1364 + "mince", 1365 + "miner", 1366 + "minim", 1367 + "minor", 1368 + "minty", 1369 + "minus", 1370 + "mirth", 1371 + "miser", 1372 + "missy", 1373 + "mocha", 1374 + "modal", 1375 + "model", 1376 + "modem", 1377 + "mogul", 1378 + "moist", 1379 + "molar", 1380 + "moldy", 1381 + "money", 1382 + "month", 1383 + "moody", 1384 + "moose", 1385 + "moral", 1386 + "moron", 1387 + "morph", 1388 + "mossy", 1389 + "motel", 1390 + "motif", 1391 + "motor", 1392 + "motto", 1393 + "moult", 1394 + "mound", 1395 + "mount", 1396 + "mourn", 1397 + "mouse", 1398 + "mouth", 1399 + "mover", 1400 + "movie", 1401 + "mower", 1402 + "mucky", 1403 + "mucus", 1404 + "muddy", 1405 + "mulch", 1406 + "mummy", 1407 + "munch", 1408 + "mural", 1409 + "murky", 1410 + "mushy", 1411 + "music", 1412 + "musky", 1413 + "musty", 1414 + "myrrh", 1415 + "nadir", 1416 + "naive", 1417 + "nanny", 1418 + "nasal", 1419 + "nasty", 1420 + "natal", 1421 + "naval", 1422 + "navel", 1423 + "needy", 1424 + "neigh", 1425 + "nerdy", 1426 + "nerve", 1427 + "never", 1428 + "newer", 1429 + "newly", 1430 + "nicer", 1431 + "niche", 1432 + "niece", 1433 + "night", 1434 + "ninja", 1435 + "ninny", 1436 + "ninth", 1437 + "noble", 1438 + "nobly", 1439 + "noise", 1440 + "noisy", 1441 + "nomad", 1442 + "noose", 1443 + "north", 1444 + "nosey", 1445 + "notch", 1446 + "novel", 1447 + "nudge", 1448 + "nurse", 1449 + "nutty", 1450 + "nylon", 1451 + "nymph", 1452 + "oaken", 1453 + "obese", 1454 + "occur", 1455 + "ocean", 1456 + "octal", 1457 + "octet", 1458 + "odder", 1459 + "oddly", 1460 + "offal", 1461 + "offer", 1462 + "often", 1463 + "olden", 1464 + "older", 1465 + "olive", 1466 + "ombre", 1467 + "omega", 1468 + "onion", 1469 + "onset", 1470 + "opera", 1471 + "opine", 1472 + "opium", 1473 + "optic", 1474 + "orbit", 1475 + "order", 1476 + "organ", 1477 + "other", 1478 + "otter", 1479 + "ought", 1480 + "ounce", 1481 + "outdo", 1482 + "outer", 1483 + "outgo", 1484 + "ovary", 1485 + "ovate", 1486 + "overt", 1487 + "ovine", 1488 + "ovoid", 1489 + "owing", 1490 + "owner", 1491 + "oxide", 1492 + "ozone", 1493 + "paddy", 1494 + "pagan", 1495 + "paint", 1496 + "paler", 1497 + "palsy", 1498 + "panel", 1499 + "panic", 1500 + "pansy", 1501 + "papal", 1502 + "paper", 1503 + "parer", 1504 + "parka", 1505 + "parry", 1506 + "parse", 1507 + "party", 1508 + "pasta", 1509 + "paste", 1510 + "pasty", 1511 + "patch", 1512 + "patio", 1513 + "patsy", 1514 + "patty", 1515 + "pause", 1516 + "payee", 1517 + "payer", 1518 + "peace", 1519 + "peach", 1520 + "pearl", 1521 + "pecan", 1522 + "pedal", 1523 + "penal", 1524 + "pence", 1525 + "penne", 1526 + "penny", 1527 + "perch", 1528 + "peril", 1529 + "perky", 1530 + "pesky", 1531 + "pesto", 1532 + "petal", 1533 + "petty", 1534 + "phase", 1535 + "phone", 1536 + "phony", 1537 + "photo", 1538 + "piano", 1539 + "picky", 1540 + "piece", 1541 + "piety", 1542 + "piggy", 1543 + "pilot", 1544 + "pinch", 1545 + "piney", 1546 + "pinky", 1547 + "pinto", 1548 + "piper", 1549 + "pique", 1550 + "pitch", 1551 + "pithy", 1552 + "pivot", 1553 + "pixel", 1554 + "pixie", 1555 + "pizza", 1556 + "place", 1557 + "plaid", 1558 + "plain", 1559 + "plait", 1560 + "plane", 1561 + "plank", 1562 + "plant", 1563 + "plate", 1564 + "plaza", 1565 + "plead", 1566 + "pleat", 1567 + "plied", 1568 + "plier", 1569 + "pluck", 1570 + "plumb", 1571 + "plume", 1572 + "plump", 1573 + "plunk", 1574 + "plush", 1575 + "poesy", 1576 + "point", 1577 + "poise", 1578 + "poker", 1579 + "polar", 1580 + "polka", 1581 + "polyp", 1582 + "pooch", 1583 + "poppy", 1584 + "porch", 1585 + "poser", 1586 + "posit", 1587 + "posse", 1588 + "pouch", 1589 + "pound", 1590 + "pouty", 1591 + "power", 1592 + "prank", 1593 + "prawn", 1594 + "preen", 1595 + "press", 1596 + "price", 1597 + "prick", 1598 + "pride", 1599 + "pried", 1600 + "prime", 1601 + "primo", 1602 + "print", 1603 + "prior", 1604 + "prism", 1605 + "privy", 1606 + "prize", 1607 + "probe", 1608 + "prone", 1609 + "prong", 1610 + "proof", 1611 + "prose", 1612 + "proud", 1613 + "prove", 1614 + "prowl", 1615 + "proxy", 1616 + "prude", 1617 + "prune", 1618 + "psalm", 1619 + "pubic", 1620 + "pudgy", 1621 + "puffy", 1622 + "pulpy", 1623 + "pulse", 1624 + "punch", 1625 + "pupil", 1626 + "puppy", 1627 + "puree", 1628 + "purer", 1629 + "purge", 1630 + "purse", 1631 + "pushy", 1632 + "putty", 1633 + "pygmy", 1634 + "quack", 1635 + "quail", 1636 + "quake", 1637 + "qualm", 1638 + "quark", 1639 + "quart", 1640 + "quash", 1641 + "quasi", 1642 + "queen", 1643 + "queer", 1644 + "quell", 1645 + "query", 1646 + "quest", 1647 + "queue", 1648 + "quick", 1649 + "quiet", 1650 + "quill", 1651 + "quilt", 1652 + "quirk", 1653 + "quite", 1654 + "quota", 1655 + "quote", 1656 + "quoth", 1657 + "rabbi", 1658 + "rabid", 1659 + "racer", 1660 + "radar", 1661 + "radii", 1662 + "radio", 1663 + "rainy", 1664 + "raise", 1665 + "rajah", 1666 + "rally", 1667 + "ralph", 1668 + "ramen", 1669 + "ranch", 1670 + "randy", 1671 + "range", 1672 + "rapid", 1673 + "rarer", 1674 + "raspy", 1675 + "ratio", 1676 + "ratty", 1677 + "raven", 1678 + "rayon", 1679 + "razor", 1680 + "reach", 1681 + "react", 1682 + "ready", 1683 + "realm", 1684 + "rearm", 1685 + "rebar", 1686 + "rebel", 1687 + "rebus", 1688 + "rebut", 1689 + "recap", 1690 + "recur", 1691 + "recut", 1692 + "reedy", 1693 + "refer", 1694 + "refit", 1695 + "regal", 1696 + "rehab", 1697 + "reign", 1698 + "relax", 1699 + "relay", 1700 + "relic", 1701 + "remit", 1702 + "renal", 1703 + "renew", 1704 + "repay", 1705 + "repel", 1706 + "reply", 1707 + "rerun", 1708 + "reset", 1709 + "resin", 1710 + "retch", 1711 + "retro", 1712 + "retry", 1713 + "reuse", 1714 + "revel", 1715 + "revue", 1716 + "rhino", 1717 + "rhyme", 1718 + "rider", 1719 + "ridge", 1720 + "rifle", 1721 + "right", 1722 + "rigid", 1723 + "rigor", 1724 + "rinse", 1725 + "ripen", 1726 + "riper", 1727 + "risen", 1728 + "riser", 1729 + "risky", 1730 + "rival", 1731 + "river", 1732 + "rivet", 1733 + "roach", 1734 + "roast", 1735 + "robin", 1736 + "robot", 1737 + "rocky", 1738 + "rodeo", 1739 + "roger", 1740 + "rogue", 1741 + "roomy", 1742 + "roost", 1743 + "rotor", 1744 + "rouge", 1745 + "rough", 1746 + "round", 1747 + "rouse", 1748 + "route", 1749 + "rover", 1750 + "rowdy", 1751 + "rower", 1752 + "royal", 1753 + "ruddy", 1754 + "ruder", 1755 + "rugby", 1756 + "ruler", 1757 + "rumba", 1758 + "rumor", 1759 + "rupee", 1760 + "rural", 1761 + "rusty", 1762 + "sadly", 1763 + "safer", 1764 + "saint", 1765 + "salad", 1766 + "sally", 1767 + "salon", 1768 + "salsa", 1769 + "salty", 1770 + "salve", 1771 + "salvo", 1772 + "sandy", 1773 + "saner", 1774 + "sappy", 1775 + "sassy", 1776 + "satin", 1777 + "satyr", 1778 + "sauce", 1779 + "saucy", 1780 + "sauna", 1781 + "saute", 1782 + "savor", 1783 + "savoy", 1784 + "savvy", 1785 + "scald", 1786 + "scale", 1787 + "scalp", 1788 + "scaly", 1789 + "scamp", 1790 + "scant", 1791 + "scare", 1792 + "scarf", 1793 + "scary", 1794 + "scene", 1795 + "scent", 1796 + "scion", 1797 + "scoff", 1798 + "scold", 1799 + "scone", 1800 + "scoop", 1801 + "scope", 1802 + "score", 1803 + "scorn", 1804 + "scour", 1805 + "scout", 1806 + "scowl", 1807 + "scram", 1808 + "scrap", 1809 + "scree", 1810 + "screw", 1811 + "scrub", 1812 + "scrum", 1813 + "scuba", 1814 + "sedan", 1815 + "seedy", 1816 + "segue", 1817 + "seize", 1818 + "semen", 1819 + "sense", 1820 + "sepia", 1821 + "serif", 1822 + "serum", 1823 + "serve", 1824 + "setup", 1825 + "seven", 1826 + "sever", 1827 + "sewer", 1828 + "shack", 1829 + "shade", 1830 + "shady", 1831 + "shaft", 1832 + "shake", 1833 + "shaky", 1834 + "shale", 1835 + "shall", 1836 + "shalt", 1837 + "shame", 1838 + "shank", 1839 + "shape", 1840 + "shard", 1841 + "share", 1842 + "shark", 1843 + "sharp", 1844 + "shave", 1845 + "shawl", 1846 + "shear", 1847 + "sheen", 1848 + "sheep", 1849 + "sheer", 1850 + "sheet", 1851 + "sheik", 1852 + "shelf", 1853 + "shell", 1854 + "shied", 1855 + "shift", 1856 + "shine", 1857 + "shiny", 1858 + "shire", 1859 + "shirk", 1860 + "shirt", 1861 + "shoal", 1862 + "shock", 1863 + "shone", 1864 + "shook", 1865 + "shoot", 1866 + "shore", 1867 + "shorn", 1868 + "short", 1869 + "shout", 1870 + "shove", 1871 + "shown", 1872 + "showy", 1873 + "shrew", 1874 + "shrub", 1875 + "shrug", 1876 + "shuck", 1877 + "shunt", 1878 + "shush", 1879 + "shyly", 1880 + "siege", 1881 + "sieve", 1882 + "sight", 1883 + "sigma", 1884 + "silky", 1885 + "silly", 1886 + "since", 1887 + "sinew", 1888 + "singe", 1889 + "siren", 1890 + "sissy", 1891 + "sixth", 1892 + "sixty", 1893 + "skate", 1894 + "skier", 1895 + "skiff", 1896 + "skill", 1897 + "skimp", 1898 + "skirt", 1899 + "skulk", 1900 + "skull", 1901 + "skunk", 1902 + "slack", 1903 + "slain", 1904 + "slang", 1905 + "slant", 1906 + "slash", 1907 + "slate", 1908 + "sleek", 1909 + "sleep", 1910 + "sleet", 1911 + "slept", 1912 + "slice", 1913 + "slick", 1914 + "slide", 1915 + "slime", 1916 + "slimy", 1917 + "sling", 1918 + "slink", 1919 + "sloop", 1920 + "slope", 1921 + "slosh", 1922 + "sloth", 1923 + "slump", 1924 + "slung", 1925 + "slunk", 1926 + "slurp", 1927 + "slush", 1928 + "slyly", 1929 + "smack", 1930 + "small", 1931 + "smart", 1932 + "smash", 1933 + "smear", 1934 + "smell", 1935 + "smelt", 1936 + "smile", 1937 + "smirk", 1938 + "smite", 1939 + "smith", 1940 + "smock", 1941 + "smoke", 1942 + "smoky", 1943 + "smote", 1944 + "snack", 1945 + "snail", 1946 + "snake", 1947 + "snaky", 1948 + "snare", 1949 + "snarl", 1950 + "sneak", 1951 + "sneer", 1952 + "snide", 1953 + "sniff", 1954 + "snipe", 1955 + "snoop", 1956 + "snore", 1957 + "snort", 1958 + "snout", 1959 + "snowy", 1960 + "snuck", 1961 + "snuff", 1962 + "soapy", 1963 + "sober", 1964 + "soggy", 1965 + "solar", 1966 + "solid", 1967 + "solve", 1968 + "sonar", 1969 + "sonic", 1970 + "sooth", 1971 + "sooty", 1972 + "sorry", 1973 + "sound", 1974 + "south", 1975 + "sower", 1976 + "space", 1977 + "spade", 1978 + "spank", 1979 + "spare", 1980 + "spark", 1981 + "spasm", 1982 + "spawn", 1983 + "speak", 1984 + "spear", 1985 + "speck", 1986 + "speed", 1987 + "spell", 1988 + "spelt", 1989 + "spend", 1990 + "spent", 1991 + "sperm", 1992 + "spice", 1993 + "spicy", 1994 + "spied", 1995 + "spiel", 1996 + "spike", 1997 + "spiky", 1998 + "spill", 1999 + "spilt", 2000 + "spine", 2001 + "spiny", 2002 + "spire", 2003 + "spite", 2004 + "splat", 2005 + "split", 2006 + "spoil", 2007 + "spoke", 2008 + "spoof", 2009 + "spook", 2010 + "spool", 2011 + "spoon", 2012 + "spore", 2013 + "sport", 2014 + "spout", 2015 + "spray", 2016 + "spree", 2017 + "sprig", 2018 + "spunk", 2019 + "spurn", 2020 + "spurt", 2021 + "squad", 2022 + "squat", 2023 + "squib", 2024 + "stack", 2025 + "staff", 2026 + "stage", 2027 + "staid", 2028 + "stain", 2029 + "stair", 2030 + "stake", 2031 + "stale", 2032 + "stalk", 2033 + "stall", 2034 + "stamp", 2035 + "stand", 2036 + "stank", 2037 + "stare", 2038 + "stark", 2039 + "start", 2040 + "stash", 2041 + "state", 2042 + "stave", 2043 + "stead", 2044 + "steak", 2045 + "steal", 2046 + "steam", 2047 + "steed", 2048 + "steel", 2049 + "steep", 2050 + "steer", 2051 + "stein", 2052 + "stern", 2053 + "stick", 2054 + "stiff", 2055 + "still", 2056 + "stilt", 2057 + "sting", 2058 + "stink", 2059 + "stint", 2060 + "stock", 2061 + "stoic", 2062 + "stoke", 2063 + "stole", 2064 + "stomp", 2065 + "stone", 2066 + "stony", 2067 + "stood", 2068 + "stool", 2069 + "stoop", 2070 + "store", 2071 + "stork", 2072 + "storm", 2073 + "story", 2074 + "stout", 2075 + "stove", 2076 + "strap", 2077 + "straw", 2078 + "stray", 2079 + "strip", 2080 + "strut", 2081 + "stuck", 2082 + "study", 2083 + "stuff", 2084 + "stump", 2085 + "stung", 2086 + "stunk", 2087 + "stunt", 2088 + "style", 2089 + "suave", 2090 + "sugar", 2091 + "suing", 2092 + "suite", 2093 + "sulky", 2094 + "sully", 2095 + "sumac", 2096 + "sunny", 2097 + "super", 2098 + "surer", 2099 + "surge", 2100 + "surly", 2101 + "sushi", 2102 + "swami", 2103 + "swamp", 2104 + "swarm", 2105 + "swash", 2106 + "swath", 2107 + "swear", 2108 + "sweat", 2109 + "sweep", 2110 + "sweet", 2111 + "swell", 2112 + "swept", 2113 + "swift", 2114 + "swill", 2115 + "swine", 2116 + "swing", 2117 + "swirl", 2118 + "swish", 2119 + "swoon", 2120 + "swoop", 2121 + "sword", 2122 + "swore", 2123 + "sworn", 2124 + "swung", 2125 + "synod", 2126 + "syrup", 2127 + "tabby", 2128 + "table", 2129 + "taboo", 2130 + "tacit", 2131 + "tacky", 2132 + "taffy", 2133 + "taint", 2134 + "taken", 2135 + "taker", 2136 + "tally", 2137 + "talon", 2138 + "tamer", 2139 + "tango", 2140 + "tangy", 2141 + "taper", 2142 + "tapir", 2143 + "tardy", 2144 + "tarot", 2145 + "taste", 2146 + "tasty", 2147 + "tatty", 2148 + "taunt", 2149 + "tawny", 2150 + "teach", 2151 + "teary", 2152 + "tease", 2153 + "teddy", 2154 + "teeth", 2155 + "tempo", 2156 + "tenet", 2157 + "tenor", 2158 + "tense", 2159 + "tenth", 2160 + "tepee", 2161 + "tepid", 2162 + "terra", 2163 + "terse", 2164 + "testy", 2165 + "thank", 2166 + "theft", 2167 + "their", 2168 + "theme", 2169 + "there", 2170 + "these", 2171 + "theta", 2172 + "thick", 2173 + "thief", 2174 + "thigh", 2175 + "thing", 2176 + "think", 2177 + "third", 2178 + "thong", 2179 + "thorn", 2180 + "those", 2181 + "three", 2182 + "threw", 2183 + "throb", 2184 + "throw", 2185 + "thrum", 2186 + "thumb", 2187 + "thump", 2188 + "thyme", 2189 + "tiara", 2190 + "tibia", 2191 + "tidal", 2192 + "tiger", 2193 + "tight", 2194 + "tilde", 2195 + "timer", 2196 + "timid", 2197 + "tipsy", 2198 + "titan", 2199 + "tithe", 2200 + "title", 2201 + "toast", 2202 + "today", 2203 + "toddy", 2204 + "token", 2205 + "tonal", 2206 + "tonga", 2207 + "tonic", 2208 + "tooth", 2209 + "topaz", 2210 + "topic", 2211 + "torch", 2212 + "torso", 2213 + "torus", 2214 + "total", 2215 + "totem", 2216 + "touch", 2217 + "tough", 2218 + "towel", 2219 + "tower", 2220 + "toxic", 2221 + "toxin", 2222 + "trace", 2223 + "track", 2224 + "tract", 2225 + "trade", 2226 + "trail", 2227 + "train", 2228 + "trait", 2229 + "tramp", 2230 + "trash", 2231 + "trawl", 2232 + "tread", 2233 + "treat", 2234 + "trend", 2235 + "triad", 2236 + "trial", 2237 + "tribe", 2238 + "trice", 2239 + "trick", 2240 + "tried", 2241 + "tripe", 2242 + "trite", 2243 + "troll", 2244 + "troop", 2245 + "trope", 2246 + "trout", 2247 + "trove", 2248 + "truce", 2249 + "truck", 2250 + "truer", 2251 + "truly", 2252 + "trump", 2253 + "trunk", 2254 + "truss", 2255 + "trust", 2256 + "truth", 2257 + "tryst", 2258 + "tubal", 2259 + "tuber", 2260 + "tulip", 2261 + "tulle", 2262 + "tumor", 2263 + "tunic", 2264 + "turbo", 2265 + "tutor", 2266 + "twang", 2267 + "tweak", 2268 + "tweed", 2269 + "tweet", 2270 + "twice", 2271 + "twine", 2272 + "twirl", 2273 + "twist", 2274 + "twixt", 2275 + "tying", 2276 + "udder", 2277 + "ulcer", 2278 + "ultra", 2279 + "umbra", 2280 + "uncle", 2281 + "uncut", 2282 + "under", 2283 + "undid", 2284 + "undue", 2285 + "unfed", 2286 + "unfit", 2287 + "unify", 2288 + "union", 2289 + "unite", 2290 + "unity", 2291 + "unlit", 2292 + "unmet", 2293 + "unset", 2294 + "untie", 2295 + "until", 2296 + "unwed", 2297 + "unzip", 2298 + "upper", 2299 + "upset", 2300 + "urban", 2301 + "urine", 2302 + "usage", 2303 + "usher", 2304 + "using", 2305 + "usual", 2306 + "usurp", 2307 + "utile", 2308 + "utter", 2309 + "vague", 2310 + "valet", 2311 + "valid", 2312 + "valor", 2313 + "value", 2314 + "valve", 2315 + "vapid", 2316 + "vapor", 2317 + "vault", 2318 + "vaunt", 2319 + "vegan", 2320 + "venom", 2321 + "venue", 2322 + "verge", 2323 + "verse", 2324 + "verso", 2325 + "verve", 2326 + "vicar", 2327 + "video", 2328 + "vigil", 2329 + "vigor", 2330 + "villa", 2331 + "vinyl", 2332 + "viola", 2333 + "viper", 2334 + "viral", 2335 + "virus", 2336 + "visit", 2337 + "visor", 2338 + "vista", 2339 + "vital", 2340 + "vivid", 2341 + "vixen", 2342 + "vocal", 2343 + "vodka", 2344 + "vogue", 2345 + "voice", 2346 + "voila", 2347 + "vomit", 2348 + "voter", 2349 + "vouch", 2350 + "vowel", 2351 + "vying", 2352 + "wacky", 2353 + "wafer", 2354 + "wager", 2355 + "wagon", 2356 + "waist", 2357 + "waive", 2358 + "waltz", 2359 + "warty", 2360 + "waste", 2361 + "watch", 2362 + "water", 2363 + "waver", 2364 + "waxen", 2365 + "weary", 2366 + "weave", 2367 + "wedge", 2368 + "weedy", 2369 + "weigh", 2370 + "weird", 2371 + "welch", 2372 + "welsh", 2373 + "whack", 2374 + "whale", 2375 + "wharf", 2376 + "wheat", 2377 + "wheel", 2378 + "whelp", 2379 + "where", 2380 + "which", 2381 + "whiff", 2382 + "while", 2383 + "whine", 2384 + "whiny", 2385 + "whirl", 2386 + "whisk", 2387 + "white", 2388 + "whole", 2389 + "whoop", 2390 + "whose", 2391 + "widen", 2392 + "wider", 2393 + "widow", 2394 + "width", 2395 + "wield", 2396 + "wight", 2397 + "willy", 2398 + "wimpy", 2399 + "wince", 2400 + "winch", 2401 + "windy", 2402 + "wiser", 2403 + "wispy", 2404 + "witch", 2405 + "witty", 2406 + "woken", 2407 + "woman", 2408 + "women", 2409 + "woody", 2410 + "wooer", 2411 + "wooly", 2412 + "woozy", 2413 + "wordy", 2414 + "world", 2415 + "worry", 2416 + "worse", 2417 + "worst", 2418 + "worth", 2419 + "would", 2420 + "wound", 2421 + "woven", 2422 + "wrack", 2423 + "wrath", 2424 + "wreak", 2425 + "wreck", 2426 + "wrest", 2427 + "wring", 2428 + "wrist", 2429 + "write", 2430 + "wrong", 2431 + "wrote", 2432 + "wrung", 2433 + "wryly", 2434 + "yacht", 2435 + "yearn", 2436 + "yeast", 2437 + "yield", 2438 + "young", 2439 + "youth", 2440 + "zebra", 2441 + "zesty", 2442 + "zonal", 2443 + ] 2444 + return words 2445 + 2446 + 2447 + def main(): 2448 + runApp() 2449 + 2450 + 2451 + main()