Implemented a Pascal triangle generator (#7317)

* Added a Pascal triangle implementation to the other folder

* Added Pascal triangle implementation to the other folder.

* Added Pascal triangle implementation to the other folder.

* Added Pascal triangle implementation to the other folder.

* Implemented a Pascal triangle generator.

* Reversed Changes to DIRECTORY.md

* Reversed changed to .md files

* Update other/pascal_triangle.py

Removed personal info

Co-authored-by: Paul <56065602+ZeroDayOwl@users.noreply.github.com>

* Update pascal_triangle.py

Expanded the description of the algorithm

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Printed output in triangular form

* Update CONTRIBUTING.md

Co-authored-by: Paul <56065602+ZeroDayOwl@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Wissam Fawaz 2022-10-30 15:14:22 +02:00 committed by GitHub
parent cf915e7042
commit d1430aa36b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

96
other/pascal_triangle.py Normal file
View File

@ -0,0 +1,96 @@
"""
This implementation demonstrates how to generate the
elements of a Pascal's triangle. The element having
a row index of r and column index of c can be derived
as follows:
triangle[r][c] = triangle[r-1][c-1]+triangle[r-1][c]
What is Pascal's triangle?
- It is a triangular array containing binomial coefficients.
Refer to (https://en.wikipedia.org/wiki/Pascal%27s_triangle)
for more info about this triangle.
"""
def print_pascal_triangle(num_rows: int) -> None:
"""
Print Pascal's triangle for different number of rows
>>> print_pascal_triangle(5)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
"""
triangle = generate_pascal_triangle(num_rows)
for row_idx in range(num_rows):
# Print left spaces
for _ in range(num_rows - row_idx - 1):
print(end=" ")
# Print row values
for col_idx in range(row_idx + 1):
if col_idx != row_idx:
print(triangle[row_idx][col_idx], end=" ")
else:
print(triangle[row_idx][col_idx], end="")
print()
def generate_pascal_triangle(num_rows: int) -> list[list[int]]:
"""
Create Pascal's triangle for different number of rows
>>> generate_pascal_triangle(1)
[[1]]
>>> generate_pascal_triangle(2)
[[1], [1, 1]]
>>> generate_pascal_triangle(3)
[[1], [1, 1], [1, 2, 1]]
>>> generate_pascal_triangle(4)
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1]]
>>> generate_pascal_triangle(5)
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
"""
triangle: list[list[int]] = []
for current_row_idx in range(num_rows):
current_row = populate_current_row(triangle, current_row_idx)
triangle.append(current_row)
return triangle
def populate_current_row(triangle: list[list[int]], current_row_idx: int) -> list[int]:
"""
>>> triangle = [[1]]
>>> populate_current_row(triangle, 1)
[1, 1]
"""
current_row = [-1] * (current_row_idx + 1)
# first and last elements of current row are equal to 1
current_row[0], current_row[-1] = 1, 1
for current_col_idx in range(1, current_row_idx):
calculate_current_element(
triangle, current_row, current_row_idx, current_col_idx
)
return current_row
def calculate_current_element(
triangle: list[list[int]],
current_row: list[int],
current_row_idx: int,
current_col_idx: int,
) -> None:
"""
>>> triangle = [[1], [1, 1]]
>>> current_row = [1, -1, 1]
>>> calculate_current_element(triangle, current_row, 2, 1)
>>> current_row
[1, 2, 1]
"""
above_to_left_elt = triangle[current_row_idx - 1][current_col_idx - 1]
above_to_right_elt = triangle[current_row_idx - 1][current_col_idx]
current_row[current_col_idx] = above_to_left_elt + above_to_right_elt
if __name__ == "__main__":
import doctest
doctest.testmod()