Advertisement
Mancolo

Untitled

May 12th, 2023
1,063
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.29 KB | None | 0 0
  1. import re
  2. from collections import defaultdict, Counter
  3. from typing import Dict, List
  4.  
  5.  
  6. def create_symbols(word):
  7.     return ''.join(filter(str.isalpha, word))
  8.  
  9.  
  10. def match_words(words: list, reg: str) -> list:
  11.     return [w for w in words if re.match(reg, w)]
  12.  
  13.  
  14. def count_words(text: str) -> tuple:
  15.     words = [create_symbols(w) for w in text.lower().split()]
  16.     word_dict = defaultdict(lambda: defaultdict(int))
  17.     tot = len(words)
  18.     for word in words:
  19.         word_dict[len(word)][word] += 1
  20.  
  21.     for k, words_same_size in word_dict.items():
  22.         for j, count in words_same_size.items():
  23.             word_dict[k][j] = count / (tot * 0.01)
  24.  
  25.         word_dict[k] = sorted(word_dict[k].items(), key=lambda x: -x[1])
  26.  
  27.     return word_dict, set(words)
  28.  
  29.  
  30. def count_chars(s: str) -> list:
  31.     s = s.lower()
  32.     d = Counter(filter(str.isalpha, s))
  33.     tot = sum(d.values())
  34.  
  35.     for k, v in d.items():
  36.         d[k] = v / (tot * 0.01)
  37.  
  38.     return sorted(d.items(), key=lambda x: -x[1])
  39.  
  40.  
  41. def is_checkable(word: str, key: Dict[str, str]) -> bool:
  42.     return any(key[k] is not None and k in word for k in key)
  43.  
  44.  
  45. def get_unknown_chars(key: Dict[str, str]) -> str:
  46.     alph = 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнҢңОоөПпРрСсТтУуҮүФфХхЧчШшЩщЪъЫыЬьЭэЮюЯя'
  47.     return ''.join(c for c in alph if c not in key.values())
  48.  
  49.  
  50.  
  51. def get_unknown_keys(key: Dict[str, str]) -> str:
  52.     return ''.join(c for c in key if key[c] is None)
  53.  
  54.  
  55. def check_pattern(match: str, word: str) -> bool:
  56.     return all((match[i] == match[j]) == (word[i] == word[j]) for i in range(len(word) - 1) for j in range(i, len(word)))
  57.  
  58.  
  59. def generate_pattern(word: str, key: Dict[str, str], counted_encoding_chars: List[List[str]]) -> str:
  60.     reg = ''
  61.     for s in word:
  62.         if s in key.values():
  63.             reg += list(key.keys())[list(key.values()).index(s)]
  64.         elif s in 'нкы':
  65.             reg += f'[{"".join(c[0] for c in counted_encoding_chars[1:4])}]'
  66.         else:
  67.             reg += f'[{get_unknown_keys(key)}]'
  68.  
  69.     return reg + '$'
  70.  
  71.  
  72.  
  73.  
  74. def main():
  75.     encoded_text = open('input.txt', 'r', encoding='UTF-8').read()
  76.     sample_text = open('Manas-eposu-2010-S-Karalaev.txt', 'r', encoding='UTF-8').read().replace(
  77.         'www.el-sozduk.kg', '')
  78.  
  79.     counted_chars = count_chars(sample_text)
  80.     counted_encoding_chars = count_chars(encoded_text)
  81.  
  82.     _, encoded_words = count_words(encoded_text)
  83.     _, sample_words = count_words(sample_text)
  84.  
  85.  
  86.     counted_encoding_chars_dict = dict(counted_encoding_chars)
  87.     counted_chars_dict = dict(counted_chars)
  88.  
  89.     key = dict()
  90.     for ec in counted_encoding_chars:
  91.         key[ec[0]] = None
  92.  
  93.     most_common_char = max(counted_chars_dict, key=counted_chars_dict.get)
  94.     key[counted_encoding_chars[0][0]] = most_common_char
  95.  
  96.     print(counted_chars)
  97.     print(counted_encoding_chars)
  98.  
  99.     unknown_chars = ''.join([c[0] for c in counted_chars[2:]])
  100.  
  101.     print(unknown_chars)
  102.  
  103.     while all(map(lambda x: x is not None, key.keys())):
  104.         print(key)
  105.  
  106.         examples = []
  107.  
  108.         for word in encoded_words:
  109.             if is_checkable(word, key):
  110.                 reg = ''
  111.  
  112.                 for s in word:
  113.                     if key.get(s, None) is None:
  114.                         reg += f'[{get_unknown_chars(key)}]'
  115.                     else:
  116.                         reg += key[s]
  117.  
  118.                 reg += '$'
  119.  
  120.                 matches = match_words(sample_words, reg)
  121.                 if word == 'лңк':
  122.                     print(matches, reg)
  123.                 matches = list(filter(lambda x: check_pattern(x, word), matches))
  124.  
  125.  
  126.  
  127.                 if len(matches) == 1 and any(map(lambda s: s not in key.values(), matches[0])):
  128.                     err = 0.0
  129.                     is_valid = True
  130.  
  131.                     for i in range(len(matches[0])):
  132.                         if key[word[i]] is None:
  133.                             err += abs(
  134.                                 counted_encoding_chars_dict[word[i]] * 1.0 / counted_chars_dict[matches[0][i]] - 1)
  135.  
  136.                             if matches[0][i] in list(key.values()):
  137.                                 is_valid = False
  138.                                 break
  139.  
  140.                     if is_valid:
  141.                         examples.append((word, matches[0], err / len(word)))
  142.  
  143.         if len(examples) == 0:
  144.             break
  145.  
  146.         examples.sort(key=lambda x: x[2])
  147.  
  148.         new_letters = 0
  149.         new_words = 0
  150.  
  151.         for example in examples:
  152.             new_words += 1
  153.             for i in range(len(example[0])):
  154.                 if key[example[0][i]] is None:
  155.                     key[example[0][i]] = example[1][i]
  156.                     new_letters += 1
  157.             if new_words > 8 and new_letters > 5:
  158.                 break
  159.  
  160.         print(examples[0])
  161.  
  162.     text = ''
  163.  
  164.     for w in encoded_text:
  165.         w = w.lower()
  166.         if w.isalpha():
  167.             text += key[w] if key.get(w, None) is not None else 'X'
  168.         else:
  169.             text += w
  170.  
  171.     while True:
  172.         print(key)
  173.  
  174.         char_to_replace = input("Введите символ, который нужно заменить (или нажмите Enter для продолжения): ")
  175.  
  176.         if not char_to_replace:
  177.             break
  178.  
  179.         if char_to_replace in key:
  180.             # Запрос у пользователя на новый символ
  181.             new_char = input(f"Введите новое значение для символа '{char_to_replace}': ")
  182.             key[char_to_replace] = new_char
  183.  
  184.             # Обновление текста с новым ключом
  185.             new_text = ''
  186.             for w in encoded_text:
  187.                 w = w.lower()
  188.                 if w.isalpha():
  189.                     new_text += key[w] if key.get(w, None) is not None else 'X'
  190.                 else:
  191.                     new_text += w
  192.             text = new_text
  193.  
  194.             # Вывод текста с новым ключом
  195.             print("After decode\n")
  196.             print(text)
  197.  
  198.     print("Before decode\n")
  199.     with open('input.txt', 'r', encoding='UTF-8') as file:
  200.         content = file.read()
  201.         print(content)
  202.  
  203.     print("Final decode\n")
  204.     print(text)
  205.  
  206.  
  207. if __name__ == '__main__':
  208.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement