diff --git a/Individual Task 1/Program.fs b/Individual Task 1/Program.fs index daea313..1f676b1 100644 --- a/Individual Task 1/Program.fs +++ b/Individual Task 1/Program.fs @@ -20,14 +20,44 @@ module EulerProblem105 = 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 testSet = List.head sets - let subsets = generateAllSubsets testSet - printfn "Для первого множества сгенерировано %d непустых подмножеств" (List.length subsets) + 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