Ваша цель состоит в том, чтобы создать функцию или программу для обращения битов в диапазоне целых чисел с заданным целым числом n . Другими словами, вы хотите найти перестановку перестановок битов в диапазоне 2 n элементов с нулевым индексом. Это также последовательность OEIS A030109 . Этот процесс часто используется при вычислении быстрых преобразований Фурье, таких как встроенный алгоритм Кули-Тьюки для БПФ. Существует также проблема для вычисления БПФ для последовательностей, где длина равна степени 2.
Этот процесс требует от вас итерации в диапазоне [0, 2 n -1] и преобразования каждого значения в двоичное и обращения битов в этом значении. Вы будете рассматривать каждое значение как n- значное число в базе 2, что означает, что обращение будет происходить только среди последних n битов.
Например, если n = 3, диапазон целых чисел равен [0, 1, 2, 3, 4, 5, 6, 7]
. Эти
i Regular Bit-Reversed j
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
где каждый индекс i преобразуется в индекс j с использованием обращения битов. Это означает, что на выходе [0, 4, 2, 6, 1, 5, 3, 7]
.
Выходными данными для n от 0 до 4 являются
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Возможно, вы заметили формирование шаблона. Учитывая n , вы можете взять предыдущую последовательность для n -1 и удвоить ее. Затем объедините этот двойной список с тем же двойным списком, но увеличенным на единицу. Показывать,
[0, 2, 1, 3] * 2 = [0, 4, 2, 6]
[0, 4, 2, 6] + 1 = [1, 5, 3, 7]
[0, 4, 2, 6] ⊕ [1, 5, 3, 7] = [0, 4, 2, 6, 1, 5, 3, 7]
где ⊕
представляет конкатенацию.
Вы можете использовать любой из двух методов выше, чтобы сформировать свое решение. Если вы знаете лучший способ, вы можете использовать его тоже. Любой метод хорош, если он выводит правильные результаты.
правила
- Это код-гольф, поэтому выигрывает самое короткое решение.
- Встроенные функции, которые решают эту проблему в целом, и встроенные средства, которые вычисляют обращение битов значения, не допускаются. Это не включает встроенные функции, которые выполняют двоичное преобразование или другие побитовые операции.
- Ваше решение должно быть, по крайней мере, действительно для n от 0 до 31.
IntegerReverse[Range[2^#]-1,2,#]&
. (Я не знаю, зачем Mathematica нужна эта встроенная система, но я думаю, что это не намного страннее, чемSunset
...)0
вместо[0]
или это должен быть список?Ответы:
Желе ,
76 байтСпасибо @EriktheOutgolfer за отыгрывание 1 байта!
Попробуйте онлайн!
Как это работает
источник
05AB1E , 8 байтов
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
0)ïsF·D>«
было близко, хотя Были некоторые проблемы с «0».¾
. Должен вспомнить этот трюк.MATL,
13121098 байтПопробуйте онлайн
объяснение
Для полноты, вот мой старый ответ с использованием нерекурсивного подхода (9 байт).
Попробуйте онлайн
объяснение
источник
J,
1511 байтСуществует альтернатива для 15 байтов, которая использует прямое двоичное преобразование и обращение.
использование
объяснение
источник
Желе , 5 байт
Попробуйте онлайн!
-1 спасибо Денису .
источник
Haskell ,
4037 байтПопробуйте онлайн!
Спасибо @Laikoni за три байта!
источник
Октава, 37 байт
Создает анонимную функцию с именем,
ans
которую можно просто вызвать с помощьюans(n)
.Демо онлайн
источник
Python 2,
565554 байтаПроверьте это на Ideone .
Спасибо @xnor за вывод 1 байта!
источник
[0][n:]or
.Java,
422419 байт:Что ж, я наконец-то выучил Java для моего второго языка программирования, поэтому я хотел использовать свои новые навыки для выполнения простого задания, и, хотя оно оказалось очень долгим, я не разочарован. Я просто рад, что смог выполнить простую задачу на Java.
Попробуйте онлайн! (Ideone)
источник
Mathematica,
5633 байтаКоличество байтов предполагает кодированный источник ISO 8859-1.
При этом используется рекурсивное определение для определения унарного оператора
±
.источник
Perl,
4645 байтВключает +1 для
-p
Дайте номер ввода на STDIN
источник
Pyth - 11 байт
Тестовый пакет .
источник
Javascript ES6,
655351 байтИспользует рекурсивный алгоритм двойного приращения-конкат.
Пример работы:
источник
f=n=>n>0?(r=f(n-1).map(i=>i*2)).concat(r.map(i=>i+1)):[0]
?n==1
, спасибо.f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]
Python 3,
6759 байтСпасибо @Dennis за -8 байт
Мы также можем иметь (модифицированную) прямую реализацию в Python, даже если это довольно долго.
Анонимная функция, которая принимает входные данные по аргументу и возвращает перевернутую битовую перестановку в виде списка.
Как это работает
Попробуйте это на Ideone
источник
Дьялог АПЛ , 12 байт
требует
⎕IO←0
по умолчанию во многих системах.2⊥
из базы-2 из⊖
перевернутый2⊥⍣¯1
обратная от-базы-2⍳
первые n целых чисел, где n является2*
2 к власти⎕
числовой вводПопробуй APL онлайн!
Для сравнения, вот другой метод:
(
функциональный поезд ...2∘×
два раза (аргумент),
соединенный с1+
один плюс2∘×
два раза (аргумент))⍣
применяется столько раз, сколько указано⎕
числовой ввод⊢
на0
нульисточник
(⍋,⍨)⍣⎕⊢0
(⎕io←0
)K (нгн / к) ,
118 байтПопробуйте онлайн!
&
последний глагол в композиции, поэтому нам нужно:
чтобы заставить его быть монадическимисточник
Юлия,
23 года22 байтаСкорее простая реализация процесса, описанного в спецификации спец.
Попробуйте онлайн!
источник
Pyth, 8 байт
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
Clojure, 78 байт
Просто следуя спецификации ...
источник
Рубин, 57 байт:
источник
PHP, 57 байт
принимает входные данные из параметра командной строки, печатает значения, разделенные подчеркиванием. Беги с
-nr
.рекурсивное решение, 72 байта
функция принимает целое число, возвращает массив
источник
Рубин , 51 байт
Попробуйте онлайн!
источник
Perl 6 , 42 байта
Попробуйте онлайн!
Увеличение целого числа просто переворачивает последовательность младших битов, например, из
xxxx0111
вxxxx1000
. Таким образом, следующий инвертированный по битам индекс можно получить из предыдущего, перевернув последовательность старших значащих битов. Маска XOR может быть вычислена с помощьюm - (m >> (ctz(i) + 1))
form = 2**n
илиm = 2**n-1
.Perl 6 , 30 байт
Попробуйте онлайн!
Рекурсивный подход.
источник
JavaScript (Firefox 30-57), 48 байт
Порт @ Dennis ♦ Python 2 решение.
источник
Japt ,
1413 байтПопробуйте онлайн!
Распаковано и как это работает
Простая реализация.
источник
n2
:Í
APL (Dyalog Classic) , 9 байтов
Попробуйте онлайн!
⎕
оцененный вклад(
)⍣⎕⊢0
применять вещь во(
)
много раз, начиная с0
,⍨
объединить текущий результат с самим собой⍋
индексы сортировки по возрастаниюисточник
x86, 31 байт
Принимает достаточно большие значения
int[] buffer
ineax
и n inecx
и возвращает буфер вeax
.Реализует алгоритм объединения, указанный в операторе вызова. Может быть возможно сохранить байты, увеличив указатели на 4 вместо прямого доступа к массиву, но
lea
/mov
уже довольно короток (3 байта для 3 регистров и множитель).HexDump:
источник