Примерна тема за второ контролно (2024/25 г.)
Второ контролно по Функционално програмиране
спец. Информатика, Компютърни науки, 2 поток и избираема
Задача 1. (9 т.) Да се реализира функция outsideCircle която приема целочислени координати x и y на център на кръг и целочислен радиус r, и връща безкраен поток без повторения от наредени двойки от цели числа, представляващи координатите на точките, разположени извън кръга.
Пример: outsideCircle 0 0 2 → [(3,0),(2,1),(1,2),(0,3),(-1,2),(-2,1),(-3,0), …
Задача 2. (8 т.) Да се реализира функция deepMapCond, която приема дълбок списък xss, двуместен предикат p и две двуместни функции f1 и f2. Функцията да връща трансформирано копие на xss, в което f1 е приложена върху всички атоми, които удовлетворяват p, а f2 е приложена върху всички останали атоми. Като аргументи на p, f1 и f2 се подават атомът и неговата дълбочина в списъка. Дълбочина на елемент x в дълбок списък дефинираме рекурсивно като 1 + дълбочината на списка, на който x е непосредствен елемент, като приемаме, че целият дълбок списък е на дълбочина 0.
Пример: (deepMapCond '(1 (2 (5 1) 4) 3) > (λ (x d) d) (λ (x d) (* x 2))) →
(2 (4 (3 2) 2) 1)
Задача 3. Всеки кръг от шампионата Формула 1 е представен като двойка от името на пистата (низ) и списък от пилоти. Всеки пилот е представен с име (низ), спечелени точки от състезанието, наказателни секунди и време за най-бърза обиколка в секунди. Данните за сезона се представят като списък от кръгове и се подават като параметър на всяка от функциите по-долу.
а) (4 т.) Да се реализира функция allWinners, която връща списък без повторения от имената на всички пилоти, които са били първи в поне един кръг.
б) (4 т.) Да се реализира функция penaltyImpact, която връща списък от двойки (пилот с поне едно наказание, общо наказания от всички кръгове), сортиран в низходящ ред по втория компонент.
в) (5 т.) Да се реализира функция fastestLap, която връща името на пилота, който е направил най-бързата обиколка през сезона. Ако има повече от един такъв, функцията може да върне който и да е от тях.
г) (5 т.) Да се реализира функция missedFastestLapWins, която връща списък от имената на всички писти, на които победителят в съответния кръг НЕ Е направил най-бързата обиколка. Победител е пилотът с най-много точки от този кръг, като по правилата на Формула 1 има единствен такъв.
Пример:
season = [("Silverstone", [("Leclerc", 15, 10, 82), ("Hamilton", 25, 5, 80),
("Verstappen", 18, 0, 78)]),
("Monza", [("Sainz", 18, 0, 81), ("Hamilton", 15, 10, 79),
("Verstappen", 25, 0, 77)]),
("Spa", [("Norris", 18, 5, 78), ("Russell", 25, 0, 76)]) ]
allWinners season → ["Hamilton", "Verstappen", "Russell"]
penaltyImpact season → [("Hamilton", 15), ("Leclerc", 10), ("Norris", 5)]
fastestLap season → "Russell" missedFastestLapWins season → ["Silverstone"]