Seu objetivo é criar uma função ou um programa para reverter os bits em um intervalo de números inteiros, dado um número inteiro n . Em outras palavras, você deseja encontrar a permutação de reversão de bits de um intervalo de 2 n itens, indexados a zero. Essa também é a sequência OEIS A030109 . Esse processo geralmente é usado na computação de transformadas rápidas de Fourier, como o algoritmo Cooley-Tukey para FFT no local. Há também um desafio para calcular a FFT para sequências em que o comprimento é uma potência de 2.
Esse processo requer que você itere no intervalo [0, 2 n -1] e converta cada valor em binário e inverta os bits nesse valor. Você tratará cada valor como um número de n dígitos na base 2, o que significa que a reversão ocorrerá apenas entre os últimos n bits.
Por exemplo, se n = 3, o intervalo de números inteiros é [0, 1, 2, 3, 4, 5, 6, 7]
. Esses são
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
onde cada índice i é convertido em um índice j usando inversão de bits. Isso significa que a saída é [0, 4, 2, 6, 1, 5, 3, 7]
.
A saída para n de 0 a 4 é
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Você pode ter notado uma formação de padrão. Dado n , você pode pegar a sequência anterior para n -1 e dobrá-la. Em seguida, concatene essa lista dobrada para a mesma lista dupla, mas incrementada em uma. Mostrar,
[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]
onde ⊕
representa concatenação.
Você pode usar um dos dois métodos acima para formar sua solução. Se você conhece uma maneira melhor, você também pode usá-la. Qualquer método é bom, desde que produza os resultados corretos.
Regras
- Isso é código-golfe, então a solução mais curta vence.
- Construções que resolvem esse desafio como um todo e construções que calculam a reversão de bits de um valor não são permitidas. Isso não inclui built-in que executam conversão binária ou outras operações bit a bit.
- Sua solução deve ser, no mínimo, válida para n de 0 a 31.
IntegerReverse[Range[2^#]-1,2,#]&
,. (Eu não sei por que Mathematica precisa que built-in, mas eu acho que não é um estranho muito queSunset
...)0
vez de[0]
ou precisa ser uma lista?Respostas:
Geléia ,
76 bytesObrigado a @EriktheOutgolfer por jogar fora um byte!
Experimente online!
Como funciona
fonte
05AB1E , 8 bytes
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
0)ïsF·D>«
estava perto embora. Teve alguns problemas com o '0'.¾
. Vou ter que lembrar desse truque.MATL,
13121098 bytesExperimente Online
Explicação
Por uma questão de exaustividade, aqui estava minha resposta antiga, usando a abordagem não recursiva (9 bytes).
Experimente Online
Explicação
fonte
J,
1511 bytesExiste uma alternativa para 15 bytes que usa conversão e reversão binárias diretas.
Uso
Explicação
fonte
Geléia , 5 bytes
Experimente online!
-1 graças a Dennis .
fonte
Haskell ,
4037 bytesExperimente online!
Obrigado a @Laikoni por três bytes!
fonte
Oitava, 37 bytes
Cria uma função anônima chamada
ans
que pode ser simplesmente chamada comans(n)
.Demo Online
fonte
Python 2,
565554 bytesTeste em Ideone .
Graças a @xnor por jogar fora um byte!
fonte
[0][n:]or
.Java,
422419 bytes:Bem, eu finalmente aprendi Java para minha segunda linguagem de programação, então eu queria usar minhas novas habilidades para concluir um desafio simples e, embora tenha sido muito longo, não estou desapontado. Estou feliz por ter conseguido concluir um desafio simples em Java.
Experimente Online! (Ideona)
fonte
Mathematica,
5633 bytesA contagem de bytes assume uma fonte codificada ISO 8859-1.
Isso usa a definição recursiva para definir um operador unário
±
.fonte
Perl,
4645 bytesInclui +1 para
-p
Forneça o número de entrada no STDIN
fonte
Pitão - 11 bytes
Conjunto de Teste .
fonte
Javascript ES6,
655351 bytesUsa o algoritmo recursivo de incremento duplo-concat.
Exemplo é executado:
fonte
f=n=>n>0?(r=f(n-1).map(i=>i*2)).concat(r.map(i=>i+1)):[0]
?n==1
, obrigado.f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]
Python 3,
6759 bytesGraças a @Dennis por -8 bytes
Também podemos ter uma implementação simples (modificada) em Python, mesmo que seja muito longa.
Uma função anônima que recebe entrada por argumento e retorna a permutação de bits reversos como uma lista.
Como funciona
Experimente no Ideone
fonte
Dyalog APL , 12 bytes
Requer
⎕IO←0
qual é o padrão em muitos sistemas.2⊥
da base 2 de⊖
o capotou2⊥⍣¯1
inverso da base 2 de⍳
os primeiros n números inteiros, onde n é2*
2 ao poder de⎕
entrada numéricaTryAPL online!
Para comparação, aqui está o outro método:
(
o trem de função ...2∘×
duas vezes (o argumento),
concatenado para1+
um mais2∘×
duas vezes (o argumento))⍣
aplicado quantas vezes for especificado por⎕
entrada numérica⊢
em0
zerofonte
(⍋,⍨)⍣⎕⊢0
(⎕io←0
)K (ngn / k) ,
118 bytesExperimente online!
&
é o último verbo na composição, por isso precisamos de um:
para forçá-lo a ser monádicofonte
Julia,
2322 bytesImplementação bastante direta do processo descrito na especificação do desafio.
Experimente online!
fonte
Pitão, 8 bytes
Experimente on-line: demonstração ou Test Suite
Explicação:
fonte
Clojure, 78 bytes
Apenas seguindo as especificações ...
fonte
Ruby, 57 bytes:
fonte
PHP, 57 bytes
recebe entrada do parâmetro da linha de comando, imprime valores delimitados por sublinhado. Corra com
-nr
.solução recursiva, 72 bytes
função leva inteiro, retorna matriz
fonte
Ruby , 51 bytes
Experimente online!
fonte
Perl 6 , 42 bytes
Experimente online!
Incrementar um número inteiro simplesmente inverte uma sequência de bits menos significativos, por exemplo, de
xxxx0111
paraxxxx1000
. Portanto, o próximo índice reverso de bits pode ser obtido a partir do anterior, invertendo uma sequência dos bits mais significativos. A máscara XOR pode ser calculado comm - (m >> (ctz(i) + 1))
param = 2**n
oum = 2**n-1
.Perl 6 , 30 bytes
Experimente online!
Abordagem recursiva.
fonte
JavaScript (Firefox 30-57), 48 bytes
Porto da solução Python 2 de @ Dennis ♦.
fonte
Japonês ,
1413 bytesExperimente online!
Descompactado e como funciona
Implementação direta.
fonte
n2
:Í
APL (Dyalog Classic) , 9 bytes
Experimente online!
⎕
entrada avaliada(
)⍣⎕⊢0
aplique a coisa(
)
várias vezes, começando com0
,⍨
concatenar o resultado atual consigo mesmo⍋
índices de uma permutação crescentefonte
x86, 31 bytes
Toma um suficientemente grande
int[] buffer
emeax
e n emecx
, e retorna o tampão emeax
.Implementa o algoritmo de concatenação fornecido na declaração de desafio. Pode ser possível salvar bytes incrementando os ponteiros em 4, em vez de usar os acessos à matriz diretamente, mas
lea
/mov
já é bastante curto (3 bytes para 3 regs e um multiplicador).Hexdump:
fonte