Created
August 27, 2012 10:53
-
-
Save RadoRado/3487437 to your computer and use it in GitHub Desktop.
Държавен изпит, задачата по функционално
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Data.List | |
-- Фунцкията проверява дали между двата списъка има поне 1 общ елемент | |
-- пример - между [1,2,3] и [4,5,6] няма да има общ елемент и няма да съвпада с условието на задачата | |
-- функцинята nub връща списък от уникални елементи | |
containsOneElement :: Eq a => [a] -> [a] -> Bool | |
containsOneElement a b = (length (a ++ b) /= length (nub (a ++ b))) | |
-- фунцията проверява дали check изпълнява условието с всеки един от подсписъците на [[a]] | |
checkEach :: Eq a => [a] -> [[a]] -> Bool | |
checkEach check [] = True | |
checkEach check (x:xs) = (containsOneElement check x) && (checkEach check xs) | |
-- тъй като ни интересува дали всеки списък отговаря на условията | |
-- рекурсията добавя текущият списък към края на списъкът от списицъ, за да не губим елементи | |
-- поради тази причина, тази функция следи с параметъра counter дали сме минали всички елементи | |
-- функцията връща отговора на задачата | |
solve1 :: Eq a => [[a]] -> Int -> Int -> Int | |
solve1 (x:xs) len counter | |
| len == counter = 0 | |
| checkEach x xs == True = 1 + (solve1 (xs ++ [x]) len (counter + 1)) | |
| otherwise = 0 + (solve1 (xs ++ [x]) len (counter + 1)) | |
-- основната функция, която се вика с аругмент списък от списъци | |
solve :: Eq a => [[a]] -> Int | |
solve a = solve1 a (length a) 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment