Skip to content

Instantly share code, notes, and snippets.

@RadoRado
Created August 27, 2012 10:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RadoRado/3487437 to your computer and use it in GitHub Desktop.
Save RadoRado/3487437 to your computer and use it in GitHub Desktop.
Държавен изпит, задачата по функционално
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