let rotateArray (arr,n) = let index = ref 0 in let tmp = Array.get arr !index in while !index < n-1 do arr.(!index) <- arr.(!index+1); index := !index+1 done; arr.(!index) <- tmp; arr let rotateList = function |[] -> [] |h::t -> List.append t [h] let rotateListrec = function |[] -> [] |h::t -> let tmp = h in let rec rl = function |[] -> [tmp] |h2::t2 -> h2::rl t2 in rl t let rotateArray2 (arr,n) = let tmp = Array.get arr 0 in let arr2 = Array.init (Array.length arr) (fun _ -> 0) in Array.blit arr 1 arr2 0 (n-1); arr2.(n-1) <- tmp; arr2 type recordl = {fst : int; toshift : int list} let part1List lst = { fst = List.hd lst; toshift = List.tl lst} let part2List x = x let part3List t h = List.append t [h] let rotateListParts lst = match lst with |[] -> [] |lst -> let record = part1List lst in part3List (part2List record.toshift) record.fst type recorda = {fst : int; toshift : int array * int} let part1Array (arr,n) = { fst = Array.get arr 0; toshift = (arr,n)} let part2Array (arr,n) = let arr2 = Array.init (Array.length arr) (fun _ -> 0) in Array.blit arr 1 arr2 0 (n-1); (arr2,n) let part3Array (arr,n) tmp = arr.(n-1) <- tmp; arr let rotateArrayParts (arr,n) = let record = part1Array (arr,n) in part3Array (part2Array (record.toshift)) record.fst ;; assert (rotateArray ((Array.init 20 (function _ -> 0)), 3) = Array.init 20 (function _ -> 0));; assert (rotateArray ((Array.init 20 (function 0 -> 5 | 1 -> 4 | 2 -> 3 | _ -> 0)), 3) = Array.init 20 (function 0 -> 4 | 1 -> 3 | 2 -> 5 | _ -> 0));; assert (rotateArray2 ((Array.init 20 (function _ -> 0)), 3) = Array.init 20 (function _ -> 0));; assert (rotateArray2 ((Array.init 20 (function 0 -> 5 | 1 -> 4 | 2 -> 3 | _ -> 0)), 3) = Array.init 20 (function 0 -> 4 | 1 -> 3 | 2 -> 5 | _ -> 0));; assert (rotateArrayParts ((Array.init 20 (function _ -> 0)), 3) = Array.init 20 (function _ -> 0));; assert (rotateArrayParts ((Array.init 20 (function 0 -> 5 | 1 -> 4 | 2 -> 3 | _ -> 0)), 3) = Array.init 20 (function 0 -> 4 | 1 -> 3 | 2 -> 5 | _ -> 0));; assert (rotateList [] = []);; assert (rotateList [5;4;3] = [4;3;5]);; assert (rotateListrec [] = []);; assert (rotateListrec [5;4;3] = [4;3;5]);; assert (rotateListParts [] = []);; assert (rotateListParts [5;4;3] = [4;3;5]);;