Pierwsze zadanie zaliczeniowe

Jako, że sezon biegowy w pełni, w naszym pierwszym zadaniu zaliczeniowym postaramy się stworzyć system pomagający uporządkować jesienny trening grupie biegaczy. W pliku kilometraz.txt znajduje się zapis historii treningowej tej grupy, a poszczególne linie-wpisy mają postać:
runners_ID club distance time
runners_ID to liczba naturalna identyfikująca biegacza, club to nazwa klubu, do którego biegacz przynależy (nie zawiera spacji), distance jest liczbą rzeczywistą – liczbą kilometrów przebiegniętych przez biegacza, a time to liczba naturalna oznaczająca, ile sekund zajęło biegaczowi przebiegnięcie tego dystansu.
We wszystkich funkcjach w tym zadaniu zaliczeniowym, pierwszy parametr db_f będzie oznaczał plik z bazą danych treningowych w powyższym formacie.

Pierwszą częścią zadania będzie umożliwienie zawodnikom śledzenia swoich postępów. W związku z tym będziemy potrzebowali następujących funkcji:

  1. (1.5p.)distance(db_f, id), która zwróci całkowitą liczbę kilometrów, które zawodnik o identyfikatorze id odnotował w naszej bazie danych
  2. (1.5p.)best_velocity(db_f, id), zwracająca najlepszą prędkość spośród średnich osiąganych na poszczególnych treningach odnotowanych przez biegacza o identyfikatorze id (w km/h).

Jak wiadomo, trenerom łatwiej pracuje się, jeśli trenowana grupa jest w miarę możliwości jednorodna pod względem poziomu przygotowania. W związku z tym potrzebujemy funkcji, która pozwoli trenerom wybrać w swoim klubie grupę osób gotowych na planowany rodzaj treningu (3p.): funkcja group(db_f, club, min_distance, max_distance, min_average_velocity) powinna zwracać listę identyfikatorów zawodników klubu club, którzy w każdym treningowym biegu na dystansie pomiędzy min_distance i max_distance osiągali średnią prędkość co najmniej min_average_velocity (w km/h) (przyjmujemy, że jeżeli ktoś dotąd nie biegał na dystansach pomiędzy min_distance i max_distance, nie powinien być zaliczony do tej grupy).

Często po serii żmudnych treningów nadchodzi czas sprawdzenia swoich możliwości na zawodach. Aby ułatwić zadanie organizatorom zawodów, przygotujemy na podstawie naszej bazy danych prognozę popularności poszczególnych dystansów wśród biegaczy w bazie danych (4p.). Funkcja competitions(db_f, distances) przyjmuje jako parametr posortowaną rosnąco listę liczb całkowitych distances, zawierającą dystanse biegów, które odbędą się w ramach zawodów. Jako wynik, funkcja zwróci liczbę uczestników zainteresowanych poszczególnymi biegami. Przyjmiemy, że każdy biegacz jest zainteresowany tylko jednym dystansem, gdyż nie może jednocześnie biec w kilku biegach. Każdy przebiegnięty przez niego trening jest najbliższy któremuś z dystansów oferowanych przez organizatora zawodów. W przypadku treningów o długości równie bliskiej dwóm z oferowanych dystansów przyjmujemy, że taki trening bliższy jest dłuższemu dystansowi. Ulubiony dystans zawodnika będzie dystansem, który jest najbliższy największej ilości jego treningów (w przypadku remisów znowu preferujemy dłuższy z dystansów).

W najbliższym czasie pojawi się plik z przykładową bazą danych oraz wynikami przykładowych wywołań funkcji na tej bazie danych. Zadania w postaci kodu źródłowego (w jednym pliku zadanie1_nr-indeksu.py) przesyłają Państwo do wykładowcy i prowadzącego ćwiczenia (bartek@mimuw.edu.pl i (pawel.bednarz@mimuw.edu.pl lub mist@mimuw.edu.pl lub pwl@mimuw.edu.pl)) przed wykładem za trzy tygodnie (18 XI 2012, 12:15). Proszę o umieszczenie w tytule e-mail’a hasła [WDI-1].

