Как исправить все тестовые примеры для кода classifyStrings на codesignal python?

Итак, мне задали этот вопрос: вы делите строки на три типа: хорошие, плохие или смешанные. Если в строке есть 3 последовательных гласных или 5 последовательных согласных, или и то, и другое, то она классифицируется как плохая. В противном случае он классифицируется как хороший. Гласные в английском алфавите — это [a, e, i, o, u], а все остальные буквы — согласные.

Строка также может содержать символ ?, который может быть заменен как гласной, так и согласной. Это означает, что строка ?aa может быть плохой, если ? является гласным или хорошо, если это согласный. Этот тип строки относится к категории смешанных.

Это код, который я создал до сих пор:

def classifyStrings(s):
    l = list(s)
    numberofvowels = 0
    numberofconsonants = 0
    punctuationpresent = False
    for i in l:
        if i == "a" or "e" or "i" or "o" or "u":
            numberofvowels += 1
        else:
            numberofconsonants += 1
    if numberofvowels >= 3 or numberofconsonants >=5 and i != '?':
        return "bad"
    else:
        return "good"
        if i in l == "?":
            punctuationpresent = True
            return "mixed"

Пока мне удалось пройти 5/17 тестовых случаев. Я не уверен, как улучшить этот код, чтобы пройти все тестовые случаи. Основные проблемы, которые я должен исправить: вопросительный знак между гласными или согласными, например. a?a, согласные между гласными, например. аба, гласные между согласными, напр. баб


person Iman.G    schedule 09.03.2021    source источник
comment
if i == "a" or "e" or "i" or "o" or "u": не является правильным способом сравнения нескольких значений. Используйте if i == "a" or i == "e" or i == "i" or i == "o" or i == "u":. Или короче: if i in "aeiou":   -  person Johnny Mopp    schedule 09.03.2021
comment
Кроме того, return "good" делает недоступным весь код под ним.   -  person Johnny Mopp    schedule 09.03.2021
comment
Смешанная строка неясна. Любая строка с ? в нем помечаются как смешанные? Или вы должны заменить ? с гласной или согласной?   -  person Johnny Mopp    schedule 09.03.2021


Ответы (1)


Примечание. Подумав об этом за ночь, я определил еще несколько тестовых случаев, и в результате потребовалось дальнейшее изменение решения. как показано ниже: Вот подход, который, кажется, подходит для всех случаев:

def classifyStrings(s):
    vowels = 'aeiou'
    max_vowels = 3
    max_consonants = 5
    vowel_count = 0
    consonant_count = 0
    punctuation_present = False
for i in range(len(s)):
    if s[i] == '?':
        punctuation_present = True
    elif s[i].lower() in vowels:
        if punctuation_present and i> 0 and vowel_count == 0 and s[i-1] != '?':
            punctuation_present = False
        vowel_count += 1
        consonant_count = 0        
    else:
        if punctuation_present and i> 0 and consonant_count == 0 and s[i-1] != '?':
            punctuation_present = False
        consonant_count += 1
        vowel_count = 0
    if vowel_count == max_vowels  or consonant_count == max_consonants:
        return 'bad'
    else:
        if punctuation_present and (vowel_count == max_vowels -1 or consonant_count == max_consonants-1):
            return 'mixed'

return 'good'    

Учитывая серию тестовых случаев:

test_cases = {"good": ['aabbccee', 'bbbbaaddd', 'eeffffeffffiig', 'a?bbdu', 'a?deffff', 'f?ekkii'],
             'bad':['ooobbbddbee','eeebb', 'eedgfkjii', 'kelyzzccbb', 'a?deffffg','f?ekkiii'],
             'mixed':['iipp?hhoo', 'hjkie?drte', 'o?aekee']}

Бег:

for k, sl in test_cases.items():
    print(f'Testing {k} cases')
    for s in sl:
        print(f'\tResults: {classifyStrings(s)}')  

Урожайность:

Testing good cases
    Results: good
    Results: good
    Results: good
    Results: good
    Results: good
    Results: good
Testing bad cases
    Results: bad
    Results: bad
    Results: bad
    Results: bad
    Results: bad
    Results: bad
Testing mixed cases
    Results: mixed
    Results: mixed
    Results: mixed
person itprorh66    schedule 09.03.2021
comment
Я намеренно сделал такой отступ. Большое спасибо за помощь, но когда я запустил его, используя ваш код, он переключился на 2/17 тестовых случаев, ха-ха. Но я очень ценю это, несмотря ни на что! - person Iman.G; 10.03.2021
comment
@Iman.G Я предоставил обновленное решение, которое охватывает все тестовые примеры, которые я могу придумать, если у вас есть дополнительные тестовые примеры, которые не проходят, дайте мне знать. - person itprorh66; 11.03.2021
comment
Хия, большое спасибо за помощь! Я попробовал вашу предыдущую версию, и она увеличилась до 10/17 случаев, и я забыл поблагодарить вас! Когда я попробовал вашу обновленную версию, она продолжала давать мне s не определено в цикле for. Я очень ценю все, что вы сделали до сих пор! - person Iman.G; 12.03.2021
comment
Как определено в функции, s — это имя переменной, используемой функцией. Если вы получаете сообщение об ошибке, вы неправильно скопировали функцию или неправильно ее вызываете. - person itprorh66; 15.03.2021