
from __future__ import annotations

from statistics import mean




def  __magic_name__ (   __lowerCAmelCase	:						list[int]		,  __lowerCAmelCase	:						list[int]		,  __lowerCAmelCase	:						int							)			->   list[int]:
				__lowerCamelCase    					=	[0] * no_of_processes
				__lowerCamelCase    					=	[0] * no_of_processes

				# Initialize remaining_time to waiting_time.

				for i in range(__lowerCAmelCase							):
								__lowerCamelCase    					=	burst_time[i]
				__lowerCamelCase    					=	[]

				__lowerCamelCase    					=	0
				__lowerCamelCase    					=	0

				# When processes are not completed,
				# A process whose arrival time has passed \
				# and has remaining execution time is put into the ready_process.
				# The shortest process in the ready_process, target_process is executed.

				while completed != no_of_processes:
								__lowerCamelCase    					=	[]
								__lowerCamelCase    					=	-1

								for i in range(__lowerCAmelCase							):
												if (arrival_time[i] <= total_time) and (remaining_time[i] > 0):
																ready_process.append(__lowerCAmelCase							)

								if len(__lowerCAmelCase							) > 0:
												__lowerCamelCase    					=	ready_process[0]
												for i in ready_process:
																if remaining_time[i] < remaining_time[target_process]:
																				__lowerCamelCase    					=	i
												total_time += burst_time[target_process]
												completed += 1
												__lowerCamelCase    					=	0
												__lowerCamelCase    					=	(
												    total_time - arrival_time[target_process] - burst_time[target_process]
												)
								else:
												total_time += 1

				return waiting_time




def  __magic_name__ (   __lowerCAmelCase	:						list[int]		,  __lowerCAmelCase	:						int		,  __lowerCAmelCase	:						list[int]							)			->   list[int]:
				__lowerCamelCase    					=	[0] * no_of_processes
				for i in range(__lowerCAmelCase							):
								__lowerCamelCase    					=	burst_time[i] + waiting_time[i]
				return turn_around_time


if __name__ == "__main__":
					print("[TEST CASE 01]")

					SCREAMING_SNAKE_CASE__   :			Tuple												=    4
					SCREAMING_SNAKE_CASE__   :			Optional[int]												=    [2, 5, 3, 7]
					SCREAMING_SNAKE_CASE__   :			List[str]												=    [0, 0, 0, 0]
					SCREAMING_SNAKE_CASE__   :			str												=    calculate_waitingtime(arrival_time, burst_time, no_of_processes)
					SCREAMING_SNAKE_CASE__   :			Union[str, Any]												=    calculate_turnaroundtime(
					    burst_time, no_of_processes, waiting_time
					)

					# Printing the Result
					print("PID\tBurst Time\tArrival Time\tWaiting Time\tTurnaround Time")
					for i, process_id in enumerate(list(range(1, 5))):
										print(
										    F'{process_id}\t{burst_time[i]}\t\t\t{arrival_time[i]}\t\t\t\t'
										    F'{waiting_time[i]}\t\t\t\t{turn_around_time[i]}'
										)
					print(F'\nAverage waiting time = {mean(waiting_time):.5f}')
					print(F'Average turnaround time = {mean(turn_around_time):.5f}')





import os




def  __magic_name__ (   )			->   str:
				__lowerCamelCase    					=	os.path.join(os.path.dirname(__lowerCAmelCase							)		,  '''num.txt'''							)
				with open(__lowerCAmelCase							) as file_hand:
								return str(sum(int(__lowerCAmelCase							) for line in file_hand							)							)[:10]


if __name__ == "__main__":
					print(solution())



