Nobody Here
Moderate

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


 """Этот файл описывает алгоритм преобразования слов в простенькие "загадки" """
 
 # Таблица преобразования для русского:
 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т список