18 thoughts on “Pierwsze zadanie zaliczeniowe”

  1. W części odnośnie treningów w ramach klubu, w specyfikacji dodałem opis znaczenia zmiennej club. Osoby, które już doszły do tego etapu w zadaniu prosiłbym o uwzględnienie tego faktu.

  2. Kiedy się ta baza pojawi, bo ciężko bez niej coś zacząć. Nie jest napisane czy te winiki są w formie:
    biegacz 1
    biegacz 2
    czy:
    biegacz 1
    biegacz 2
    biegacz 1
    biegacz 2
    biegacz 3
    biegacz 3

  3. Przykładowe wywołania funkcji na pliku kilometraz.txt:

    distance(“kilometraz.txt”, 0) == 1780.7696136429895
    distance(“kilometraz.txt”, 1) == 954.3687828517801

    best_velocity(“kilometraz.txt”, 0) == 11.282036056057358
    best_velocity(“kilometraz.txt”, 1) == 8.323550449696693

    solutions.group(“kilometraz.txt”, “RSIR_STRZELCE_OPOLSKIE”, 5.0, 10.0, 9) == [3,5,7,9,10,11]
    solutions.group(“kilometraz.txt”, “GDRC”, 5.0, 10.0, 9) == [54, 56, 59]

    solutions.competitions(“kilometraz.txt”, [5, 10, 15,20]) == [360, 46, 3, 417]
    solutions.competitions(“kilometraz.txt”, [5, 10, 20]) == [272, 95, 459]

  4. Czy te wyniki są aby na pewno dobre? Dokładność jest za duża. W pliku wejściowym nie ma tak dokładnych danych jak w wynikach…

  5. Bardzo dziękuję za uwagę, bo dzięki temu sprawdziłem wyniki jeszcze raz. Okazało się, że część wywołań dotyczyła jeszcze poprzedniej, za dużej wersji bazy danych, która początkowo pojawiła się na stronie. Teraz wyniki są już “aktualne”.

    Jeśli chodzi o dokładność, to jest to dodawanie liczb zmiennoprzecinkowych i zwykle należy spodziewać się takich niuansów (proszę np. spróbować sprawdzić wynik dodawania 0.1 i 0.0001). W związku z tym w zupełności wystarczy nam dokładność do powiedzmy trzech miejsc po przecinku.

  6. Proszę o zwrócenie również uwagi na pewne uściślenia w treści zadania. Pierwsze dotyczy tego, że wszystkie prędkości podajemy w km/h. Drugie tego, co się dzieje, kiedy kilka różnych dystansów jest równie preferowanych przez tego samego zawodnika.

  7. Nadal jest błąd w ostatnim zadaniu. 4 dystanse zwracają 3 liczby zainteresowań.

  8. Z jaką wersją Pythona ma być zgodny kod? Czy można użyć “with” do otwierania plików?

  9. Czy na pewno wyniki funkcji competitions są poprawne? Funkcja, którą napisałem daje bardzo podobne wyniki, ale nieznacznie przesunięte w górę (tj. więcej zawodników na dłuższych dystansach). Mogłem oczywiście popełnić gdzieś błąd któego nie widzę, jednak przykładowe wyniki są starsze niż uściślenie o wyborze dłuższych dystansów, więc wolę spytać.

  10. Co do wersji python’a to preferowana jest wersja 2.7 (której używamy na zajęciach).

    można używać with do otwierania plików
    BW

  11. Mam takie same wątpliwości jak Jędrzej, około piętnastu zawodników wybiera w mojej funkcji wyższe dystanse.

  12. @Wojtek, ja mam:
    competitions(db_f, [5, 10, 15, 20]) => [360, 46, 3, 417]
    competitions(db_f, [5, 10, 20]) => [272, 95, 459]

  13. Mają Panowie rację. Już zedytowałem. Dziękuję za zwrócenie uwagi. Jeśli chodzi o group, to dla łatwiejszego sprawdzania prosiłbym o posortowanie wyników. Nie możemy jednak obcinać za to punktów, bo w poleceniu nie było nic o sortowaniu. Przypominam o samodzielnym rozwiązywaniu zadań! Każde rozwiązanie będzie testowane pod względem “unikalności” kodu, więc ewentualne zapożyczenia raczej nie umkną naszej uwadze.

Leave a Reply

Your email address will not be published. Required fields are marked *