Второ контролно по Функционално програмиране

спец. Информатика, Компютърни науки, 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"]

Last modified: Sunday, 14 December 2025, 10:38 AM