open System let rec comb n l = match n, l with | 0, _ -> [[]] | _, [] -> [] | k, (x::xs) -> List.map ((@) [x]) (comb (k-1) xs) @ comb k xs let minQE (nums: int list) grps = [2..(nums.Length/grps - 1)] |> List.map (fun n -> comb n nums) |> List.concat |> List.filter (fun cmb -> cmb |> List.sum = (nums |> List.sum) / grps) |> Seq.groupBy (fun cmb -> cmb.Length) |> Seq.minBy (fun (len,_) -> len) |> snd |> Seq.map (fun cmb -> cmb |> List.map int64 |> List.reduce (*)) |> Seq.min let nums = IO.File.ReadAllLines "day24.txt" |> Array.map Int32.Parse |> Array.toList minQE nums 3 |> printfn "3 Groups: %A" minQE nums 4 |> printfn "4 Groups: %A"