// For more information see https://aka.ms/fsharp-console-apps open System.IO module EulerProblem105 = let parseInput (filePath: string) = File.ReadAllLines(filePath) |> Array.map (fun line -> line.Split(',') |> Array.map int |> Array.toList) |> Array.toList let generateAllSubsets set = let rec generateSubsetsAux acc remaining = match remaining with | [] -> acc | x::xs -> let newSubsets = List.map (fun subset -> x::subset) acc generateSubsetsAux (acc @ newSubsets) xs let allSubsets = generateSubsetsAux [[]] set List.filter (fun subset -> not (List.isEmpty subset)) allSubsets let checkPrefixSuffixRule (sortedSet: int list) = let n = List.length sortedSet let rec check k = if k > n / 2 then true else let prefixSum = sortedSet |> List.take (k+1) |> List.sum let suffixSum = sortedSet |> List.rev |> List.take k |> List.sum if prefixSum <= suffixSum then false else check (k+1) check 1 let checkUniqueSums set = let subsets = generateAllSubsets set let sums = subsets |> List.map List.sum let uniqueSums = sums |> Set.ofList List.length sums = Set.count uniqueSums let isSpecialSumSet set = let sortedSet = List.sort set checkPrefixSuffixRule sortedSet && checkUniqueSums sortedSet let run filePath = let sets = parseInput filePath printfn "Загружено %d множеств" (List.length sets) let testExample1 = sets |> List.head let testExample2 = sets |> List.item 1 printfn "Проверка первого примера: %A" testExample1 printfn "Результат: %b (ожидается: false)" (isSpecialSumSet testExample1) printfn "Проверка второго примера: %A" testExample2 printfn "Результат: %b (ожидается: true)" (isSpecialSumSet testExample2) 0 [] let main argv = let result = EulerProblem105.run "sets.txt" printfn "Результат: %d" result 0