グレイコードはビット幅の2進数のシーケンスでn
あり、連続する数字は1ビットのみ異なります(出力例を参照)。
入力例:
3
出力例:
000
001
011
010
110
111
101
100
ノート:
グレイコードはビット幅の2進数のシーケンスでn
あり、連続する数字は1ビットのみ異なります(出力例を参照)。
入力例:
3
出力例:
000
001
011
010
110
111
101
100
ノート:
回答:
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));
2≠/0,↑,⍳n⍴2
n⍴2
is 2 2...2
- n
2のベクトル
⍳
は、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
チャレンジで指定された参照からのアルゴリズムに基づいて:
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)
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を追加しました。
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""
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
での結果-結果の各数値をバイナリに変換します
(暗黙的に出力を表示します)。
{(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 1
x-1回適用」です。最後の反復の出力を入力として受け取ります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
この課題は、{(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)