Advertisement
AlexG2230954

task 1

Oct 8th, 2023
984
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.47 KB | Source Code | 0 0
  1. from typing import Container, Iterable
  2. import string
  3. import re
  4.  
  5.  
  6. def normalize_word(word: str) -> str:
  7.     """
  8.    Нормализует строку к единому формату.
  9.    note: использую next(..., ''), чтобы функция не райзила IndexError
  10.    """
  11.     return next(re.findall('[a-zA-Z]+', word.lower()), '')
  12.  
  13.  
  14. def check_word(word: str, dictionary: Container[str]) -> bool:
  15.     """Проверка, что слово принадлежит словарю"""
  16.     normalized_word = normalize_word(word)
  17.     return normalized_word in dictionary
  18.  
  19.  
  20. def create_dictionary(words: Iterable[str]) -> Container[str]:
  21.     """Создает словарь на основе слов, пришедших на вход"""
  22.     return set(map(normalize_word, words))
  23.  
  24.  
  25. def tokenize_text(text: str):
  26.     """
  27.    Токенизирует текст. Нужно было с той целью, чтобы избавиться от лишних
  28.    деталей в тексте: к примеру, излишняя вариация "ненужных" символов ',', '.' и т.д.
  29.    
  30.    Токен может быть двух типов:
  31.    1. word - описывает некоторое слово в тексте. Представлен как ['word', <word-value>]
  32.    2. separator - описывает подстроку, которая является разделителем между словами.
  33.    Представлен как ['separator', <separator-chars-amount>]
  34.    """
  35.    
  36.     tokens = [['separator', 0]]
  37.  
  38.     for char in text:
  39.         if char in string.ascii_letters:
  40.             if tokens[-1][0] == 'word':
  41.                 tokens[-1][1] += char
  42.             else:
  43.                 tokens.append(['word', char])
  44.         else:
  45.             if tokens[-1][0] == 'separator':
  46.                 tokens[-1][1] += 1
  47.             else:
  48.                 tokens.append(['separator', 1])
  49.  
  50.     return tokens
  51.  
  52.  
  53. def check_text(tokens, dictionary):
  54.     """
  55.    Проверка всего текста на орфографию. На вход приходят токены, на которые был
  56.    разбит текст, и словарь.
  57.    
  58.    Возвращаемое значение - список, состоящий из блоков с результатами проверки.
  59.    Каждый блок состоит из двух элементов:
  60.    1. Результат проверки
  61.    2. Количество символов, которые были проверены
  62.    """
  63.    
  64.     checked = []
  65.  
  66.     for token_type, token_value in tokens:
  67.         if token_type == 'word':
  68.             check_result = check_word(token_value, dictionary)
  69.             checked.append((check_result, len(token_value)))
  70.         else:
  71.             checked.append((True, token_value))
  72.  
  73.     return checked
  74.  
  75.  
  76. def render_check_result(result):
  77.     """Репрезентация результатов проверки в формат, требующийся в задании"""
  78.     repr_symbols = ['~', '.']
  79.     return ''.join(repr_symbols[is_correct] * length for is_correct, length in result)
  80.  
  81.  
  82. def main():
  83.     text = input()
  84.     words = (input() for _ in range(int(input())))
  85.     dictionary = create_dictionary(words)
  86.     tokens = tokenize_text(text)
  87.     check_result = check_text(tokens, dictionary)
  88.  
  89.     print(text)
  90.     print(render_check_result(check_result))
  91.  
  92.  
  93. if __name__ == "__main__":
  94.     main()
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement