Переменное число битов - это массив из 0 или более битов. Так [0, 1]
же, как и переменное число битов, но это так []
.
Напишите функцию или программу, которая, учитывая неотрицательное целое число, возвращает переменное число битов, так что каждое целое число имеет однозначное (биективное) отображение с массивом.
Существует бесконечное количество таких отображений, вы можете создавать их по своему усмотрению, но они должны быть взаимно однозначными. Ваше отображение должно быть концептуально однозначным для целого числа произвольного размера, но это нормально, если ваша реализация терпит неудачу для больших целых чисел из-за числовых ограничений типов в вашем предпочтительном языке (например, C int
).
В качестве примера того, что не является взаимно-однозначным отображением, просто перечисляем двоичные цифры целого числа. В такой системе 5 становится [1, 0, 1]
(или 0b101
), но это не один к одному, потому что 0b0101
или [0, 1, 0, 1]
также означает 5.
Должно быть совершенно очевидно, что отображение не является взаимно однозначным, если оно пропускает целое число (например, оно не работает для 5), но я хотел бы прояснить, что пропуск массива переменных битов также не -к одному. Вы должны отобразить все возможные переменные битовые массивы, в том числе []
.
Самый короткий код в байтах побеждает.
Ответы:
Желе, 3 байта
Та же идея, что и у xnor: отображается
0 1 2 3 4 ...
на[] [0] [1] [0 0] [0 1] ...
; код в основномincrement → binary → remove first
.Попробуйте это онлайн .
источник
Python, 20 байт
Тест:
Выполнение
lambda n:bin(n+1)[3:]
увеличивает входные данные, затем принимает двоичное представление с удаленным первым символом ([3:]
потому что префикс0b
состоит из двух символов). Поскольку любое положительное число начинается с 1 в двоичном виде, это однозначно дает двоичное представление.Байт сохраняется вместо использования битового дополнения
~n
для получения отрицания-(n+1)
и удаления отрицательного знака путем обрезания еще одного символа.источник
lambda s:int('1'+s,2)-1
.Pyth, 5 байт
Просто перевод ответа xnor на Pyth.
Q
is eval () 'd input (),h
увеличивает его,.B
преобразует в двоичную строку иt
берет "tail" (то есть все, кроме первого символа).источник
Haskell,
41383029 байтПример использования:
(l!!) 4
->"10"
.Начиная с пустого списка в качестве первого элемента, лениво пройдитесь по списку и добавьте текущий элемент с
0
и1
перед ним.Редактировать: @xnor сохранил
311 байтов. Благодаря!источник
[(0:),(1:)]<*>
<*>
трюк раньше, но я забыл об этом. Еще раз спасибо!l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
.[b:x|x<-l,b<-"01"]
продукт или concat-map, но выражение продукта(:)<$>[0,1]<*>l
идет в неправильном порядке, сначала добавляя 0 ко всему, никогда не доходя до 1, потому что список бесконечен. Есть ли у вас какие-либо идеи?JavaScript (ES6), 29 байт
Та же идея, что и у Xnor.
источник
Джольф, 4 байта
Попробуй это здесь!
Очень простая стратегия, также бывает самой короткой.
источник
Haskell, 35 байт
Haskell не имеет встроенного двоичного кода, поэтому (обратное) преобразование выполняется вручную. Чтобы удалить начальную 1, базовый случай должен
1
преобразоваться в пустой список.Изменить: сохранить байт путем сопряжения
+1
вместо.источник
C, 40 байтов
Преобразует ввод в биективное основание 2 (с символами
0
и1
), как и другие ответы.Идеон это!
источник