+21
-9
python/oct3/level0/date.py
+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
+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
+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
+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
+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()