import pyfmi.testcase import unittest points = 5 def higher_gpa_nolimit(courses, beat_me): counts = {} sums = {} for course in courses: for fn in course: counts[fn] = counts.get(fn, 0) + 1 sums[fn] = sums.get(fn, 0) + course[fn] res = [] for fn in sums: if float(sums[fn])/counts[fn] > beat_me: res += [fn] return res class ProblemTests(pyfmi.testcase.TestCase): def assertHigherGPA(self, fns, courses, beat_me, limit=10): all = higher_gpa_nolimit(courses, beat_me) self.assertEqual(min(limit, len(all)), len(fns)) self.assertTrue(set(fns).issubset(set(all))) def test_1_limit(self): beat_me = 4.0 limit = 1 courses = [ {'43600': 5, 'M2100': 4}, {'M2100': 5, '43600': 3}, {'5111': 6}, ] self.assertHigherGPA(self.user.higher_gpa(courses, beat_me, limit), courses, beat_me, limit) def test_2_empty_negative(self): beat_me = -2.0 courses = [] self.assertEqual([], self.user.higher_gpa(courses, beat_me)) def test_3_fail_80246(self): beat_me = 4.2777777777777769 marks = [3, 5, 2, 5, 6, 4, 6, 5, 6, 5, 3, 6, 4, 3, 4, 2, 5, 3] courses = map(lambda x: {'43600': x}, marks) self.assertHigherGPA(self.user.higher_gpa(courses, beat_me), courses, beat_me) def test_4_not_in_all_courses(self): beat_me = 4.1 courses = [ {'43600': 6, '43967': 6, }, {'43967': 5}, {}, {'baba': 3, 'dyado': 4}, ] self.assertHigherGPA(self.user.higher_gpa(courses, beat_me), courses, beat_me) def test_5_empty_result(self): beat_me = 5.5 courses = [ {'43600': 5, '43967': 6, }, {'43967': 5}, {'baba': 3, 'dyado': 4}, ] self.assertHigherGPA(self.user.higher_gpa(courses, beat_me), courses, beat_me) if __name__ == '__main__': ProblemTests.user_filename = 'p1.py'; unittest.main()