All Solutions
Q9 Possible 1:..............................................................................................1
Q9 Possible 2:..............................................................................................2
Q10 Possible 1.............................................................................................2
Q10 Possible 2:............................................................................................4
Q11 Possible 1:............................................................................................4
Q11 Possible 2:............................................................................................5
Q12 Possible 1:............................................................................................7
Q12 Possible 2:............................................................................................9
Q9 Possible 1:
Code:
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
MaxNumber):
Score = 0
GameOver = False
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)
# Keep prompting the user until a valid expression is entered
UserInput = ""
while [Link]() == "":
UserInput = input("Enter an expression: ").strip()
if UserInput == "":
print("Try again. Please enter an expression")
print()
if CheckIfUserInputValid(UserInput):
UserInputInRPN = ConvertToRPN(UserInput)
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets,
UserInputInRPN, Score)
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput,
MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
else:
print("Invalid expression. Please try again.")
print("Game over!")
DisplayScore(Score)
Q9 Possible 2:
def Main():
NumbersAllowed = []
Targets = []
MaxNumberOfTargets = 20
MaxTarget = 0
MaxNumber = 0
TrainingGame = False
# Prompt the user for a valid choice
Choice = ""
while Choice not in ["T", "R"]:
Choice = input("Enter T for the training game or R for the random
game: ").upper()
if Choice not in ["T", "R"]:
print("Try again. Please enter T or R")
print()
# Set up the game based on the user's choice
if Choice == "T":
MaxNumber = 1000
MaxTarget = 1000
TrainingGame = True
Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82, 121, 34, 45, 68, 75, 34,
23, 119, 43, 23, 119]
else: # Choice == "R"
MaxNumber = 10
MaxTarget = 50
Targets = CreateTargets(MaxNumberOfTargets, MaxTarget)
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame,
MaxNumber)
PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
MaxNumber)
input()
Q10 Possible 1:
def ConvertToRPN(UserInput):
Position = 0
multiplication/division
Precedence = {"+": 2, "-": 2, "*": 4, "/": 4, "^": 5}
Operators = []
Operand, Position = GetNumberFromUserInput(UserInput, Position)
UserInputInRPN = []
[Link](str(Operand))
[Link](UserInput[Position - 1])
while Position < len(UserInput):
Operand, Position = GetNumberFromUserInput(UserInput, Position)
[Link](str(Operand))
if Position < len(UserInput):
CurrentOperator = UserInput[Position - 1]
while len(Operators) > 0 and Precedence[Operators[-1]] >
Precedence[CurrentOperator]:
[Link](Operators[-1])
[Link]()
if len(Operators) > 0 and Precedence[Operators[-1]] ==
Precedence[CurrentOperator]:
[Link](Operators[-1])
[Link]()
[Link](CurrentOperator)
while len(Operators) > 0:
[Link](Operators[-1])
[Link]()
return UserInputInRPN
def EvaluateRPN(UserInputInRPN):
S = []
while len(UserInputInRPN) > 0:
while UserInputInRPN[0] not in ["+", "-", "*", "/", "^"]:
[Link](UserInputInRPN[0])
[Link](0)
Num2 = float(S[-1])
[Link]()
Num1 = float(S[-1])
[Link]()
Result = 0.0
if UserInputInRPN[0] == "+":
Result = Num1 + Num2
elif UserInputInRPN[0] == "-":
Result = Num1 - Num2
elif UserInputInRPN[0] == "*":
Result = Num1 * Num2
elif UserInputInRPN[0] == "/":
Result = Num1 / Num2
elif UserInputInRPN[0] == "^":
Result = Num1 ** Num2
[Link](0)
[Link](str(Result))
if float(S[0]) - [Link](float(S[0])) == 0.0:
return [Link](float(S[0]))
else:
return -1
Q10 Possible 2:
def CheckIfUserInputValid(UserInput):
# Remove all whitespace from the input
UserInput = [Link](" ", "")
if [Link]("^([0-9]+[\\+\\-\\*\\/])+[0-9]+$", UserInput) is not None:
return True
else:
return False
(I think jay would want us to use a for loop, but this works fine and is a
oneliner)
Q11 Possible 1:
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
MaxNumber):
Score = 0
GameOver = False
ResetUsed = False
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)
if not ResetUsed:
UserInput = input("Enter an expression or enter R to reset:
").strip().upper()
else:
UserInput = input("Enter an expression: ").strip()
print()
# Handle reset logic
if not ResetUsed and UserInput == "R":
# Generate a new set of random numbers
NumbersAllowed = FillNumbers([], TrainingGame, MaxNumber)
Score -= 5 # Deduct 5 points for resetting
ResetUsed = True # set it to be used
print("Numbers have been reset. Your score has been reduced by
5 points.")
continue # skip to next part
# Validate user input and process game logic
if CheckIfUserInputValid(UserInput):
UserInputInRPN = ConvertToRPN(UserInput)
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets,
UserInputInRPN, Score)
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput,
MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
else:
print("Invalid expression. Please try again.")
print("Game over!")
DisplayScore(Score)
Q11 Possible 2:
def CheckIfAllNumbersUsed(NumbersAllowed, UserInputInRPN):
# Create a copy of NumbersAllowed to track usage
TempNumbers = NumbersAllowed[:]
# Check each item in the RPN expression
for Item in UserInputInRPN:
if [Link]() and int(Item) in TempNumbers:
[Link](int(Item))
# If TempNumbers is empty, all numbers were used
return len(TempNumbers) == 0
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
MaxNumber):
Score = 0
GameOver = False
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)
UserInput = input("Enter an expression: ").strip()
print()
if CheckIfUserInputValid(UserInput):
UserInputInRPN = ConvertToRPN(UserInput)
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets,
UserInputInRPN, Score)
# Check if all numbers were used and award bonus points
if CheckIfAllNumbersUsed(NumbersAllowed, UserInputInRPN):
print("Bonus! You used all available numbers!")
Score += 10
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput,
MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
else:
print("Invalid use of numbers. Please try again.")
else:
print("Invalid expression. Please try again.")
print("Game over!")
DisplayScore(Score)
#
Q12 Possible 1:
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
MaxNumber):
Score = 0
GameOver = False
ClearTargetUsed = False # Track if "Clear Target" has been used
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)
# Update prompt based on whether "Clear Target" is available
if not ClearTargetUsed:
UserInput = input("Enter an expression or enter C to clear two
specified targets: ").strip().upper()
else:
UserInput = input("Enter an expression: ").strip()
print()
# Handle Clear Target logic
if not ClearTargetUsed and UserInput == "C":
print("You have chosen to clear two targets.")
# Allow user to specify two valid targets
for i in range(2):
while True:
try:
TargetToRemove = int(input(f"Enter target {i + 1} to
remove: "))
if TargetToRemove in Targets:
Targets[[Link](TargetToRemove)] = -1 #
Remove target by setting it to -1
break
else:
print("Invalid target. Please choose a target from the
list.")
except ValueError:
print("Invalid input. Please enter a valid number.")
# Deduct points and mark "Clear Target" as used
Score -= 5
ClearTargetUsed = True
print("Two targets have been cleared. Your score has been
reduced by 5 points.")
continue # Skip to next turn after clearing targets
# Validate user input and process game logic
if CheckIfUserInputValid(UserInput):
UserInputInRPN = ConvertToRPN(UserInput)
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets,
UserInputInRPN, Score)
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput,
MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
else:
print("Invalid use of numbers. Please try again.")
else:
print("Invalid expression. Please try again.")
print("Game over!")
DisplayScore(Score)
Q12 Possible 2:
def ConvertBracketedExpressionToRPN(UserInput):
# Check for a single pair of brackets
OpenBracketIndex = [Link]("(")
CloseBracketIndex = [Link](")")
if OpenBracketIndex == -1 or CloseBracketIndex == -1 or
OpenBracketIndex > CloseBracketIndex:
raise ValueError("Invalid bracket placement in expression.")
# Extract parts of the expression
BeforeBrackets = UserInput[:OpenBracketIndex]
InsideBrackets = UserInput[OpenBracketIndex + 1:CloseBracketIndex]
AfterBrackets = UserInput[CloseBracketIndex + 1:]
# Convert each part to RPN
RPNBefore = ConvertToRPN(BeforeBrackets) if BeforeBrackets else []
RPNInside = ConvertToRPN(InsideBrackets)
RPNAfter = ConvertToRPN(AfterBrackets) if AfterBrackets else []
# Combine all parts into a single RPN expression
return RPNBefore + RPNInside + RPNAfter
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
MaxNumber):
Score = 0
GameOver = False
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)
UserInput = input("Enter an expression: ").strip()
print()
try:
# Check for brackets in the input
if "(" in UserInput or ")" in UserInput:
# Ensure no nested brackets
if [Link]("(") > 1 or [Link](")") > 1:
print("Nested brackets are not allowed. Please try again.")
continue
# Convert bracketed expression to RPN
UserInputInRPN =
ConvertBracketedExpressionToRPN(UserInput)
else:
# Process non-bracketed expressions as usual
if not CheckIfUserInputValid(UserInput):
print("Invalid expression. Please try again.")
continue
UserInputInRPN = ConvertToRPN(UserInput)
# Validate numbers used in the expression
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets,
UserInputInRPN, Score)
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput,
MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
else:
print("Invalid use of numbers. Please try again.")
except ValueError as e:
print(str(e))
except Exception as e:
print("An error occurred:", str(e))
print("Game over!")
DisplayScore(Score)