




from __future__ import annotations

from collections.abc import Generator

def       UpperCAmelCase_							(   __UpperCAmelCase		:			int							)      ->				Generator[int, None, None]:
      if not isinstance(__UpperCAmelCase    ,    __UpperCAmelCase							) or n < 1:
            raise Exception('Sequence only defined for positive integers'							)

      yield n
      while n != 1:
            if n % 2 == 0:
                  n //= 2
            else:
                  SCREAMING_SNAKE_CASE_					=    3 * n + 1
            yield n

def       UpperCAmelCase_							(   )      ->				Union[str, Any]:
      SCREAMING_SNAKE_CASE_					=    43
      SCREAMING_SNAKE_CASE_					=    tuple(collatz_sequence(__UpperCAmelCase							)							)
      print(__UpperCAmelCase							)
      print(f"Collatz sequence from {n} took {len(__UpperCAmelCase							)} steps."							)


if __name__ == "__main__":
   main()





from __future__ import annotations

def       UpperCAmelCase_							(   __UpperCAmelCase		:			list[int]							)      ->				list[int]:
      SCREAMING_SNAKE_CASE_					=    [0] * len(__UpperCAmelCase							)
      for i in range(1    ,    len(__UpperCAmelCase							)							):
            SCREAMING_SNAKE_CASE_					=    duration_times[i - 1] + waiting_times[i - 1]
      return waiting_times

def       UpperCAmelCase_							(   __UpperCAmelCase		:			list[int]    ,    __UpperCAmelCase		:			list[int]							)      ->				list[int]:
      return [
          duration_time + waiting_times[i]
          for i, duration_time in enumerate(__UpperCAmelCase							)
      ]

def       UpperCAmelCase_							(   __UpperCAmelCase		:			list[int]							)      ->				float:
      return sum(__UpperCAmelCase							) / len(__UpperCAmelCase							)

def       UpperCAmelCase_							(   __UpperCAmelCase		:			list[int]							)      ->				float:
      return sum(__UpperCAmelCase							) / len(__UpperCAmelCase							)


if __name__ == "__main__":
   # process id's
   lowerCamelCase__				:     Union[str, Any]			       =							[1, 2, 3]

   # ensure that we actually have processes
   if len(processes) == 0:
      print('Zero amount of processes')
      raise SystemExit(0)

   # duration time of all processes
   lowerCamelCase__				:     Optional[Any]			       =							[19, 8, 9]

   # ensure we can match each id to a duration time
   if len(duration_times) != len(processes):
      print('Unable to match all id\'s with their duration time')
      raise SystemExit(0)

   # get the waiting times and the turnaround times
   lowerCamelCase__				:     Dict			       =							calculate_waiting_times(duration_times)
   lowerCamelCase__				:     int			       =							calculate_turnaround_times(duration_times, waiting_times)

   # get the average times
   lowerCamelCase__				:     Any			       =							calculate_average_waiting_time(waiting_times)
   lowerCamelCase__				:     Tuple			       =							calculate_average_turnaround_time(turnaround_times)

   # print all the results
   print('Process ID\tDuration Time\tWaiting Time\tTurnaround Time')
   for i, process in enumerate(processes):
      print(
          f'''{process}\t\t{duration_times[i]}\t\t{waiting_times[i]}\t\t'''
          f'''{turnaround_times[i]}'''
      )
   print(f'''Average waiting time = {average_waiting_time}''')
   print(f'''Average turn around time = {average_turnaround_time}''')