Problem 1¶
Analyze the grades of the students.
Here’s an example of the data
111111004 5.0 5.0 6.0
111111005 3.75 3.0 4.0
111111006 4.5 2.25 4.0
Every line represents a grading of a student. It starts with her matriculation number, followed by space-delimited grades (between 1.0 and 6.0, floats). The grades correspond to lectures 1, 2 and 3, respectively.
Provide the function critical which accepts two arguments, bound1 and
bound2. The function lists all the students which have “critical” grades.
A student should appear only once in the list.
A student is “critical” if the grade for the first lecture is smaller-equal bound1
and the sum of the grades for the lecture 2 and 3 is smaller than bound2.
On the above example, critical(4, 8) gives:
111111005
Provide the function top which lists the students with the best grades. The
parameter limit determines the number of the “top” students. If the number of
students is less than limit, return the list of all the students.
A student should appear only once in the resulting list. The students are compared based on the sum of the grades in all the three lectures. If the sum of grades is equal for two students, the order in the list is undefined (i.e. does not matter).
On the above example, top(2) might return both the output:
111111004
111111005
and:
111111004
111111006
(Both outputs are valid.)
The parameter limit is always greater than 0. Both bound1 and bound2 are
expected in the range [0.0, 100.0].
Data:
List all possible grades. |
|
Provide a set of all possible grades. |
|
Express a grading entry for a student as a text. |
Classes:
|
Represent a grade in Swiss educational system. |
|
Represent the grading of a student. |
Functions:
|
Parse the grading entries given as |
|
List critical gradings among the |
|
Find the top |
- ALL_GRADES = [Decimal('1.00'), Decimal('1.25'), Decimal('1.50'), Decimal('1.75'), Decimal('2.00'), Decimal('2.25'), Decimal('2.50'), Decimal('2.75'), Decimal('3.00'), Decimal('3.25'), Decimal('3.50'), Decimal('3.75'), Decimal('4.00'), Decimal('4.25'), Decimal('4.50'), Decimal('4.75'), Decimal('5.00'), Decimal('5.25'), Decimal('5.50'), Decimal('5.75'), Decimal('6.00')]¶
List all possible grades.
- ALL_GRADES_SET = {Decimal('1.00'), Decimal('1.25'), Decimal('1.50'), Decimal('1.75'), Decimal('2.00'), Decimal('2.25'), Decimal('2.50'), Decimal('2.75'), Decimal('3.00'), Decimal('3.25'), Decimal('3.50'), Decimal('3.75'), Decimal('4.00'), Decimal('4.25'), Decimal('4.50'), Decimal('4.75'), Decimal('5.00'), Decimal('5.25'), Decimal('5.50'), Decimal('5.75'), Decimal('6.00')}¶
Provide a set of all possible grades.
- class Grade(value: Decimal)[source]¶
Represent a grade in Swiss educational system.
Methods:
__new__(cls, value)Enforce the grade properties on
value.__le__(other)Return
Trueifselfis smaller thanother.__add__(other)Add
selfandother.- static __new__(cls, value: Decimal) Grade[source]¶
Enforce the grade properties on
value.- Requires
not value.is_nan()value in ALL_GRADES_SET
- class Grading(identifier: str, grade1: Grade, grade2: Grade, grade3: Grade)[source]¶
Represent the grading of a student.
Methods:
__init__(identifier, grade1, grade2, grade3)Initialize with the given values.
Sum all grades of the student.
- GRADING_RE = re.compile('([a-zA-Z0-9]+) +(1.0|1.25|1.5|1.75|2.0|2.25|2.5|2.75|3.0|3.25|3.5|3.75|4.0|4.25|4.5|4.75|5.0|5.25|5.5|5.75|6.0) +(1.0|1.25|1.5|1.75|2.0|2.25|2.5|2.75|3.0|3.25|3.5|3.75|4.0|4.25|4.5|4.75|5.0|5.25|5.5|)¶
Express a grading entry for a student as a text.
Note
The function
re.Pattern.__repr__truncates at 200 characters so that the pattern in the docs (based on__repr__function) is possibly incorrect. See Python issue #13592.
- parse(lines: Lines) List[Grading][source]¶
Parse the grading entries given as
lines.- Requires
all(GRADING_RE.fullmatch(line) for line in lines)
- Ensures
len(result) == len(lines)( identifiers := [grading.identifier for grading in result], len(identifiers) == len(set(identifiers)), )[1]
(Unique identifiers)
- critical(gradings: List[Grading], bound1: Grade, bound2: Decimal) List[Grading][source]¶
List critical gradings among the
gradingsbased onbound1andbound2.Note that
bound1andbound2have special semantics. Please consult the text of the problem.- Requires
( identifiers := [grading.identifier for grading in gradings], len(identifiers) == len(set(identifiers)) )[1]
(Students appear only once)
- Ensures
( identifiers := [grading.identifier for grading in result], len(identifiers) == len(set(identifiers)) )[1]
(Students appear only once)
- top(gradings: List[Grading], limit: int) List[Grading][source]¶
Find the top
limitstudents among thegradings.- Requires
limit > 0( identifiers := [grading.identifier for grading in gradings], len(identifiers) == len(set(identifiers)) )[1]
(Students appear only once)
- Ensures
all( result[i].sum_grades() >= result[i + 1].sum_grades() for i in range(len(result) - 1) )
len(result) == min(limit, len(gradings))( identifiers := [grading.identifier for grading in result], len(identifiers) == len(set(identifiers)) )[1]
(Students appear only once)