diff --git a/practice/024/answer/impl.ml b/practice/024/answer/impl.ml new file mode 100644 index 0000000000..e89a78ac30 --- /dev/null +++ b/practice/024/answer/impl.ml @@ -0,0 +1,25 @@ +let rand_select list n = + let rec extract acc n = function + | [] -> raise Not_found + | h :: t -> if n = 0 then (h, acc @ t) else extract (h :: acc) (n - 1) t + in + let extract_rand list len = + extract [] (Random.int len) list + in + let rec aux n acc list len = + if n = 0 then acc else + let picked, rest = extract_rand list len in + aux (n - 1) (picked :: acc) rest (len - 1) + in + let len = List.length list in + aux (min n len) [] list len + +let range a b = + let rec aux acc high low = + if high >= low then + aux (high :: acc) (high - 1) low + else acc + in + if a < b then aux [] b a else List.rev (aux [] a b) + + let lotto_select n m = rand_select (range 1 m) n diff --git a/practice/024/answer/test/dune b/practice/024/answer/test/dune new file mode 100644 index 0000000000..efa4aec676 --- /dev/null +++ b/practice/024/answer/test/dune @@ -0,0 +1,2 @@ +(include_subdirs no) +(test (name run) (libraries ounit2 ex)) diff --git a/practice/024/answer/test/run.ml b/practice/024/answer/test/run.ml new file mode 100644 index 0000000000..f415eab075 --- /dev/null +++ b/practice/024/answer/test/run.ml @@ -0,0 +1,3 @@ +module Test = Ex.Make(Ex.Answer) + +let () = OUnit2.run_test_tt_main Test.v diff --git a/practice/024/dune b/practice/024/dune new file mode 100644 index 0000000000..36077c968d --- /dev/null +++ b/practice/024/dune @@ -0,0 +1,2 @@ +(include_subdirs qualified) +(library (name ex) (libraries ounit2)) diff --git a/practice/024/dune-project b/practice/024/dune-project new file mode 100644 index 0000000000..3c48133ad5 --- /dev/null +++ b/practice/024/dune-project @@ -0,0 +1 @@ +(lang dune 3.7) diff --git a/practice/024/ex.ml b/practice/024/ex.ml new file mode 100644 index 0000000000..95b98565d2 --- /dev/null +++ b/practice/024/ex.ml @@ -0,0 +1,15 @@ +open OUnit2 + +module type Testable = sig + val lotto_select : int -> int -> int list +end + +module Make(Tested: Testable) : sig val v : test end = struct + let v = "lotto_select" >::: [ + "nil" >:: (fun _ -> assert_equal [] (Tested.lotto_select 0 0)); + "cons" >:: (fun _ -> assert_equal [20; 28; 45; 16; 24; 38] (Tested.lotto_select 6 49)); + ] +end + +module Work : Testable = Work.Impl +module Answer : Testable = Answer.Impl diff --git a/practice/024/work/impl.ml b/practice/024/work/impl.ml new file mode 100644 index 0000000000..872ccece10 --- /dev/null +++ b/practice/024/work/impl.ml @@ -0,0 +1 @@ +let lotto_select _ = failwith "Not yet implemented" diff --git a/practice/024/work/test/dune b/practice/024/work/test/dune new file mode 100644 index 0000000000..efa4aec676 --- /dev/null +++ b/practice/024/work/test/dune @@ -0,0 +1,2 @@ +(include_subdirs no) +(test (name run) (libraries ounit2 ex)) diff --git a/practice/024/work/test/run.ml b/practice/024/work/test/run.ml new file mode 100644 index 0000000000..7f63254fc5 --- /dev/null +++ b/practice/024/work/test/run.ml @@ -0,0 +1,3 @@ +module Test = Ex.Make(Ex.Work) + +let () = OUnit2.run_test_tt_main Test.v