Получить количество лет, которое событие не сделано? - PullRequest
0 голосов
/ 13 марта 2020

Я делаю следующее упражнение по программированию: Нет музыки . Утверждение таково:

В моей школе великий мюзикл исполняется каждые 4 года. Это означает, что каждый ученик, пришедший в эту школу, увидит мюзикл, исполненный ровно один раз за 4 года обучения. Однако в других школах это не всегда так.

За определенный промежуток времени, интервал, после которого исполняется мюзикл, и продолжительность зачисления в класс, вы можете определить, сколько лет в классе не было получить мюзикл в своей школе? Мюзикл всегда исполняется для начального класса.

Пример:

no_musical (start_class = 2000, end_class = 2010,
artistic_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 гг. (стандартным способом, которым мы привыкли к термину «класс»), это будет класс 1999 г., который они закончили в 2003 г., но мы делаем не делайте этого здесь) Как видно из примера, диапазон является конечным. Последний класс также должен быть учтен. Очень незначительное замечание, мы предполагаем, что все ученики в школе на самом деле go будут смотреть мюзикл - не что это важно для этого ката. Тем не менее, я не очень музыкальный человек: - (

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 : 92 734 должно равняться 736

start_class: 2969 end_class: 3508 music_performed_every: 17 enrolment_duration: 4 allCourses: 539 numberOfMusicals: 32 курсовКоторыеSeeMusical: 128 411 должны равняться 415

Мы прочитали:

1042 *

Рассчитать годы + месяцы + дни между двумя датами?

вычислить разницу между двумя datetime.date () даты в годах и месяцах

Как мы можем отладить этот код?‽

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Количество исполненных мюзиклов должно быть числом учебных лет, деленным на частоту музыкальных выступлений, округленную в меньшую сторону, а не в большую сторону, поэтому измените:

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. Но так как это соответствует результату моего другого ответа, я бы задал вопрос, имеет ли этот конкретный тестовый пример правильное ожидаемое значение для начала.

0 голосов
/ 13 марта 2020

Логически вопрос буквально переводится в следующий код, который перебирает все учебные годы и подсчитывает количество тех, чьи годы зачисления не соответствуют ни одному из лет исполнения мюзикла:

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.

Я бы спросил, если этот конкретный тестовый пример имеет правильное ожидаемое значение.

...