【发布时间】:2020-03-13 18:01:19
【问题描述】:
我正在做以下编程练习:No musical。声明是:
在我的学校,每 4 年上演一场盛大的音乐剧。这表示 每个来到这所学校的学生都会看到一场音乐剧 在他们的 4 年逗留中只表演过一次。这并不总是 不过其他学校的情况。
对于给定的持续时间,音乐剧在此之后的间隔 执行,以及课程注册的持续时间,你能确定如何 许多年级没有在他们的学校演出音乐剧 学校? start_class 总是演出音乐剧。
例子:
no_musical(start_class= 2000, end_class= 2010,
music_performed_every = 5, duration_of_enrolment_in_school = 3) = 4说明:只有 2000 年级的学生可以观看音乐剧表演 2000 年。下一部音乐剧将在 2005 年举行,所以只有 2003 年的班级 他们的最后一年,2004 年是他们的第二年,2005 年是他们的第一年 年,去看看。下一部音乐剧将于 2010 年上映,因此只有 2008 年、2009 年和 2010 年的班级可以看到它。这给我们留下了 2001 年、2002 年、2006 年和 2007 年的班级,他们从未看过音乐剧, 一共4个班:(
注意:
In this kata, if duration of enrolment in school is, say, 4 years, members of a class that starts in 2000 will graduate in 2003, not2004 年。他们在学校的入学年限是 2000 年、2001 年、2002 年和 2003 年。(按照我们习惯使用“班级”一词的标准方式 of',他们将是 1999 年的班级,因为他们将在 2003 年毕业, 但我们在这里不这样做) 如示例中所示,范围是结束的。最后一节课也应考虑在内。 非常轻微的说明,我们假设学校里的所有学生实际上都会去看音乐剧——这对这个 kata 并不重要 反正。也就是说,我并不是一个真正的音乐人:-(
5 个样本测试,50 个随机测试。
祝你好运。
我们编写了以下 Python 代码:
import math
def no_musical(start_class, end_class, musical_performed_every, enrolment_duration):
print("start_class: ",start_class)
print("end_class: ",end_class)
print("musical_performed_every: ",musical_performed_every)
print("enrolment_duration: ",enrolment_duration)
if(start_class>=end_class): return 0
if(musical_performed_every==0): return end_class-start_class+1
if(enrolment_duration>musical_performed_every): return 0
allCourses=end_class-start_class
print("allCourses: ",allCourses)
numberOfMusicals=math.ceil((allCourses)/musical_performed_every)
print("numberOfMusicals: ",numberOfMusicals)
coursesWhichSeeMusical=numberOfMusicals*enrolment_duration
print("coursesWhichSeeMusical: ",coursesWhichSeeMusical)
coursesWhichNotSeeMusical=allCourses-coursesWhichSeeMusical
return 0 if coursesWhichNotSeeMusical<0 else coursesWhichNotSeeMusical
我们的代码在三个测试中没有给出预期的输出:
# Use test.describe (or Test.describe) to describe your test suite
test.describe("Musicals")
# What if the start and end year are the same?
test.assert_equals(no_musical(2000,2000,100,3), 0)
# What if the school does not do musicals?
test.assert_equals(no_musical(2000,3000,0,50), 1001)
# What if all the students get to see musicals?
test.assert_equals(no_musical(2000,2020,2,4), 0)
# But are you doing it right though?
test.assert_equals(no_musical(2000, 3000, 5, 2), 600)
test.assert_equals(no_musical(2000, 2010, 5, 3), 4)
#our code fails in this test, by 1 year
test.assert_equals(no_musical(2910, 3505, 4, 3), 149)
#our code fails in this test, by 2 years
test.assert_equals(no_musical(2483, 3309, 18, 2), 736)
#our code fails in this test, by 4 years
test.assert_equals(no_musical(2969, 3508, 17, 4), 415)
我们在最后三个测试中观察到以下痕迹:
开始类:2910 结束类:3505 music_performed_every: 4 enrolment_duration: 3 所有课程:595 音乐剧数量:149 音乐课程:447 148 应该等于 149
开始类:2483 结束类:3309 music_performed_every: 18 enrolment_duration: 2 所有课程:826 音乐剧数量:46 音乐课程:92 734 应该等于 736
start_class: 2969 结束类:3508 music_performed_every: 17 enrolment_duration: 4 所有课程:539 音乐剧数量:32 音乐课程:128 411 应该等于 415
我们已阅读:
我们如何调试这段代码?‽
【问题讨论】:
-
我们可以在每个
if之后插入print语句(带有有用的调试文本),这样我们就可以准确地看到这些失败案例在什么条件下触发。
标签: python algorithm debugging calculation