Nobody Here
Moderate

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками Юридические услуги. Круглосуточно
 Ваша оценка:

  """Этот файл описывает алгоритм преобразования слов в простенькие "загадки" """
  
  # Таблица преобразования для русского:
  TABLE_RU = {
   "а": [
   "алжирка",
   "нанаец",
   "штанга",
   "бумажник",
   "мускат",
   "успевающий",
   "высушка",
   "подкоска",
   "каверна",
   "араукария",
   ],
   "б": [
   "браво",
   "обварщик",
   "соболятник",
   "бум",
   "аба",
   "неудобство",
   "боцман",
   "бортник",
   "баржонка",
   "бандурист",
   ],
   "в": [
   "выжлятник",
   "ивнячок",
   "давнишнее",
   "развальца",
   "дериватор",
   "шлюзовик",
   "изголовок",
   "кактусовые",
   "вишневка",
   "волочение",
   ],
   "г": [
   "графление",
   "агреже",
   "пуговичник",
   "прогнатизм",
   "типография",
   "синергида",
   "пережог",
   "госзаем",
   "продналог",
   "гидравлик",
   ],
   "д": [
   "дельта",
   "вдовство",
   "подносчик",
   "трудовик",
   "осаждающие",
   "проездные",
   "серенада",
   "модем",
   "чудные",
   "диагональ",
   ],
   "е": [
   "ерник",
   "пестание",
   "время",
   "торец",
   "ударение",
   "напущение",
   "парфюмерия",
   "кельма",
   "церковь",
   "сочень",
   ],
   "ё": [
   "ерник",
   "пестание",
   "время",
   "торец",
   "ударение",
   "напущение",
   "парфюмерия",
   "кельма",
   "церковь",
   "сочень",
   ],
   "ж": [
   "жестик",
   "ожерельице",
   "пожарный",
   "прожитие",
   "кураж",
   "поблажка",
   "фюзеляж",
   "кряж",
   "железяка",
   "судоэкипаж",
   ],
   "з": [
   "затеска",
   "изостудия",
   "пазанок",
   "вмазка",
   "вырезчик",
   "провизия",
   "апофеоз",
   "заводцы",
   "западник",
   "затейница",
   ],
   "и": [
   "ископаемое",
   "кисловщик",
   "прирубание",
   "унция",
   "алтаист",
   "кальвиль",
   "крашение",
   "факельщик",
   "всевластие",
   "натиск",
   ],
   "й": [
   "йогурт",
   "айсор",
   "мойва",
   "крой",
   "жалейка",
   "тербий",
   "подкройка",
   "герундий",
   "ликоподий",
   "тройня",
   ],
   "к": [
   "клюка",
   "скалолаз",
   "секционные",
   "торк",
   "личико",
   "стрелка",
   "лавчонка",
   "отцепщик",
   "карамель",
   "микитки",
   ],
   "л": [
   "лисогон",
   "слюда",
   "шалость",
   "схоласт",
   "лава",
   "паскаль",
   "педучилище",
   "ласочка",
   "мяльня",
   "шаланда",
   ],
   "м": [
   "мореходец",
   "оморочка",
   "сумчатка",
   "олимпийцы",
   "приемочная",
   "уникум",
   "манжет",
   "аморит",
   "минотавр",
   "бумажка",
   ],
   "н": [
   "нереида",
   "анатоксин",
   "кинолента",
   "слоненок",
   "латинщина",
   "пестунья",
   "ополчение",
   "оковывание",
   "агент",
   "букан",
   ],
   "о": [
   "офортист",
   "повестушка",
   "японистика",
   "пародистка",
   "руссоист",
   "здравотдел",
   "реверсор",
   "софора",
   "дескриптор",
   "соаренда",
   ],
   "п": [
   "печка",
   "справщик",
   "успение",
   "крепостные",
   "склепщик",
   "плавь",
   "субтропик",
   "пародия",
   "поднятие",
   "полугодок",
   ],
   "р": [
   "размирье",
   "фрау",
   "фурштат",
   "микрокатор",
   "овчарник",
   "монография",
   "финишер",
   "брелок",
   "ветры",
   "перемет",
   ],
   "с": [
   "став",
   "осочка",
   "эос",
   "марсиане",
   "залысина",
   "сопор",
   "слиток",
   "бережность",
   "секретка",
   "собачонка",
   ],
   "т": [
   "тюль",
   "штоф",
   "автотуризм",
   "пустка",
   "креатура",
   "толпа",
   "талреп",
   "апеллянт",
   "трезубцы",
   "табунщица",
   ],
   "у": [
   "удочка",
   "кусачка",
   "огурцы",
   "получка",
   "подбутовка",
   "перегудка",
   "воркотун",
   "мураль",
   "субъект",
   "кукерсит",
   ],
   "ф": [
   "финикиянин",
   "сферосома",
   "цифровка",
   "сапфир",
   "сольфатар",
   "тартюф",
   "эллинофил",
   "фолишон",
   "фокстрот",
   "фазаненок",
   ],
   "х": [
   "халва",
   "схизма",
   "чехвал",
   "крохоборка",
   "замах",
   "цех",
   "трибрахий",
   "рохля",
   "техред",
   "хлыстание",
   ],
   "ц": [
   "цитатор",
   "сцеживание",
   "меценат",
   "биоцикл",
   "шприцовщик",
   "серница",
   "эвакуация",
   "духовидцы",
   "фельдшанцы",
   "черноморец",
   ],
   "ч": [
   "читаемое",
   "очищение",
   "зачинка",
   "проческа",
   "присчет",
   "бубличник",
   "поделочка",
   "перешеечек",
   "эмчээс",
   "рачение",
   ],
   "ш": [
   "штабелевка",
   "ушка",
   "пошлина",
   "пришелец",
   "старшиниха",
   "племяш",
   "замарашка",
   "старикашка",
   "шуточное",
   "шаблонщик",
   ],
   "щ": [
   "щавелинка",
   "ущелье",
   "мещаночка",
   "крещеный",
   "болящие",
   "поденщина",
   "опиловщик",
   "сущее",
   "шеища",
   "ломщик",
   ],
   "ъ": [
   None,
   "съедение",
   "объявитель",
   "подъездчик",
   "необъятное",
   "фотосъемка",
   "плодосъем",
   "отъем",
   "съезжие",
   "изъятие",
   ],
   "ы": [
   None,
   "выработка",
   "прыгание",
   "падымок",
   "безрыбица",
   "больные",
   "злаковые",
   "атаманцы",
   "переменные",
   "вышибала",
   ],
   "ь": [
   None,
   "льны",
   "альпинист",
   "тюль",
   "скольжение",
   "панель",
   "рявканье",
   "родитель",
   "ристатель",
   "пратикабль",
   ],
   "э": [
   "эмеритура",
   "аэрарий",
   "фуэте",
   "эрг",
   "эвен",
   "эсдек",
   "эфемер",
   "эксцесс",
   "эвдиалит",
   "аэродром",
   ],
   "ю": [
   "югер",
   "тюбик",
   "клюв",
   "горючесть",
   "вселюбовь",
   "люкс",
   "тюрбе",
   "люверс",
   "юбочница",
   "гюйс",
   ],
   "я": [
   "ясенец",
   "мясистость",
   "пояснение",
   "заряд",
   "дуплянка",
   "ковырялка",
   "ордалия",
   "традиция",
   "пультовая",
   "ориентация",
   ],
  }
  
  # Таблица преобразования для английского:
  TABLE_EN = {
   "a": [
   "actor",
   "madison",
   "plains",
   "pirates",
   "infrared",
   "neutral",
   "bolivia",
   "loans",
   "radical",
   "carrying",
   ],
   "b": [
   "bumper",
   "obtaining",
   "mobility",
   "symbols",
   "notebooks",
   "bikes",
   "border",
   "comparable",
   "tablet",
   "gabriel",
   ],
   "c": [
   "cos",
   "scuba",
   "duck",
   "specifies",
   "selections",
   "protocol",
   "car",
   "counter",
   "scratch",
   "challenge",
   ],
   "d": [
   "den",
   "idaho",
   "endangered",
   "sunday",
   "door",
   "listed",
   "granted",
   "surrounded",
   "dive",
   "round",
   ],
   "e": [
   "exposure",
   "seeks",
   "tue",
   "homeland",
   "tahoe",
   "jungle",
   "happiness",
   "inquiries",
   "generic",
   "webshots",
   ],
   "f": [
   "feel",
   "africa",
   "sofa",
   "wolf",
   "portfolio",
   "fault",
   "feb",
   "founder",
   "flashing",
   "festivals",
   ],
   "g": [
   "guy",
   "tgp",
   "rights",
   "stages",
   "insights",
   "glory",
   "knowing",
   "speaking",
   "stage",
   "graduates",
   ],
   "h": [
   "her",
   "whose",
   "enhance",
   "wichita",
   "stephen",
   "them",
   "choir",
   "charms",
   "honduras",
   "tooth",
   ],
   "i": [
   "includes",
   "ticket",
   "clip",
   "grain",
   "strain",
   "superior",
   "quotations",
   "bidder",
   "minimum",
   "discount",
   ],
   "j": [
   "justin",
   "ajar",
   "objective",
   "projector",
   "jeff",
   "jamie",
   "jay",
   "azerbaijan",
   "jack",
   "inkjet",
   ],
   "k": [
   "ken",
   "sku",
   "lakes",
   "pickup",
   "chuck",
   "ink",
   "nike",
   "bank",
   "hiking",
   "speak",
   ],
   "l": [
   "lean",
   "plants",
   "delete",
   "worlds",
   "royal",
   "marvel",
   "incomplete",
   "albert",
   "retrieval",
   "wesley",
   ],
   "m": [
   "myanmar",
   "impaired",
   "gamecube",
   "mlb",
   "mime",
   "statement",
   "basename",
   "message",
   "mercedes",
   "mud",
   ],
   "n": [
   "nut",
   "analyses",
   "rand",
   "earning",
   "grown",
   "alternate",
   "norway",
   "citations",
   "endless",
   "brown",
   ],
   "o": [
   "ours",
   "contracts",
   "trout",
   "secondary",
   "cursor",
   "post",
   "ports",
   "regulatory",
   "touring",
   "form",
   ],
   "p": [
   "peer",
   "upset",
   "repository",
   "pix",
   "play",
   "point",
   "pod",
   "parents",
   "planning",
   "publisher",
   ],
   "q": [
   "quest",
   "equally",
   "acquired",
   "cheque",
   "quad",
   "qatar",
   "qui",
   "quarter",
   "mysql",
   "equality",
   ],
   "r": [
   "ranges",
   "creations",
   "survey",
   "expressed",
   "donor",
   "authorized",
   "leather",
   "grades",
   "garage",
   "screens",
   ],
   "s": [
   "subtle",
   "assessing",
   "ads",
   "episodes",
   "sole",
   "samba",
   "casa",
   "operates",
   "locations",
   "generators",
   ],
   "t": [
   "tomorrow",
   "street",
   "extra",
   "arctic",
   "ringtone",
   "out",
   "soonest",
   "mart",
   "agreement",
   "chart",
   ],
   "u": [
   "user",
   "cube",
   "coupled",
   "samuel",
   "aud",
   "such",
   "pulse",
   "cursor",
   "surgeon",
   "visual",
   ],
   "v": [
   "videos",
   "evidence",
   "adverse",
   "proven",
   "vast",
   "visit",
   "van",
   "sensitive",
   "attractive",
   "leaves",
   ],
   "w": [
   "wire",
   "fwd",
   "newest",
   "grew",
   "well",
   "hollow",
   "rainbow",
   "webcams",
   "wishlist",
   "browse",
   ],
   "x": [
   "xbox",
   "extras",
   "lexus",
   "unix",
   "ext",
   "exit",
   "exams",
   "expect",
   "pix",
   "exciting",
   ],
   "y": [
   "your",
   "lycos",
   "style",
   "tokyo",
   "jerry",
   "binary",
   "geology",
   "probably",
   "territory",
   "difficulty",
   ],
   "z": [
   "zoo",
   "czech",
   "dozen",
   "frozen",
   "magazine",
   "mhz",
   "muze",
   "recognize",
   "suzuki",
   "gazette",
   ],
  }
  
  
  def encode_word(word_to_encode: str, exchange_table: dict[str, list[str]]) -> str:
   """Превращение слова в тэг-загадку. Сначала вычисляем индекс, как остаток от деления
   индекса буквы (начиная с 0) в исходном слове на 10. Букву заменяем словом из таблицы:
   ключом будет исходная буква, а индексом в таблице слов - полученный ранее индекс.
   По завершении "оборачиваем" загадку в тэг.
   Пример:
   >>> print(encode_word("мир", TABLE_RU))
  
   :param word_to_encode: Слово для кодирования
   :param exchange_table: Таблица соответствия буквы в определенной позиции и слова-замены
   :return:
   """
   encoded_parts = []
   original_indices_mod_10 = [(i % 10) for i, _ in enumerate(word_to_encode)]
  
   for i, char_original in enumerate(word_to_encode.lower()):
   if char_original not in exchange_table:
   encoded_parts.append(f"({char_original}?)") # Символ не из алфавита
   continue
  
   slot_to_use = original_indices_mod_10[i]
  
   code_word = exchange_table.get(char_original, [None] * 10)[slot_to_use]
  
   if code_word:
   encoded_parts.append(code_word)
   else:
   encoded_parts.append(f"({char_original}{slot_to_use}?)") # Слово не найдено
   riddle = "-".join(encoded_parts)
   return f''
  
  
  def decode_word(tag: str) -> str:
   """Расшифровка загадки, закодированной encode_word
   Буква с индексом N в декодированном слове это буква N-го кодового слова (счет с 0).
   Какая именно буква, определяется как остаток от деления (N % 10) на длину слова
   Пример:
   >>> decode_word('')
   мир
   :param tag: Тэг с загадкой (Например -> мир)
   :return:
   """
   riddle = tag[tag.rfind('riddle="') + len('riddle="') : tag.rfind('"')]
   words = riddle.split("-")
   decoded = ""
   for word_num, word in enumerate(words):
   index = (word_num % 10) % len(word)
   decoded += word[index]
  
   return decoded
  
  
  def batch_encode(
   words: list[str], exchange_table: dict[str, list[str]]
  ) -> dict[str, str]:
   """Массово зашифровать теги загадок
   Пример:
   >>> batch_encode(["мир", "труд", "май"], TABLE_RU)
   {'мир': '', 'труд': '', 'май': ''}
   :param words: слова для кодирования
   :param exchange_table: Таблица соответствия буквы в определенной позиции и слова-замены
   :return: словарь слово -> тэг с загадкой
   """
   encoded = {}
   for word in words:
   encoded[word] = encode_word(word, exchange_table)
   return encoded
  
  
  def batch_decode(tags: list[str]) -> dict[str, str]:
   """Массово расшифровать теги загадок
   Пример:
   >>> batch_decode(['', '', ''])
   {'': 'мир', '': 'труд', '': 'май'}
   :param tags: загадки
   :return: словарь загадка -> отгадка
   """
   decoded = {}
   for tag in tags:
   decoded[tag] = decode_word(tag)
   return decoded

 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"