PF-2024/Readme.md

4.4 KiB

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ą, zatem wybrany [["Kowalski", "Nowak"],["Szymańska"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"]] zwraca Nowak

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 wyboru
  • wybrany [["Kowalski", "Nowak"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"]] zwraca Nowak
  • wybrany [["Kowalski", "Nowak"],["Nowak", "Szymańska"],["Nowak", "Kowalski", "Szymańska"],["Szymańska", "Nowak", "Kowalski"],["Nowak"], ["Szymańska"]] zwraca Nowak

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).

Projekt

Założenia:

  • Projekt przygotowywany jest w parach, punkty za niego otrzymują Państwo w tej samej wysokości dla każdego z członków pary.
  • Do 13.05.2024 należy wysłać na bf55466@st.amu.edu.pl maila z informacją o członkach zespołu i tematyce projektu.
  • Do 26.05.2024 należy umieścić na repozytorium wydziałowym kod źródłowy projektu.
  • W dniach 27.05.2024 i 3.06.2024 odbywać się będzie prezentacja projektu na zajęciach. Przewidzianych jest 5 obron 27.05 i 4 obrony 3.06, proszę o deklarację proponowanego terminu w mailu.
  • Celem projektu jest stworzenie pełnej aplikacji w Haskellu realizującej wybraną przez Państwa funkcjonalność.
  • Należy zawrzeć 2 elementy niekoniecznie haskellowych aplikacji, np.
    • testy,
    • wyjątki,
    • połączenia z bazą danych/źrodłem dostępnym w internecie.
  • Należy zawrzeć 2 elementy charakterystyczne dla Haskella i nieomawiane do 6.05.2024 na laboratoriach, np.