


def 						lowercase_(    SCREAMING_SNAKE_CASE_      ):


  '''simple docstring'''

  lowerCamelCase					:   str       =							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 						lowercase_(    SCREAMING_SNAKE_CASE_      ):


  '''simple docstring'''

  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"      )

  lowerCamelCase					:   Dict       =							[]
  for current_row_idx in range(UpperCamelCase__      ):
    lowerCamelCase					:   List[str]       =							populate_current_row(UpperCamelCase__ ,		UpperCamelCase__      )
    triangle.append(UpperCamelCase__      )
  return triangle






def 						lowercase_(    SCREAMING_SNAKE_CASE_ ,		SCREAMING_SNAKE_CASE_      ):


  '''simple docstring'''

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






def 						lowercase_(    SCREAMING_SNAKE_CASE_ ,		SCREAMING_SNAKE_CASE_ ,		SCREAMING_SNAKE_CASE_ ,		SCREAMING_SNAKE_CASE_ ,		):


  '''simple docstring'''

  lowerCamelCase					:   Tuple       =							triangle[current_row_idx - 1][current_col_idx - 1]
  lowerCamelCase					:   Union[str, Any]       =							triangle[current_row_idx - 1][current_col_idx]
  lowerCamelCase					:   Any       =							above_to_left_elt + above_to_right_elt






def 						lowercase_(    SCREAMING_SNAKE_CASE_      ):


  '''simple docstring'''

  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"      )

  lowerCamelCase					:   Any       =							[[1]]

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

  return result






def 						lowercase_(    ):


  '''simple docstring'''

  from collections.abc import Callable
  from timeit import timeit

  def benchmark_a_function(SCREAMING_SNAKE_CASE_ ,		SCREAMING_SNAKE_CASE_      ) -> None:
    lowerCamelCase					:   Union[str, Any]       =							f"""{func.__name__}({value})"""
    lowerCamelCase					:   int       =							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(15      ):  # (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()




'''simple docstring'''




def __lowerCAmelCase					(				UpperCamelCase__							)      ->       bool:
    if number < 0:
        raise ValueError('''number must not be negative'''							)
    return number & (number - 1) == 0


if __name__ == "__main__":
  import doctest

  doctest.testmod()
