From 53c2a24587aaf864ec40d2445d071a8274926c37 Mon Sep 17 00:00:00 2001 From: Abdujabbar Mirkhalikov Date: Fri, 25 Sep 2020 18:16:05 +0500 Subject: [PATCH] added type hints and doctests for minimax algorithm (#2478) * added type hints and doctests for minimax algorithm * Update backtracking/minimax.py Co-authored-by: Christian Clauss * last fix Co-authored-by: Christian Clauss --- backtracking/minimax.py | 59 +++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/backtracking/minimax.py b/backtracking/minimax.py index 4cec0e403..056447256 100644 --- a/backtracking/minimax.py +++ b/backtracking/minimax.py @@ -1,3 +1,4 @@ +from __future__ import annotations import math """ Minimax helps to achieve maximum score in a game by checking all possible moves @@ -9,26 +10,62 @@ import math """ -def minimax(Depth, nodeIndex, isMax, scores, height): +def minimax(depth: int, node_index: int, is_max: bool, + scores: list[int], height: float) -> int: + """ + >>> import math + >>> scores = [90, 23, 6, 33, 21, 65, 123, 34423] + >>> height = math.log(len(scores), 2) + >>> minimax(0, 0, True, scores, height) + 65 + >>> minimax(-1, 0, True, scores, height) + Traceback (most recent call last): + ... + ValueError: Depth cannot be less than 0 + >>> minimax(0, 0, True, [], 2) + Traceback (most recent call last): + ... + ValueError: Scores cannot be empty + >>> scores = [3, 5, 2, 9, 12, 5, 23, 23] + >>> height = math.log(len(scores), 2) + >>> minimax(0, 0, True, scores, height) + 12 + >>> minimax('1', 2, True, [], 2 ) + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ - if Depth == height: - return scores[nodeIndex] + if depth < 0: + raise ValueError("Depth cannot be less than 0") - if isMax: + if len(scores) == 0: + raise ValueError("Scores cannot be empty") + + if depth == height: + return scores[node_index] + + if is_max: return max( - minimax(Depth + 1, nodeIndex * 2, False, scores, height), - minimax(Depth + 1, nodeIndex * 2 + 1, False, scores, height), + minimax(depth + 1, node_index * 2, False, scores, height), + minimax(depth + 1, node_index * 2 + 1, False, scores, height), ) + return min( - minimax(Depth + 1, nodeIndex * 2, True, scores, height), - minimax(Depth + 1, nodeIndex * 2 + 1, True, scores, height), + minimax(depth + 1, node_index * 2, True, scores, height), + minimax(depth + 1, node_index * 2 + 1, True, scores, height), ) -if __name__ == "__main__": - +def main(): scores = [90, 23, 6, 33, 21, 65, 123, 34423] height = math.log(len(scores), 2) - print("Optimal value : ", end="") print(minimax(0, 0, True, scores, height)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main()