Група 1, Упражнение 14, Задачи
Задача 1. Нека са дефинирани:type PersonID = Inttype Name = Stringtype City = Stringtype AccountID = Inttype Balance = Doubletype Person = (PersonID, Name, City)type Account = (AccountID, PersonID, Balance)
Дефинирайте функцията getCriticalBalance :: ([Account], [Person]) -> (Person -> Bool) -> Balance -> [(PersonID, Balance)]. Функцията получава като първи аргумент база от данни database, представена като двойка от списък от сметки и списък от хора. Вторият аргумент е предикат p, а третият е критична стойност s на баланс. Функцията getCriticalBalance трябва да връща списък от двойки от идентификатор на човек (PersonID) и сума на баланс по всички сметки за конкретния PersonID. Върнатият списък трябва да съдържа всички хора, които удовлетворяват предиката p и за които сумата на баланса по всички сметки е по-малка от s. Всяка сметка е вектор с три елемента: идентификатор на сметка, идентификатор на човек и баланс по сметката. Всеки човек е представен като вектор от три елемента, съответно: идентификатор на човек, име и местоживеене.
Примери:db = ([(1, 1, 10), (2, 1, 11), (3, 1, 12), (4, 2, 3), (5, 2, 1), (6, 3, 2), (7, 3, 3), (8, 4, 12)], [(1, "Ivan", "Varna"), (2, "Petar", "Burgas"), (3, "Georgi", "Varna"), (4, "Yordan", "Plovdiv")])
fromVarna :: Person -> BoolfromVarna (_, _, "Varna") = TruefromVarna _ = False
getCriticalBalance db fromVarna 10 → [(3,5.0)] getCriticalBalance db (not . fromVarna) 15 → [(2,4.0),(4,12.0)]
Задача 2. Даден е списък от двойки, представящи оценките на ученици от даден клас по даден предмет. Първият елемент на всяка двойка е номерът на ученика в класа, а вторият - получената оценка по предмета (приемаща стойности от 0 до 100). Да се дефинира функция studAvg :: [(Int, Double)] -> [(Int, Double)], която приема списък от горепосочения вид и изчислява средната стойност на най-добрите пет оценки на всеки ученик. Резултатът да е сортиран спрямо номерата на учениците. Може да се приеме, че всеки ученик има поне пет оценки.
Примери:studAvg [(1, 100), (1, 50), (2, 100), (2, 93), (1, 39), (2, 87), (1, 89), (1, 87), (1, 90), (2, 100), (2, 76)] → [(1, 83.2), (2, 91.2)]studAvg [(3, 55), (2, 50), (1, 21), (3, 53), (2, 48), (1, 3), (3, 4), (2, 28), (1, 10), (3, 80), (2, 68), (1, 15), (3, 91), (2, 45), (1, 49)] → [(1,19.6),(2,47.8),(3,56.6)]
Задача 3. Палиндромът е число, което се чете по един и същ начин отляво надясно и отдясно наляво. Дефинирайте функция findMaxPalindrome :: Integer -> Integer, която получава естествено число n и връща като резултат най-големия палиндром, който може да се състави от някои от цифрите на числото n.
Примери:findMaxPalindrome 1112332 → 3211123findMaxPalindrome 22220 → 22022findMaxPalindrome 2205 → 252findMaxPalindrome 120021 → 210012findMaxPalindrome 12320 → 232findMaxPalindrome 123 → 3