Readme.md |
Kolokwium z programowania funkcyjnego 15.04.2024
Państwowa Komisja Wyborcza zwróciła się z prośbą o stworzenie w Haskellu funkcji wybrany :: Eq a => [[a]] -> a
, która wskaże zwycięzcę wyborów na prezydenta Poznania.
Wybory polegają na wskazaniu kandydatów w kolejności od kandydata pierwszego wyboru do kandydatów dalszych wyborów.
Wyborcy wskazują na liście kolejno kandydatów, przy czym ich liczba może być dowolna, ale niezerowa.
Argumentem funkcji wybrany
jest lista złożona z wyborów każdego z wyborców, tj. lista list.
Procedura ustalania zwycięzcy jest następująca: Dla każdego głosu wyborcy sprawdzany jest kandydat pierwszego wyboru. Kandydat z najmniejszą liczbą wskazań na pierwszym miejscu jest wykluczany z głosów każdego z wyborców. Po tym wykluczeniu następuje kolejne sprawdzenie, który z kandydatów ma najmniejsze poprarcie jako pierwszy wybór i ten kandydat odpada. Procedura powtarza się dopóki nie zostanie wyłoniony jedyny kandydat, który zostaje zwycięzcą i jednocześnie wynikiem działania funkcji wybrany. W przypadku dwóch kandydatów o identycznym najniższym poparciu eliminowany może być dowolny z nich.
Zakładamy, że każdy głos jest oddany poprawnie, czyli wskazano co najmniej jednego kandydata i żaden się nie powtarza. Przykłady działania:
- Dla głosów
[["Kowalski", "Nowak"],["Szymańska"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"]]
Kowalski jest najmniej popularnym kandydatem pierwszego wyboru (1 głos) Po wykluczeniu Kowalskiego głosy wyglądają następująco[["Nowak"],["Szymańska"],["Nowak", "Szymańska"],["Szymańska", "Nowak"],["Nowak"]]
Teraz najmniej popularnym kandydatem pierwszego wyboru jest Szymańska (2 głosy). Po jej wykluczeniu mamy[["Nowak"],[],["Nowak"],["Nowak"],["Nowak"]]
Po odsianiu pustego głosu pozostaje jeden kandydat, który jest zwycięzcą, zatemwybrany [["Kowalski", "Nowak"],["Szymańska"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"]]
zwracaNowak
Inne przykłady:
wybrany [["Kowalski", "Nowak"],["Szymańska"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"], ["Kowalski", "Szymańska"]]
może zwrócić dowolnego z nich, bo każdy ma po 2 głosy jako kandydat pierwszego wyboruwybrany [["Kowalski", "Nowak"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"]]
zwracaNowak
wybrany [["Kowalski", "Nowak"],["Nowak", "Szymańska"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"], ["Szymańska"]]
zwracaNowak
Nie jest wymagane optymalne podejście do implementacji algorytmów.
Należy użyć co najmniej dwukrotnie operatora $
i dwukrotnie operatora .
.
Dobrym pomysłem jest przygotowanie sobie kilku funkcji pomocniczych (jedną z nich może być np. funkcja wskazująca na kandydata z najmniejszym poparciem).
Plik ze skryptem należy wysłać mailem na bf55466@st.amu.edu.pl (można też załączyć link do repozytorium).