Декодирование длины выполнения - декомпрессионный Python - PullRequest
0 голосов
/ 08 мая 2019

Мне нужна помощь с декодированием RLE. Я хочу распаковать 03a10b05 @ в aaabbbbbbbbbb @@@@@, например. Как я могу решить это в Python? До сих пор я пытался импортировать re, выбирая определенные строки. Тем не менее, он не работает, когда я ставлю 03a12b, и он будет выводить aaa.

1 Ответ

0 голосов
/ 08 мая 2019

Хотя в вопросе отсутствуют ваши попытки (фрагменты кода), я все равно опубликую ответ.

Он основан на том факте, что вся закодированная строка доступна сразу.

code.py :

#!/usr/bin/env python3

import sys
import re


pat = re.compile("(\d{2}.)*?")


def decode(s):
    groups = (item for item in pat.findall(s) if item)
    #print(list(groups))  # @TODO - cfati: !!! Decommenting this, will result in empty string being returned !!!
    return "".join((group[-1] * int(group[:-1]) for group in groups))


def main():
    encoded_strings = [
        "03a10b05@",
        "03a12b"
    ]
    for encoded in encoded_strings:
        print("{:s}: {:s}".format(encoded, decode(encoded)))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
    print("Done.")

Примечания :

  • Использование [Python3.Docs]: re - Регулярное выражениеоперации разбивает строку на ( цифра символ - например, " 10b ") строковые группы
  • Затем для каждой группы строкон вычисляет свою декодированную строку путем умножения (последнего) символа на число, состоящее из 2 (предыдущих) цифр, и в конечном итоге объединяет все строки
  • Внимание : он опирается на входную строкубудучи правильно сформированным, это означает, что он будет игнорировать все свои части, которые не соответствуют (указанному выше) синтаксису группы

Вывод :

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q056031014]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

03a10b05@: aaabbbbbbbbbb@@@@@
03a12b: aaabbbbbbbbbbbb

Done.
...