Отказ от ответственности: кодирование Левенштейна совершенно не связано с метрикой расстояния редактирования Левенштейна .
<Вставьте длинный рассказ о том, почему коды Левенштейна должны быть рассчитаны здесь.>
Код
Кодирование Левенштейна - это система присвоения двоичных кодов неотрицательным целым числам, которая сохраняет некоторую странную особенность вероятности, которая не имеет отношения к этой задаче. Мы будем обозначать этот код как 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
.JavaScript (ES6),
5452 байтаИзменить: Сохранено 2 байта благодаря @Arnauld.
источник
replace(1,...
вместоreplace(/1/,...
=> 52 байтаPyth, 12 байт
демонстрация
(В
y
конце, чтобы запустить результирующую функцию на входе)Объяснение:
источник
SQF, 110
Рекурсивная функция:
Звоните как:
[NUMBER] call f
Обратите внимание, что это на самом деле не работает для 87654321 или других больших чисел из-за ошибки в двигателе ArmA. Хотя это, вероятно, будет исправлено в ближайшее время, и должно работать в соответствии со спецификацией.
( Этот билет здесь )
источник
PHP,
116114 байтВведите число в качестве первого аргумента.
Обновить:
strlen($b)-1
на~~log10($b)
(наконец-то понятно, почему все остальные используют логарифм) и другого путем конкатенации по-другому.источник
Рубин, 38 байт
Очень похоже на ответ Нейла на JavaScript .
Смотрите его на repl.it: https://repl.it/CnhQ
источник
Java 8 (полная программа),
257249 байтЧитаемая версия с объяснением (в основном это просто рекурсия):
РЕДАКТИРОВАТЬ 1 : Сохранено 8 байтов : первый символ двоичной строки всегда 1; следовательно, вместо использования
s.charAt(0)
, лучший вариант просто"1"
.источник