| #! /usr/bin/evn python | 
|   | 
| """ | 
| Programm zum Berechnen den Aufwand für das Selbststudium pro Woche in einem Semester. | 
|   | 
| Das Semester hat 15 Woche. | 
| Eine Doppelstunde (DS) entspricht 90 Minuten. Ein ECTS entspricht einen Aufwand von 30 Stunden. | 
| Eine Veranstaltung (Vorlesung, Übung, Tutorium) ist 2 DS. | 
| Die Vorlesungen in einem Semester werden in einer Text-Datei erfasst. Ein Template ist wie folgt: | 
|   | 
| ```txt | 
| #Name; ECTS; Veranstaltung pro Woche | 
| Programmierung 2; 5; 2 | 
| Mathematik 2; 5; 3 | 
| ``` | 
|   | 
| Usage: | 
|   | 
| $python effort_semester.py Vorlesungen.txt | 
|                  Vorlesung ECTS         V-Ü-T/Woche   Selbstudiumszeit pro Woche | 
|           Programmierung 2 5            2              <> | 
|               Mathematik 2 5            3              <> | 
| -------------------------------------------------------------------------------- | 
|                                                        <> | 
| """ | 
| import sys | 
| from typing import Final, Any | 
|   | 
| SEMESTER_LENGTH: Final[int] = 15  # 15 Woche pro Semester | 
| ECTS_EFFORT = 30  # 1 ECTS ~ 30 h | 
| DS = 1.5  # DS = Doppelstunde = 2 Unterrichtstunden | 
|   | 
|   | 
| def parse_line(line: str) -> tuple[str, float, float]: | 
|     line = line.strip() | 
|     line = [e.strip() for e in line.split(";")] | 
|     return line[0], float(line[1]), float(line[2]) | 
|   | 
|   | 
| def collect_lectures_from_file(lecture_filename:str) -> list[tuple[str, float, float]]: | 
|     # Your code here | 
|     lectures = [] | 
|     with open(lecture_filename) as file: | 
|         while line := file.readline(): | 
|             line = line.strip() | 
|             if line[0] != '#': | 
|                 line = parse_line(line) | 
|                 lectures.append( line ) | 
|     return lectures | 
|   | 
|   | 
| def lecture_effort(lecture: tuple[str, float, float]) -> float: | 
|     sum_effort = lecture[1] * ECTS_EFFORT | 
|     lecture_effort = SEMESTER_LENGTH * (lecture[2] * DS) | 
|     return (sum_effort - lecture_effort) / SEMESTER_LENGTH | 
|   | 
|   | 
| def compute_semester_effort(lectures: list[tuple[str, float, float]]) -> list[tuple[str, float, float, float]]: | 
|     effort = [ | 
|         (e[0], e[1], e[2], lecture_effort(e)) for e in lectures | 
|     ] | 
|     return effort | 
|   | 
|   | 
| def print_effort(effort: list[tuple[str, float, float, float]]) -> None: | 
|     header = ("Vorlesung", "ECTS", "V;U;T/Woche", "Aufwand/Woche") | 
|     max_char = len(header) | 
|     sep_width = 3 | 
|     sum_effort = 0 | 
|     for l in effort: | 
|         if (c := len(l[0])) > max_char: | 
|             max_char = c | 
|         sum_effort += l[-1] | 
|   | 
|     lecture_col_width = sep_width + max_char | 
|     ects_width = len(header[1]) | 
|     veranstaltung_col_width = len(header[2]) | 
|     effort_col_width = len(header[3]) | 
|   | 
|     def format_line(line: list[tuple[Any, Any, Any, Any]] ): | 
|         lecture = f"{line[0]}".rjust(lecture_col_width) | 
|         ects = f"{line[1]}".center(ects_width) | 
|         v = f"{line[2]}".center(veranstaltung_col_width) | 
|         e = f"{line[3]}".center(effort_col_width) | 
|         return f"{lecture}  {ects}  {v}  {e}" | 
|   | 
|     print(format_line(header)) | 
|     for l in effort: | 
|         print(format_line(l)) | 
|   | 
|     print(f"Summe: {sum_effort}") | 
|   | 
|   | 
| if __name__ == "__main__": | 
|     lecture_filename = sys.argv[1] | 
|     lectures = collect_lectures_from_file(lecture_filename) | 
|     print(lectures) | 
|     effort = compute_semester_effort(lectures) | 
|     #print(effort) | 
|     print_effort(effort) |