|
|
@ -20,14 +20,44 @@ module EulerProblem105 =
|
|
|
|
|
|
|
|
|
|
|
|
let allSubsets = generateSubsetsAux [[]] set
|
|
|
|
let allSubsets = generateSubsetsAux [[]] set
|
|
|
|
List.filter (fun subset -> not (List.isEmpty subset)) allSubsets
|
|
|
|
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 run filePath =
|
|
|
|
let sets = parseInput filePath
|
|
|
|
let sets = parseInput filePath
|
|
|
|
printfn "Загружено %d множеств" (List.length sets)
|
|
|
|
printfn "Загружено %d множеств" (List.length sets)
|
|
|
|
|
|
|
|
|
|
|
|
let testSet = List.head sets
|
|
|
|
let testExample1 = sets |> List.head
|
|
|
|
let subsets = generateAllSubsets testSet
|
|
|
|
let testExample2 = sets |> List.item 1
|
|
|
|
printfn "Для первого множества сгенерировано %d непустых подмножеств" (List.length subsets)
|
|
|
|
|
|
|
|
|
|
|
|
printfn "Проверка первого примера: %A" testExample1
|
|
|
|
|
|
|
|
printfn "Результат: %b (ожидается: false)" (isSpecialSumSet testExample1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printfn "Проверка второго примера: %A" testExample2
|
|
|
|
|
|
|
|
printfn "Результат: %b (ожидается: true)" (isSpecialSumSet testExample2)
|
|
|
|
|
|
|
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
|
|
|
|
|
|
|