비트 폭 n의 그레이 코드 목록을 줘


11

그레이 코드는 n연속적인 숫자가 1 비트에서만 다른 2 진 비트 폭의 시퀀스입니다 (예제 출력 참조).

참고

입력 예 :

3

출력 예 :

000
001
011
010
110
111
101
100

메모:

  • 이 질문에는 속임수 가있는 것처럼 보이지만 그렇지는 않습니다. 왜냐하면 그 질문은 코드 골프가 아니며 다른 출력을 요구하기 때문입니다. 그래도 답을 확인하는 데 도움이 될 것입니다.
  • n입력을 포함 하는 변수 를 가정 할 수 있습니다 .

6
다른 질문은 객관적인 승리 기준이없는 가장 빠른 코드 코드 도전 (고속 측정 방법)이라는 것을 고려하여 다른 질문을 닫고 다시 열 것을 제안합니다.
— Dennis

2
@dennis에 동의하므로 원래 질문에 대해 다음과 같은 인기없는 답변을 올렸습니다. "찾고있는 답이 엄청나게 빠른 결과라면, (회색 코드로) 배열을 선언하면 ..." 그러나 원래의 질문 영역에는 7 자 및 4 자 대답이 있으므로 개선의 여지가 많다. 따라서 현재 재개 표를하지 않습니다.
— Level River St


최초의 그레이 코드 질문은 훌륭하지 않지만 이미이 질문이 원하는 답변과 기본적으로 같고 개선되지 않는 답변이 이미 있습니다. 나는 이것을 폐쇄하고 다른 하나를 코드 골프로 바꾸는 것이 더 합리적이라고 생각합니다.
— 피터 테일러

답변:


2

자바 스크립트 (77)

for(i=0;i<1<<n;)alert((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))

보다 브라우저 친화적 인 버전 (console.log 및 prompt ()) :

n=prompt();for(i=0;i<1<<n;)console.log((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))

