
def 				SCREAMING_SNAKE_CASE_   (      UpperCamelCase__		):
      UpperCamelCase__     : Union[str, Any]											=					generate_pascal_triangle(UpperCamelCase__		)
      for row_idx in range(UpperCamelCase__		):
            # 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 				SCREAMING_SNAKE_CASE_   (      UpperCamelCase__		):

      if not isinstance(UpperCamelCase__			,		UpperCamelCase__		):
            raise TypeError('''The input value of \'num_rows\' should be \'int\''''		)

      if num_rows == 0:
            return []
      elif num_rows < 0:
            raise ValueError(
                '''The input value of \'num_rows\' should be greater than or equal to 0'''		)

      UpperCamelCase__     : list[list[int]]											=					[]
      for current_row_idx in range(UpperCamelCase__		):
            UpperCamelCase__     : Optional[int]											=					populate_current_row(UpperCamelCase__			,		UpperCamelCase__		)
            triangle.append(UpperCamelCase__		)
      return triangle


def 				SCREAMING_SNAKE_CASE_   (      UpperCamelCase__			,		UpperCamelCase__		):
      UpperCamelCase__     : str											=					[-1] * (current_row_idx + 1)
      # first and last elements of current row are equal to 1
      UpperCamelCase__					,UpperCamelCase__     : Any											=					1, 1
      for current_col_idx in range(1			,		UpperCamelCase__		):
            calculate_current_element(
                UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__		)
      return current_row


def 				SCREAMING_SNAKE_CASE_   (      UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		):
      UpperCamelCase__     : int											=					triangle[current_row_idx - 1][current_col_idx - 1]
      UpperCamelCase__     : str											=					triangle[current_row_idx - 1][current_col_idx]
      UpperCamelCase__     : Tuple											=					above_to_left_elt + above_to_right_elt


def 				SCREAMING_SNAKE_CASE_   (      UpperCamelCase__		):

      if not isinstance(UpperCamelCase__			,		UpperCamelCase__		):
            raise TypeError('''The input value of \'num_rows\' should be \'int\''''		)

      if num_rows == 0:
            return []
      elif num_rows < 0:
            raise ValueError(
                '''The input value of \'num_rows\' should be greater than or equal to 0'''		)

      UpperCamelCase__     : list[list[int]]											=					[[1]]

      for row_index in range(1			,		UpperCamelCase__		):
            UpperCamelCase__     : Union[str, Any]											=					[0] + result[-1] + [0]
            UpperCamelCase__     : Any											=					row_index + 1
            # Calculate the number of distinct elements in a row
            UpperCamelCase__     : Dict											=					sum(divmod(UpperCamelCase__			,		2		)		)
            UpperCamelCase__     : Union[str, Any]											=					[
                temp_row[i - 1] + temp_row[i] for i in range(1			,		distinct_elements + 1		)
            ]
            UpperCamelCase__     : int											=					row_first_half[: (row_index + 1) // 2]
            row_second_half.reverse()
            UpperCamelCase__     : str											=					row_first_half + row_second_half
            result.append(UpperCamelCase__		)

      return result


def 				SCREAMING_SNAKE_CASE_   (      ):
      from collections.abc import Callable
      from timeit import timeit

      def benchmark_a_function(UpperCamelCase__			,		UpperCamelCase__		) -> None:
            UpperCamelCase__     : List[str]											=					f'''{func.__name__}({value})'''
            UpperCamelCase__     : List[Any]											=					timeit(f'''__main__.{call}'''			,		setup='''import __main__'''		)
            # print(f"{call:38} = {func(value)} -- {timing:.4f} seconds")
            print(f'''{call:38} -- {timing:.4f} seconds'''		)

      for value in range(1_5		):  # (1, 7, 14):
            for func in (generate_pascal_triangle, generate_pascal_triangle_optimized):
                  benchmark_a_function(UpperCamelCase__			,		UpperCamelCase__		)
            print()


if __name__ == "__main__":
    import doctest

    doctest.testmod()
    benchmark()




def 				SCREAMING_SNAKE_CASE_   (      UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__		):
      if index == number_of_items:
            return 0
      UpperCamelCase__     : str											=					0
      UpperCamelCase__     : Optional[Any]											=					0
      UpperCamelCase__     : int											=					knapsack(UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		index + 1		)
      if weights[index] <= max_weight:
            UpperCamelCase__     : List[Any]											=					values[index] + knapsack(
                UpperCamelCase__			,		UpperCamelCase__			,		UpperCamelCase__			,		max_weight - weights[index]			,		index + 1		)
      return max(UpperCamelCase__			,		UpperCamelCase__		)


if __name__ == "__main__":
    import doctest

    doctest.testmod()


