Кодировщик принимает в качестве параметра (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.