


from __future__ import annotations

from statistics import mean






def 					lowerCamelCase_   (	_a     ,       _a     ,       _a	):




		"""simple docstring"""






		lowerCAmelCase__       :      int   					= [0] * no_of_processes
		lowerCAmelCase__       :      List[str]   					= [0] * no_of_processes

		# Initialize remaining_time to waiting_time.

		for i in range(_a	):
				lowerCAmelCase__       :      str   					= burst_time[i]
		lowerCAmelCase__       :      list[int]   					= []

		lowerCAmelCase__       :      Union[str, Any]   					= 0
		lowerCAmelCase__       :      Union[str, Any]   					= 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__       :      str   					= []
				lowerCAmelCase__       :      List[Any]   					= -1

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

				if len(_a	) > 0:
						lowerCAmelCase__       :      Optional[Any]   					= ready_process[0]
						for i in ready_process:
								if remaining_time[i] < remaining_time[target_process]:
										lowerCAmelCase__       :      Optional[Any]   					= i
						total_time += burst_time[target_process]
						completed += 1
						lowerCAmelCase__       :      Tuple   					= 0
						lowerCAmelCase__       :      Any   					= (
						    total_time - arrival_time[target_process] - burst_time[target_process]
						)
				else:
						total_time += 1

		return waiting_time






def 					lowerCamelCase_   (	_a     ,       _a     ,       _a	):




		"""simple docstring"""






		lowerCAmelCase__       :      int   					= [0] * no_of_processes
		for i in range(_a	):
				lowerCAmelCase__       :      List[str]   					= burst_time[i] + waiting_time[i]
		return turn_around_time


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

		lowerCamelCase						=		4
		lowerCamelCase						=		[2, 5, 3, 7]
		lowerCamelCase						=		[0, 0, 0, 0]
		lowerCamelCase						=		calculate_waitingtime(arrival_time, burst_time, no_of_processes)
		lowerCamelCase						=		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}''')








def 					lowerCamelCase_   (	_a	):




		"""simple docstring"""






		if number < 0:
				raise ValueError('''number must not be negative'''	)
		return number & (number - 1) == 0


if __name__ == "__main__":
		import doctest

		doctest.testmod()




