비트 폭 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,↑,⍳n2

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

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.