Необходимость специального c алгоритма для кодировщика / декодера, который не производит конфликтующих значений - PullRequest
0 голосов
/ 06 августа 2020

Кодировщик принимает в качестве параметра (l) список целых чисел от 0 до N, длина этого списка не может превышать N значений (len(l) <= N).

Создает список (r) уникальных значений. Каждое значение в этом списке является целым числом от 0 до N и уникально в списке в python: len(set(r)) == len(r).

Трудность в том, что результирующий список должен иметь длину, равную длине списка ввода (len(l) == len(r)).

Я ищу кодировщик, который может кодировать списки с длиной, наиболее близкой к N. Я сделал кодировщик, который принимает список со средней длиной N / 4 (25 % от N), но мне нужно не менее 50% (или больше).

Мой кодировщик 25%, в python:

def encode(l, N):
    size = N // 2

    vals = list(range(size))
    r = []

    for i in l:
        idx = i % len(vals)

        v = vals[idx]
        if i > len(vals):
            v += size

        r.append(v)

        del vals[idx]

    return r

С его декодером:

def decode(l, N):
    size = N // 2

    vals = list(range(size))
    r = []

    for i in l:
        after = i >= size

        if after:
            i -= size

        v = vals.index(i)
        idx = v
        if after:
            v += len(vals)

        r.append(v)

        del vals[idx]

    return r

И функция, которая проверяет закодированный список:

def check(l, N):
    cod = encode(l, N)
    sz = len(cod)

    if sz > len(l):
        raise Exception('The length of the encoded list can exceed the len of the input list')

    if sz != len(set(cod)):
        raise Exception('The values are not unique')

    if decode(cod, N) != l:
        raise Exception('The decoded list is wrong')

Примечание: Даже если я использовал Python в примере, это не язык для этого топи c. Я принимаю все языки с императивной парадигмой (C / C ++, C#, R, Java, Go, Rust, Perl, Bash, et c.), Без параллельной парадигмы, такой как ErLang, и никакого чистого функционального языка, такого как Lisp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...