Hello, I wrote the function “main” which is passed as an argument to two positive integers “a” “b” and returns “k list list” which is a list of all possible lists where the length of “k list” is “a” and the sum of its elements is "b ", (Win - 3, Draw - 1, Loose - 0).
example:
main 3 4;;
- : k list list =
[[Loose; Draw; Win]; [Loose; Win; Draw]; [Win; Draw; Loose];
[Draw; Win; Loose]; [Draw; Loose; Win]; [Win; Loose; Draw]]
I’m afraid the “create” function might not work because of the Random.int function.
Can you offer me a more optimal solution or help me to fix that problem.
here is my code:
type k = Win | Draw | Loose
let rec sum n = match n with [] → 0 | h::t → h + sum t;;
let rec create n = let k = Random.int 4 in if k != 2&&n > 0 then k::create (n-1) else if k = 2&&n > 0 then create n else [];;
let rec convert l = match l with [] → [] | h::t → if h = 3 then Win::convert t else if h = 1 then Draw::convert t else Loose::convert t;;
let rec pow a = function | 0 → 1 | 1 → a | n → let b = pow a (n / 2) in b * b * (if n mod 2 = 0 then 1 else a);;
let rec calculate a b acc = match acc with 0 → [] | acc → let k = create a in if sum (k) = b then (convert (k))::calculate a b (acc - 1) else calculate a b (acc - 1);;
let f acc x = if List.mem x acc = false then x::acc else acc@[];;
let rec similar l = List.fold_left f [] l;;
let main a b = similar (calculate a b 580000);;