PF-2024/Readme.md

50 lines
4.4 KiB
Markdown
Raw Permalink Normal View History

2024-04-15 15:30:43 +02:00
## 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`
2024-04-15 15:34:07 +02:00
Inne przykłady:
2024-04-15 15:30:43 +02:00
- `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).
2024-05-06 16:14:30 +02:00
Plik ze skryptem należy wysłać mailem na [bf55466@st.amu.edu.pl](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](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.
- zastosowanie funkcji monadycznych mapM, forM, sequence (https://hackage.haskell.org/package/base-4.19.1.0/docs/Control-Monad.html#g:4),
- obsługa bytestringów wraz z porównaniem ze zwykłym stringiem,
- wykorzystanie biblioteki obsługującej ciekawą strukturę danych, np. Data.Graph, Data.Map. Data.Tree (https://downloads.haskell.org/ghc/latest/docs/libraries/index.html)
- zdefiniowanie i wykorzystanie własnych monad.