【问题标题】:Get number of years which an event is not done?获取事件未完成的年数?
【发布时间】: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, not

2004 年。他们在学校的入学年限是 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

我们已阅读:

我们如何调试这段代码?‽

【问题讨论】:

标签: python algorithm debugging calculation


【解决方案1】:

演出音乐剧的数量应该是班级年数除以音乐演出的频率,向下取整,而不是向上取整,所以改变:

numberOfMusicals=math.ceil((allCourses)/musical_performed_every)

到:

numberOfMusicals=math.floor((allCourses)/musical_performed_every)

或者简单地说:

numberOfMusicals = allCourses // musical_performed_every

您将通过除no_musical(2910, 3505, 4, 3) == 149 之外的所有测试,因为no_musical(2910, 3505, 4, 3) 返回151 而不是预期的149。但由于这与我的其他答案的结果相匹配,我会质疑这个特定的测试用例是否具有正确的期望值。

【讨论】:

    【解决方案2】:

    从逻辑上讲,该问题的字面意思是以下代码,它遍历所有班级年份并计算入学年份不在音乐剧表演年份的人数:

    def no_musical(start_class, end_class, musical_performed_every, enrollment_duration):
        return sum(
            not musical_performed_every or
            all(
                year + i not in range(start_class, end_class + 1, musical_performed_every) 
                for i in range(enrollment_duration)
            ) for year in range(start_class, end_class + 1)
        )
    

    通过以下测试:

    assert no_musical(2000,2000,100,3) == 0
    assert no_musical(2000,3000,0,50) == 1001
    assert no_musical(2000,2020,2,4) == 0
    assert no_musical(2000, 3000, 5, 2) == 600
    assert no_musical(2000, 2010, 5, 3) == 4
    assert no_musical(2483, 3309, 18, 2) == 736
    assert no_musical(2969, 3508, 17, 4) == 415
    

    但不是这个:

    assert no_musical(2910, 3505, 4, 3) == 149
    

    因为no_musical(2910, 3505, 4, 3) 会返回151

    我会质疑这个特定的测试用例是否具有正确的期望值。

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2022-01-05
      • 1970-01-01
      • 2013-12-10
      • 2021-04-08
      • 1970-01-01
      相关资源
      最近更新 更多