From bb0178f467acb25b76ecfc991f8f0a0f860c4e63 Mon Sep 17 00:00:00 2001 From: Artem-Darius Weber Date: Thu, 17 Apr 2025 11:54:06 +0300 Subject: [PATCH] (IT 1) feat: project init and parse input data --- Individual Task 1/Program.fs | 22 ++++++++++++++++++++- Individual Task 1/README.md | 38 ++++++++++++++++++++++++++++++++++++ Individual Task 1/sets.txt | 12 ++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 Individual Task 1/README.md create mode 100644 Individual Task 1/sets.txt diff --git a/Individual Task 1/Program.fs b/Individual Task 1/Program.fs index d6818ab..ce8a39b 100644 --- a/Individual Task 1/Program.fs +++ b/Individual Task 1/Program.fs @@ -1,2 +1,22 @@ // For more information see https://aka.ms/fsharp-console-apps -printfn "Hello from F#" +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 run filePath = + let sets = parseInput filePath + printfn "Загружено %d множеств" (List.length sets) + 0 + +[] +let main argv = + let result = EulerProblem105.run "sets.txt" + printfn "Результат: %d" result + 0 diff --git a/Individual Task 1/README.md b/Individual Task 1/README.md new file mode 100644 index 0000000..1a9cee8 --- /dev/null +++ b/Individual Task 1/README.md @@ -0,0 +1,38 @@ +# Project Euler 105 — Special Sum Sets + +## Условие задачи + +Пусть $S(A)$ — сумма элементов множества $A$. Множество $A$ называется special sum set, если для любых двух непустых непересекающихся подмножеств $B$ и $C$ выполняются: +1. $S(B) \ne S(C)$ (суммы не равны) +2. Если $|B| > |C|$, то $S(B) > S(C)$ + +Дан файл `sets.txt` с 100 наборами по 7–12 чисел. Найти сумму $S(A)$ по всем special sum set. + +## Требования к решению +- Функциональный стиль (F#) +- Обязательно использовать хвостовую рекурсию хотя бы раз +- Использовать методы работы с коллекциями (`List.map`, `List.filter`, и т.д.) +- Запрещены циклы +- Решение должно быть разбито на несколько осмысленных коммитов, разнесённых по времени + +## Теория и критерии +1. **Префикс-суффикс неравенства**: для отсортированного $A$: + $$ + \sum_{i=1}^{k+1} a_i > \sum_{i=0}^{k-1} a_{n-i}, \quad k=1,\dots,\left\lfloor\frac n2\right\rfloor + $$ + Это гарантирует правило (2). +2. **Уникальность всех сумм**: все суммы непустых подмножеств должны быть различны. + +## Алгоритм (F#) +1. Прочитать файл, преобразовать строки в списки чисел +2. Для каждого множества: + - Проверить префикс-суффикс неравенство (хвостовая рекурсия) + - Проверить уникальность всех сумм подмножеств (методы коллекций) +3. Просуммировать суммы подходящих множеств + +## Проверка +- Зарегистрироваться на projecteuler.net +- Проверить ответ (для задачи 105 — 73702) + + + diff --git a/Individual Task 1/sets.txt b/Individual Task 1/sets.txt new file mode 100644 index 0000000..a578114 --- /dev/null +++ b/Individual Task 1/sets.txt @@ -0,0 +1,12 @@ +81,88,75,42,87,84,86,65 +157,150,164,119,79,159,161,139,158 +673,465,569,603,524,288,641,632,624 +375,649,651,638,384,493,445,648,667,669 +67,196,83,134,322,145,336,342,289,309 +851,93,893,261,543,535,294,195,122,562 +302,60,902,38,709,596,89,471,877,741 +82,113,73,100,87,83,121,122 +765,468,687,906,863,497,462,777,492,258 +394,651,362,598,913,192,554,871,362,809 +631,92,535,196,131,1,606,173,706,193 +652,343,153,171,288,546,238,366,462,734