summaryrefslogtreecommitdiff
path: root/comp
diff options
context:
space:
mode:
authorthing 1 <thing1@seacrossedlovers.xyz>2024-12-09 13:17:28 +0000
committerthing 1 <thing1@seacrossedlovers.xyz>2024-12-09 13:17:28 +0000
commit743a1bde2f21db7c3efefe30779fcef5d3539c43 (patch)
tree945ec7e8090d05069751165ae463973d89707982 /comp
parentc05d7ddb124a259fd08e0073a58ab6439011eceb (diff)
introduced the skeleton code
Diffstat (limited to 'comp')
-rw-r--r--comp/skeleton/code.py227
1 files changed, 227 insertions, 0 deletions
diff --git a/comp/skeleton/code.py b/comp/skeleton/code.py
new file mode 100644
index 0000000..495913f
--- /dev/null
+++ b/comp/skeleton/code.py
@@ -0,0 +1,227 @@
+#Skeleton Program code for the AQA A Level Paper 1 Summer 2025 examination
+#this code should be used in conjunction with the Preliminary Material
+#written by the AQA Programmer Team
+#developed in the Python 3.9 programming environment
+
+import re
+import random
+import math
+
+def Main():
+ NumbersAllowed = []
+ Targets = []
+ MaxNumberOfTargets = 20
+ MaxTarget = 0
+ MaxNumber = 0
+ TrainingGame = False
+ Choice = input("Enter y to play the training game, anything else to play a random game: ").lower()
+ print()
+ if Choice == "y":
+ 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:
+ MaxNumber = 10
+ MaxTarget = 50
+ Targets = CreateTargets(MaxNumberOfTargets, MaxTarget)
+ NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)
+ PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber)
+ input()
+
+def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber):
+ Score = 0
+ GameOver = False
+ while not GameOver:
+ DisplayState(Targets, NumbersAllowed, Score)
+ UserInput = input("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)
+ print("Game over!")
+ DisplayScore(Score)
+
+def CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score):
+ UserInputEvaluation = EvaluateRPN(UserInputInRPN)
+ UserInputEvaluationIsATarget = False
+ if UserInputEvaluation != -1:
+ for Count in range(0, len(Targets)):
+ if Targets[Count] == UserInputEvaluation:
+ Score += 2
+ Targets[Count] = -1
+ UserInputEvaluationIsATarget = True
+ return UserInputEvaluationIsATarget, Score
+
+def RemoveNumbersUsed(UserInput, MaxNumber, NumbersAllowed):
+ UserInputInRPN = ConvertToRPN(UserInput)
+ for Item in UserInputInRPN:
+ if CheckValidNumber(Item, MaxNumber):
+ if int(Item) in NumbersAllowed:
+ NumbersAllowed.remove(int(Item))
+ return NumbersAllowed
+
+def UpdateTargets(Targets, TrainingGame, MaxTarget):
+ for Count in range (0, len(Targets) - 1):
+ Targets[Count] = Targets[Count + 1]
+ Targets.pop()
+ if TrainingGame:
+ Targets.append(Targets[-1])
+ else:
+ Targets.append(GetTarget(MaxTarget))
+ return Targets
+
+def CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed, UserInputInRPN, MaxNumber):
+ Temp = []
+ for Item in NumbersAllowed:
+ Temp.append(Item)
+ for Item in UserInputInRPN:
+ if CheckValidNumber(Item, MaxNumber):
+ if int(Item) in Temp:
+ Temp.remove(int(Item))
+ else:
+ return False
+ return True
+
+def CheckValidNumber(Item, MaxNumber):
+ if re.search("^[0-9]+$", Item) is not None:
+ ItemAsInteger = int(Item)
+ if ItemAsInteger > 0 and ItemAsInteger <= MaxNumber:
+ return True
+ return False
+
+def DisplayState(Targets, NumbersAllowed, Score):
+ DisplayTargets(Targets)
+ DisplayNumbersAllowed(NumbersAllowed)
+ DisplayScore(Score)
+
+def DisplayScore(Score):
+ print("Current score: " + str(Score))
+ print()
+ print()
+
+def DisplayNumbersAllowed(NumbersAllowed):
+ print("Numbers available: ", end = '')
+ for N in NumbersAllowed:
+ print(str(N) + " ", end = '')
+ print()
+ print()
+
+def DisplayTargets(Targets):
+ print("|", end = '')
+ for T in Targets:
+ if T == -1:
+ print(" ", end = '')
+ else:
+ print(T, end = '')
+ print("|", end = '')
+ print()
+ print()
+
+def ConvertToRPN(UserInput):
+ Position = 0
+ Precedence = {"+": 2, "-": 2, "*": 4, "/": 4}
+ Operators = []
+ Operand, Position = GetNumberFromUserInput(UserInput, Position)
+ UserInputInRPN = []
+ UserInputInRPN.append(str(Operand))
+ Operators.append(UserInput[Position - 1])
+ while Position < len(UserInput):
+ Operand, Position = GetNumberFromUserInput(UserInput, Position)
+ UserInputInRPN.append(str(Operand))
+ if Position < len(UserInput):
+ CurrentOperator = UserInput[Position - 1]
+ while len(Operators) > 0 and Precedence[Operators[-1]] > Precedence[CurrentOperator]:
+ UserInputInRPN.append(Operators[-1])
+ Operators.pop()
+ if len(Operators) > 0 and Precedence[Operators[-1]] == Precedence[CurrentOperator]:
+ UserInputInRPN.append(Operators[-1])
+ Operators.pop()
+ Operators.append(CurrentOperator)
+ else:
+ while len(Operators) > 0:
+ UserInputInRPN.append(Operators[-1])
+ Operators.pop()
+ return UserInputInRPN
+
+def EvaluateRPN(UserInputInRPN):
+ S = []
+ while len(UserInputInRPN) > 0:
+ while UserInputInRPN[0] not in ["+", "-", "*", "/"]:
+ S.append(UserInputInRPN[0])
+ UserInputInRPN.pop(0)
+ Num2 = float(S[-1])
+ S.pop()
+ Num1 = float(S[-1])
+ S.pop()
+ 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
+ UserInputInRPN.pop(0)
+ S.append(str(Result))
+ if float(S[0]) - math.floor(float(S[0])) == 0.0:
+ return math.floor(float(S[0]))
+ else:
+ return -1
+
+def GetNumberFromUserInput(UserInput, Position):
+ Number = ""
+ MoreDigits = True
+ while MoreDigits:
+ if not(re.search("[0-9]", str(UserInput[Position])) is None):
+ Number += UserInput[Position]
+ else:
+ MoreDigits = False
+ Position += 1
+ if Position == len(UserInput):
+ MoreDigits = False
+ if Number == "":
+ return -1, Position
+ else:
+ return int(Number), Position
+
+def CheckIfUserInputValid(UserInput):
+ if re.search("^([0-9]+[\\+\\-\\*\\/])+[0-9]+$", UserInput) is not None:
+ return True
+ else:
+ return False
+
+def GetTarget(MaxTarget):
+ return random.randint(1, MaxTarget)
+
+def GetNumber(MaxNumber):
+ return random.randint(1, MaxNumber)
+
+def CreateTargets(SizeOfTargets, MaxTarget):
+ Targets = []
+ for Count in range(1, 6):
+ Targets.append(-1)
+ for Count in range(1, SizeOfTargets - 4):
+ Targets.append(GetTarget(MaxTarget))
+ return Targets
+
+def FillNumbers(NumbersAllowed, TrainingGame, MaxNumber):
+ if TrainingGame:
+ return [2, 3, 2, 8, 512]
+ else:
+ while len(NumbersAllowed) < 5:
+ NumbersAllowed.append(GetNumber(MaxNumber))
+ return NumbersAllowed
+
+if __name__ == "__main__":
+ Main()