당신의 목표는 정수 n 주어진 정수의 범위에서 비트를 반전시키는 함수 또는 프로그램을 만드는 것입니다 . 다시 말해 , 0 n 인덱스 의 2 n 항목 범위의 비트 반전 순열 을 찾고자합니다 . 이것은 또한 OEIS 시퀀스 A030109 입니다. 이 프로세스는 종종 FFT에 대한 내부 Cooley-Tukey 알고리즘과 같은 고속 푸리에 변환을 계산하는 데 사용됩니다. 길이가 2의 거듭 제곱 인 시퀀스에 대해 FFT를 계산 하는 데 어려움 이 있습니다 .
이 프로세스를 수행하려면 [0, 2 n -1] 범위를 반복하고 각 값을 이진수로 변환하고 해당 값의 비트를 반전 시켜야합니다 . 밑수 2에서 각 값을 n 자리 숫자 로 취급 하므로 마지막 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]
입니다.
0에서 4까지의 n에 대한 출력 은
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을 두 배로. 그런 다음 해당 이중 목록을 동일한 이중 목록에 연결하지만 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]
어디는 ⊕
연결을 나타냅니다.
솔루션을 구성하기 위해 위의 두 가지 방법 중 하나를 사용할 수 있습니다. 더 나은 방법을 알고 있다면 그 방법도 자유롭게 사용할 수 있습니다. 올바른 결과를 출력하는 한 모든 방법이 좋습니다.
규칙
- 이것은 코드 골프 이므로 가장 짧은 솔루션이 승리합니다.
- 이 문제를 전체적으로 해결하는 기본 및 값의 비트 반전을 계산하는 기본은 허용되지 않습니다. 이진 변환이나 다른 비트 단위 연산을 수행하는 내장은 포함되지 않습니다.
- 귀하의 솔루션은 최소한 0에서 31까지의 n에 유효해야합니다 .
0
대신 인쇄 [0]
해야합니까 아니면 목록이어야합니까?
IntegerReverse[Range[2^#]-1,2,#]&
. (나도 몰라 이유 는보다 많은 괴상 아니다 티카가 내장 된 것을 필요로하지만, 그런 것 같아요Sunset
...)