Hong-Phuc Bui
2024-05-15 7df20ac74520ea7cbb38152e14f8bc4e8fb125e5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#! /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
 
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:
    max_char = 0
    sep_width = 3
    sum_effort = 0
    for l in effort:
        if l := len(l[0]) > max_char:
            max_char = l
        sum_effort += l[-1]
 
    lecture_col_width = sep_width + max_char
    ects_width = len("ECTS") + 1
    veranstaltung_col_width = 5
    header = ("Vorlesung", "ECTS", "V;U;T/Woche", "Aufwand/Woche")
    for l in effort:
        lecture = l[0].rjust(lecture_col_width)
        ects = f"{l[1]}".ljust(ects_width)
        v = f"{l[2]}".rjust(veranstaltung_col_width)
        e = f"{l[3]}".rjust(veranstaltung_col_width)
        print(f"{lecture} {ects} {v} {e}")
    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)