어쩌면이 배열은 ... 조인은 과잉입니다for(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
— edc65

2

파이썬 2 (47)

for i in range(2**n):print bin(2**n+i/2^i)[3:]

'회색 코드 번호에 i/2^i대한 표현 i은 이 답변 에서 나온 것 입니다. 패드를 길이에 선행하는 0을 추가하려면 길이 문자열을 생성하여 이진 문자열로 변환하기 전에 n추가 합니다. 그런 다음 선행 및 숫자 유형 접두어를 로 자릅니다 .2**nn+110b[3:]



2

APL (Dyalog Classic) , 11 바이트

2≠/0,↑,⍳n⍴2

온라인으로 사용해보십시오!

n⍴2is 2 2...2- n2 의 벡터

⍳는 n모양 을 가진 차원 배열 의 인덱스 2 2...2, 즉 중첩 벡터의 2 × 2 × ... × 2 배열입니다. 0- 인덱싱 ( ⎕IO←0)을 사용할 때 모두 길이가 이진 벡터입니다 n.

,2 × 2 × ... × 2 모양을 평평하게하여 2n 개의 중첩 이진 벡터로 구성된 벡터 를 얻습니다.

↑"mix"-벡터의 벡터를 솔리드 2 n xn 행렬 로 변환합니다 . 다음과 같이 보입니다 :

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

0, 행렬의 왼쪽에 0을 추가합니다

2≠/페어 와이즈 (계산 2) XOR ( ≠최종 치수를 따라) ( /반대 ⌿); 다시 말해, 모든 요소는 오른쪽 이웃과 정렬되어 있고 마지막 열은 사라집니다.

0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

빠른 설명을 추가 하시겠습니까?
— 요나

1
@Jonah sure, added
— ngn

매우 영리한, thx
— Jonah


1

파이썬-54

챌린지에 제공된 참조에서 알고리즘을 기반으로합니다.

for i in range(2**n):print'{1:0{0}b}'.format(n,i>>1^i)

언 골프 드 :

# For each of the possible 2**n numbers...
for num in range(2**n):
    gray = num>>1 ^ num

    # Print in binary and pad with n zeros.
    print '{1:0{0}b}'.format(grey)

1

PowerShell (168)

golF의 또 다른 시도로 아마추어 PowerShell이 ​​돌아 왔습니다! 당신이 상관하지 않기를 바랍니다! 최소한 이러한 질문은 재미 있고 학습 경험이 풍부합니다. n이 입력되었다고 가정하면 다음과 같습니다.

$x=@('0','1');for($a=1;$a-lt$n;$a++){$x+=$x[($x.length-1)..0];$i=[Math]::Floor(($x.length-1)/2);0..$i|%{$x[$_]='0'+$x[$_]};($i+1)..($x.length-1)|%{$x[$_]='1'+$x[$_]}}$x

작업중인 PowerShell은 2.0에 불과하므로 더 짧은 코드를 만들 수있는 비트 이동 cmdlet을 사용할 수 없습니다. 그래서 질문 소스에 설명 된 다른 방법을 사용 하여 배열을 뒤집어 배열에 추가하고 0을 위쪽 절반 앞에 추가하고 1을 아래쪽 절반에 추가했습니다.


1

F # (86) (84) (80)

for i in 0..(1<<<n)-1 do printfn"%s"(Convert.ToString(i^^^i/2,2).PadLeft(n,'0'))

이것은 아마도 더 향상 될 수 있습니다.

또한 FSI에서 실행하는 경우 open System;;먼저 해야합니다 . 가져 오기를 피하고 값을 인쇄하는 순서에 신경 쓰지 않으려면이 82 자 버전을 사용할 수 있습니다.

for i in 0..(1<<<n)-1 do(for j in 0..n-1 do printf"%i"((i^^^i/2>>>j)%2));printfn""

1

루비 — 42 39

동일한 알고리즘, 다른 언어 :

(2**n).times{|b|puts"%0#{n}b"%(b>>1^b)}

에서 전환 #map에 #times@voidpigeon에서 알 수 있듯이 것은 3 개 문자를 저장합니다.


1
대신을 [*0...2**n].map사용할 수 있습니다 (2**n).times.
— afuous


1

MATL , 10 바이트

W:qt2/kZ~B

온라인으로 사용해보십시오!

좋은 오래된 "XOR n with n >> 2"방법.

W-2 ^ (입력) 계산 (암시 적으로 입력 을 얻음)
:q-0에서 2 ^ n까지의 숫자 범위 만들기 -1-
t 해당 범위 복제
2/k-MATL에 비트 시프트가 없으므로 (각 숫자)를 2로 나누고 층별
Z~ XOR 원래 0 ~ 2 ^ n-1 배열
B 의 결과-결과의 각 숫자를 이진수로 변환합니다
(암시 적으로 출력 표시).


1

K (ngn / k) , 25 바이트

{(x-1){,/0 1,''|:\x}/0 1}

온라인으로 사용해보십시오!


  • |:\x"역 스캔 x"입니다. 출력이 입력과 같아 질 때까지 x에 역으로 적용하고 각 반복을 표시합니다. 첫 번째 패스에서 (0 1; 1 0)을 반환합니다.
  • 0 1,''"0은 각각의 조인"입니다. 1 번째 각 요소의 값에 0을 결합하고 1 번째 각 요소의 값에 1을 결합하여 첫 번째 패스에서 ((0 0; 0 1); (1 1; 1 0))
  • ,/ "join over"이고 목록으로 병합됩니다.
  • (x-1){...}/0 1" 0 1x-1 번에 {func} 적용 "입니다. 마지막 반복의 출력을 입력으로 취합니다.

0

APL (22)

{(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1

비트를 행으로 포함하는 nx2 ^ n 행렬을 출력합니다.

      n←3
      {(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1
0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

설명:

  • {... }⍣(n-1)⍪0 1: n-1초기 입력 매트릭스로 함수 시간을 실행합니다 (0 1)T(1 비트 회색 코드).

    • (0,⍵): 접두사 ⍵가 0붙은 각 행
    • ⍪: 위에,
    • 1,⊖⍵: 접두사 ⍵가 1붙은 각 행의 역순

0

JQ 1.5 , 105 100 바이트

def g(n):if n<2then. else map([0]+.)+(reverse|map([1]+.))|g(n-1)end;[[0],[1]]|g(N)[]|map("\(.)")|add

N이 입력을 제공한다고 가정합니다. 예 :

def N: 3 ;

넓히는

def g(n):  # recursively compute gray code
  if n < 2
  then .
  else map([0]+.) + (reverse|map([1]+.)) | g(n-1)
  end;

  [[0],[1]]                 # initial state
| g(N)[]                    # for each element in array of gray codes
| map("\(.)")|add           # covert to a string

온라인으로 사용해보십시오!



-1

T-SQL 134

이 과제는 {(0), (1)}의 데카르트 힘을 반환하도록 요구하고 있습니다. 이 스 니펫은 {(0), (1)}의 데카르트 곱을 n 번 실행하는 코드를 작성합니다.

DECLARE @ int=4,@s varchar(max)='SELECT*FROM's:set @s+='(VALUES(0),(1))t'+ltrim(@)+'(b)'if @>1set @s+=','set @-=1if @>0goto s exec(@s)

특정 순서로 데카르트 힘을 요구합니다. 당신의 코드가 그것을 설명합니까?
— ToonAlfrink
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.