# Домашняя работа по задаче 2.4 курса Python 3

# Задача 2.4. (Условия)

# Пункт A.
# Напишите функцию, которая удаляет все восклицательные знаки из заданной строк.
# Например,
# foo("Hi! Hello!") -> "Hi Hello"
# foo("") -> ""
# foo("Oh, no!!!") -> "Oh, no"

# def remove_exclamation_marks(s):
#     pass


# Пункт B.
# Удалите восклицательный знак из конца строки. 
# remove("Hi!") == "Hi"
# remove("Hi!!!") == "Hi!!"
# remove("!Hi") == "!Hi"

# def remove_last_em(s):
#     pass


# Дополнительно

# Пункт С.
# Удалите слова из предложения, если они содержат ровно один восклицательный знак.
# Слова разделены одним пробелом.
# Например,
# remove("Hi!") === ""
# remove("Hi! Hi!") === ""
# remove("Hi! Hi! Hi!") === ""
# remove("Hi Hi! Hi!") === "Hi"
# remove("Hi! !Hi Hi!") === ""
# remove("Hi! Hi!! Hi!") === "Hi!!"
# remove("Hi! !Hi! Hi!") === "!Hi!"

# def remove_word_with_one_em(s):
#     pass

print('\n') # Пустая строка для разделения вывода в консоли

# Напишем проверочный текст (в переменную)
text = '! Это - п!роверочный текст, для! !проверки !работы! ф-й дл!я удаления восклицательных!! знаков!!!'
print('Полный текст для сравнения с результатами:', '\n\n', text) # Для наглядности выведем его в консоль



# Решение п.А.
print('\n', 'Решение А. (убраны все "!")') # Пустая строка для разделения вывода в консоли


def remove_exclamation_marks(text: str) -> str:
    '''Удаляет все "!" из строки'''
    
    return text.replace('!', '') 


# Проверка работы ф-и (п. А.)
print(remove_exclamation_marks(text))



# Решение п.B.
print('\n', 'Решение B. (убран последний "!")') # Пустая строка для разделения вывода в консоли


def remove_last_em(text: str) -> str:
    '''Убирает "!" в конце строки, если он есть.'''
    
    if text[-1] == "!":
        return text[:-1]
    else:
        return text


# Проверка работы ф-и (п. А.)
print(remove_last_em(text))



# Решение 2. п.C. 
# Т.к. после Решения 1 я сообразил, что Сплит делает именно список,
# Подумал, что сразу через него будет короче. Ошибся :).
# Решил, что надо как-то иначе написать код (чтобы не повторять Решение 1 по структуре)
print('\n', 'Решение C2. (убраны все слова с 1 "!")') # Пустая строка для разделения вывода в консоли


def remove_word_with_one_em(text: str) -> str:
    '''Удаляет слово из строки если оно содержит ровно один "!"'''

    word_list = text.split(' ') # получаем текст в виде списка слов.
    word_count = len(word_list) # определяем максимальное кол-во слов
    count = 0 # счетчик слов
    while count < word_count: # проходим по каждому слову в тексте
        symbol_count = 0 # задаем счетчик для "!"
        word = word_list[count] # получаем каждое слово для проверки
        for letter in range(len(word)): # Проходим по каждому символу слова
            if word[letter] == '!': symbol_count +=1 # Считаем "!"
        
        if symbol_count == 1: 
            del word_list[count] # удаляем слово из списка по условию
            word_count -= 1 # уменьшаем кол-во слов в списке
            count -= 1 # т.к. индекс должен остаться прежним при удалении элемента
        
        count += 1
      
    return ' '.join(word_list)
    

# Проверка Решения 2. п.С
print(remove_word_with_one_em(text))

# Конец проверки. Конец Решения 2.



# Решение 3. п.C.
# Оптимизированное Решение 1. (через enumerate) [меньше строк и действий]
# И сразу ч-з 1 список, не прописывая каждый раз все через split 
print('\n', 'Решение C3. (убраны все слова с 1 "!")') # Пустая строка для разделения вывода в консоли


def _remove_word_with_one_em(text: str) -> str:
    '''Удаляет слово из строки если оно содержит ровно один "!"'''

    new_text = '' # будущая возвращенная строка
    word_list = text.split(' ') # получаем текст в виде списка слов.
    for word in word_list: # проходим по каждому слову в тексте (списке)
        symbol_count = 0 # задаем счетчик для "!"
        for letter in range(len(word)): # Проходим по каждому символу слова
            if word[letter] == '!': symbol_count +=1 # Считаем "!"
        if symbol_count != 1: new_text += word + ' ' # собираем текст заново
    return new_text.strip(' ') # С удалением последнего пробела


# Проверка решения 3. п.С
print(_remove_word_with_one_em(text))

# Конец решения 3.


print('\n') # Пустая строка для разделения вывода в консоли
