diff --git a/DIRECTORY.md b/DIRECTORY.md index aad6c72aa8ee..941e30dfe721 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -377,6 +377,7 @@ * [Longest Common Subsequence](dynamic_programming/longest_common_subsequence.py) * [Longest Common Substring](dynamic_programming/longest_common_substring.py) * [Longest Increasing Subsequence](dynamic_programming/longest_increasing_subsequence.py) + * [Longest Increasing Subsequence Iterative](dynamic_programming/longest_increasing_subsequence_iterative.py) * [Longest Increasing Subsequence O Nlogn](dynamic_programming/longest_increasing_subsequence_o_nlogn.py) * [Longest Palindromic Subsequence](dynamic_programming/longest_palindromic_subsequence.py) * [Matrix Chain Multiplication](dynamic_programming/matrix_chain_multiplication.py) @@ -462,6 +463,7 @@ ## Graphics * [Bezier Curve](graphics/bezier_curve.py) + * [Butterfly Pattern](graphics/butterfly_pattern.py) * [Digital Differential Analyzer Line](graphics/digital_differential_analyzer_line.py) * [Vector3 For 2D Rendering](graphics/vector3_for_2d_rendering.py) diff --git a/cellular_automata/game_of_life.py b/cellular_automata/game_of_life.py index 76276b272d65..fb04d8940f88 100644 --- a/cellular_automata/game_of_life.py +++ b/cellular_automata/game_of_life.py @@ -28,6 +28,7 @@ comes a live cell, as if by reproduction. """ +import doctest import random import sys @@ -42,6 +43,28 @@ def create_canvas(size: int) -> list[list[bool]]: + """ + For creating a nested list of boolean values, + based on the size parameter provided + + Args: + size: integer + + Returns: + A nested list of boolean values + + Examples: + >>> create_canvas(1) + [[False]] + >>> create_canvas(2) + [[False, False], [False, False]] + >>> create_canvas(3) + [[False, False, False], [False, False, False], [False, False, False]] + >>> create_canvas(0) + [] + >>> create_canvas(-1) + [] + """ canvas = [[False for i in range(size)] for j in range(size)] return canvas @@ -56,13 +79,37 @@ def run(canvas: list[list[bool]]) -> list[list[bool]]: """ This function runs the rules of game through all points, and changes their status accordingly.(in the same canvas) - @Args: - -- - canvas : canvas of population to run the rules on. - @returns: - -- - canvas of population after one step + Args: + canvas : canvas of population to run the rules on. + + Returns: + canvas of population after one step + + Example #1: + >>> canvas=[[False, False, False], [False, False, False], [False, False, False]] + >>> run(canvas) + [[False, False, False], [False, False, False], [False, False, False]] + + Example #2: + >>> canvas=[[True, False, False], [True, False, False], [False, False, False]] + >>> run(canvas) + [[False, False, False], [False, False, False], [False, False, False]] + + Example #3: + >>> canvas=[[True, True, True], [True, False, False], [False, False, False]] + >>> run(canvas) + [[False, False, False], [False, False, False], [False, False, False]] + + Example #4: + >>> canvas=[[True, False, False], [False, False, True], [False, True, False]] + >>> run(canvas) + [[False, False, False], [False, True, False], [False, False, False]] + + Example #5: + >>> canvas=[[True, True, True], [True, True, True], [True, True, True]] + >>> run(canvas) + [[False, False, False], [False, False, False], [False, False, True]] """ current_canvas = np.array(canvas) next_gen_canvas = np.array(create_canvas(current_canvas.shape[0])) @@ -76,6 +123,66 @@ def run(canvas: list[list[bool]]) -> list[list[bool]]: def __judge_point(pt: bool, neighbours: list[list[bool]]) -> bool: + """ + Update canvas provided + + Args: + pt: boolean + neighbours: canvas + + Returns: + Updated canvas + + Example #1: + Tests pt = True, and alive < 2; expected 'alive' count = 0 + >>> pt=True + >>> canvas=[[False, False, False], [False, False, False], [False, False, False]] + >>> __judge_point(pt, canvas) + False + + Example #2: + Tests pt = True, and alive < 2; expected 'alive' count = 1 + >>> pt=True + >>> canvas=[[True, False, False], [True, False, False], [False, False, False]] + >>> __judge_point(pt, canvas) + False + + Example #3: + Tests pt = True, and alive 'in' 2 + >>> pt=True + >>> canvas=[[True, True, True], [False, False, False], [False, False, False]] + >>> __judge_point(pt, canvas) + True + + Example #4: + Tests pt = True, and alive 'in' 3 + >>> pt=True + >>> canvas=[[True, True, True], [True, False, False], [False, False, False]] + >>> __judge_point(pt, canvas) + True + + Example #5: + Tests pt = True, and alive > 3; expected 'alive' count = 4 + >>> pt=True + >>> canvas=[[True, True, True], [True, False, False], [False, False, True]] + >>> __judge_point(pt, canvas) + False + + Example #6: + Tests pt = False, and alive == 3 + >>> pt=False + >>> canvas=[[True, False, False], [False, False, True], [False, True, False]] + >>> __judge_point(pt, canvas) + True + + Example #7: + Tests pt = False, and alive != 3; expected 'alive' count = 0 + >>> pt=False + >>> canvas=[[False, False, False], [False, False, False], [False, False, False]] + >>> __judge_point(pt, canvas) + False + """ + dead = 0 alive = 0 # finding dead or alive neighbours count. @@ -111,6 +218,7 @@ def __judge_point(pt: bool, neighbours: list[list[bool]]) -> bool: if len(sys.argv) != 2: raise Exception(usage_doc) + doctest.testmod() canvas_size = int(sys.argv[1]) # main working structure of this module. c = create_canvas(canvas_size)