ビット幅nのグレーコードリストを教えてください


11

グレイコードはビット幅の2進数のシーケンスでnあり、連続する数字は1ビットのみ異なります(出力例を参照)。

参照

入力例:

3

出力例:

000
001
011
010
110
111
101
100

ノート:

  • この質問はだまされているようですが、そうではありません。なぜなら、その質問はコードゴルフではなく、異なる出力を要求するからです。ただし、その答えを確認するのに役立ちます。
  • n入力を含む変数を想定できます。

6
もう1つの質問は、客観的な勝利基準のない最速のコードチャレンジであることを考慮して(最速の測定方法?)、もう1つの質問を閉じて、この質問を再度開くことをお勧めします。
デニス14

2
私は@dennisに同意するため、元の質問に関する次の不人気な回答を支持しました。「探している答えが厳密に速い場合、(グレーコードの)配列を宣言した場合...」しかし、元の質問areadyには7文字と4文字の答えがあるので、改善の余地は大いにあります。したがって、私は現在、再開投票を行っていません。
レベルリバーセント14


最も初期のグレイコードの質問は素晴らしいものではありませんが、すでにこの質問が求めている答えと基本的に同じであり、改善される可能性が低い答えがすでにあります。これを閉じたままにして、もう1つをコードゴルフに変更する方が意味があったと思います。
ピーターテイラー14

回答:


2

JavaScript(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番目のグレイコード番号があるからこの答え。lengthに先行するゼロを追加するには、バイナリ文字列に変換nする2**n前に追加して、lengthの文字列を作成しますn+1。その後、私は大手切り捨て1と番号タイプのプレフィックスを0b[3:]



2

APL(Dyalog Classic)、11バイト

2≠/0,↑,⍳n2

オンラインでお試しください!

n⍴2is 2 2...2- n2のベクトル

は、n形状を持つ2 2...2- 次元配列のインデックスです。つまり、ネストされたベクトルの2×2×...×2配列です。0-indexing(⎕IO←0)を使用するため、これらはすべてlengthのバイナリベクトルですn

,2×2×...×2形状を平坦化して、2 n個のネストされたバイナリベクトルのベクトルを取得します

"mix"-ベクトルのベクトルをソリッド2 n ×n行列に変換します。次のようになります。

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, 行列の左側にゼロを追加します

2≠/(対ではなく)最後の次元に沿ってペアワイズ(2)xor()を計算します。つまり、すべての要素が右隣とxor-edされ、最後の列が消えます/

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確かに、追加
ngn

非常に賢い、thx
ジョナ

2

Japt14 12バイト

2pU Ç^z)¤ùTU

ETHproductionsのおかげで2バイト削らました

オンラインでお試しください!


ù使用方法の完璧な例。以来N.z(n)、デフォルトのarg = 2で除算整数である、あなたは、2つのバイトを保存することができます2pU Ç^z)¤ùTUオンラインそれをお試しください!
ETHproductions

@ETHproductionsありがたいことに、私は時々デフォルト引数を時々見逃しています。非常に便利です、どうもありがとう。
NIT

1

Python-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しかないため、ビットシフトコマンドレットを使用してコードを短くすることはできません。そこで、質問ソースで説明されている別の方法を利用して、配列を反転してそれ自体に追加し、上半分の前に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)}

@voidpigeon #mapから#timesasに切り替えると、3文字節約されます。


1
代わりに[*0...2**n].mapを使用できます(2**n).times
激しい14


1

MATL、10バイト

W:qt2/kZ~B

オンラインでお試しください!

古き良き「XOR n with n >> 2」メソッド。

W-2 ^(input)を計算(暗黙的に入力を取得)
:q-0から2 ^ nの数値の範囲を作成-1-
t その範囲を複製
2/k-MATLにはビットシフトがないため、(各数値)を2で
Z~ 除算し、floor-要素単位の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それぞれに参加」です。1番目の要素の各値に0を結合し、2番目の要素の各値に1を結合して、最初のパスで((0 0; 0 1);(1 1; 1 0))を与える
  • ,/ 「結合」され、リストにフラット化されます。
  • (x-1){...}/0 1「{func}を0 1x-1回適用」です。最後の反復の出力を入力として受け取ります

0

APL(22)

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

これは、ビットを行として含むn行2列の行列を出力します。

      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 1n-1初期入力行列(0 1)T(1ビットグレーコード)で関数を実行します

    • (0,⍵):の各行との0接頭辞、
    • : の上に、
    • 1,⊖⍵:の各行とは1逆の順序で、接頭しました

0

JQ 1.5105の、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.