Отказ от ответственности: кодирование Левенштейна совершенно не связано с метрикой расстояния редактирования Левенштейна .
<Вставьте длинный рассказ о том, почему коды Левенштейна должны быть рассчитаны здесь.>
Код
Кодирование Левенштейна - это система присвоения двоичных кодов неотрицательным целым числам, которая сохраняет некоторую странную особенность вероятности, которая не имеет отношения к этой задаче. Мы будем обозначать этот код как L ( n ). Википедия описывает это как пятиступенчатый процесс:
- Инициализируйте переменную количества шагов C до 1.
- Запишите двоичное представление числа, не приводя
1
к началу кода. - Пусть M будет количеством битов, записанных на шаге 2.
- Если M не равно 0, увеличьте C , повторите с шага 2 с M в качестве нового номера.
- Запишите биты C
1
и a0
в начало кода.
Тем не менее, код также может быть описан рекурсивно:
- Если число 0, то его код
0
. - Запишите двоичное представление числа, не приводя
1
к началу кода. - Пусть M будет количеством битов, записанных на шаге 2.
- Напишите L ( M ) в начале кода.
- Напиши
1
немного в начало кода.
Для тех, кто предпочитает примеры, вот рекурсивный процесс для L (87654321) с обозначением конкатенации:
Соревнование
Напишите программу или функцию, которая, учитывая число n , выводит цепочку битов L ( n ) в любом приемлемом формате (это включает в себя возврат числа с указанными битами). Стандартные лазейки, как всегда, запрещены.
Примеры
Входные данные: 5
Вывод: 1110001
Входные данные: 30
Вывод: 111100001110
Входные данные: 87654321
Вывод: 111110000101001001110010111111110110001
Входные данные: 0
Вывод: 0
±
вместо функцииf
.