(* FCFS scheduling algorithm *)

(* return the averaget turn-around time from finish times of three processes *)
(* fcfs1: int -> int -> int -> float *)
let fcfs1 p1 p2 p3 = (float_of_int (p1 + p2 + p3)) /. 3.0

let test1_1 = fcfs1 10 15 35 = 20.0
let test1_2 = fcfs1 10 15 20 = 15.0
let test1_3 = fcfs1 0 0 3 = 1.0

(* return the averaget turn-around time from running times of three processes *)
(* fcfs2: int -> int -> int -> float *)
let fcfs2 p1 p2 p3 = (float_of_int (p1 + p1 + p2 + p1 + p2 + p3)) /. 3.0

let test2_1 = fcfs2 10 5 20 = 20.0
let test2_2 = fcfs2 10 5 5 = 15.0
let test2_3 = fcfs2 0 0 3 = 1.0

(* return the averaget turn-around time from histories of three processes *)
(* fcfs2: int -> 'a -> int -> int -> 'b -> int -> int -> 'c -> int -> float *)
let fcfs3 p1s p1p p1e p2s p2p p2e p3s p3p p3e = float_of_int ((p1e - p1s) + (p2e - p2s) + (p3e - p3s)) /. 3.0;;

let test3_1 = fcfs3 0 10 10 0 5 15 0 20 35 = 20.0
let test3_2 = fcfs3 0 10 10 0 5 15 0 5 20 = 15.0
let test3_3 = fcfs3 0 0 0 0 0 0 0 3 3 = 1.0
(* [1;2;3;5] -> [1;3;6;11] *)

let rec sigma' v l = match l with
  [] -> []
| first :: rest -> (first + v) :: (sigma' (first + v) rest)

let sigma l = sigma' 0 l
let rec print_string_list l = match l with
  [] -> print_string "END\n"
| f::r ->print_string f; print_newline(); print_string_list r;;

let rec list_length l = match l with
  [] -> 0
| f::r -> 1 + list_length r;;

let read_line_as_list _ = try [read_line()] with
  End_of_file -> [];;

let rec read_lines_as_list _ = match read_line_as_list() with
  [] -> []
| l::t -> l::read_lines_as_list();;

let log_list = read_lines_as_list();;

print_int (list_length log_list);;


(* print_string (read_line());; *)
(* print_string (read_line());; *)
(* try print_string (read_line()) with *)
(*  End_of_file -> print_string "\nFinished\n" *)

(*
let print_string_list l = match l with
  [] -> print_string "END\n"
| f::r -> print_string f; print_newline();;
*)

let rec print_string_list l = match l with
  [] -> print_string "END\n"
| f::r ->print_string f; print_newline(); print_string_list r;;

let rec list_length l = match l with
  [] -> 0
| f::r -> 1 + list_length r;;

let read_line_as_list _ = try [read_line()] with
  End_of_file -> [];;

let rec read_lines_as_list _ = match read_line_as_list() with
  [] -> []
| l::t -> l::read_lines_as_list();;

(* print_string_list (read_line_as_list());; *)
(* print_string_list (read_line_as_list());; *)
(* print_string_list (read_line_as_list());; *)

(* print_string_list (read_lines_as_list());; *)

print_int (list_length (read_lines_as_list()));;


