给我位宽n的格雷码列表


11

格雷码是一系列的位宽二进制数字,n其中连续数字仅在一位中有所不同(请参见示例输出)。

参考

输入示例:

3

输出示例:

000
001
011
010
110
111
101
100

笔记:

  • 这个问题似乎有欺骗,但它不是,对于这个问题是不是代码高尔夫球场,它需要不同的输出。不过,这将有助于检查答案。
  • 您可以假定n包含输入的变量。

6
考虑到另一个问题是没有客观获胜标准的最快的代码代码挑战(最快的度量方式?),我建议关闭另一个,然后重新打开它。
丹尼斯

2
我同意@dennis的意见,因此,我对原始问题提出了以下不受欢迎的答案。“如果您要寻找的答案严格来说是快速的结果,那么,如果您声明一个数组(使用灰色代码)...”但是,最初的问题Aready有7个字符和4个字符的答案,所以我不看不到很大的改进空间。因此,我目前不在重开表决。
级圣河

3
这与遍历所有数字非常相似,但是每步仅翻转一位 ……
丹尼斯

最早的格雷码问题并不是很好,但是它已经具有与该问题想要的答案基本相同的答案,并且不太可能得到改善。我认为将这一项关闭,而将另一项更改为代码高尔夫球将更有意义。
彼得·泰勒

Answers:


2

的JavaScript(77)

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

浏览器更友好的版本(console.log和提示符()):

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));
矫kill过

2

的Python 2(47)

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

表达i/2^ii“个格雷码数是从这个答案。要添加填充到length的前导零n,我2**n在转换为二进制字符串之前创建了一个length字符串n+1。然后,我截断领先1和数量型前缀0b[3:]



2

APL(Dyalog Classic),11个字节

2≠/0,↑,⍳n2

在线尝试!

n⍴22 2...2- n二进制的向量

n具有形状的2 2...2- 维数组的索引-即嵌套向量的2×2×...×2数组。当我们使用0-indexing(⎕IO←0)时,它们都是length的二进制向量n

,平坦化2×2×...×2的形状,所以我们得到一个矢量的2个Ñ嵌套二元载体

“ 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();换句话说,每个元素与其右邻进行异或运算,最后一列消失/

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

您介意添加一个简短的说明吗?
约拿(Jonah)'18年

1
@Jonah肯定的是,加
NGN

非常聪明,谢谢
约拿书'18


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)

业余PowerShell再次尝试golF!希望你不要介意!至少这些问题很有趣,并且有一定的学习经验。假设已经输入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
2014年

1

J,24个字节

[:#:@(22 b.<.@-:)[:i.2^]

在线尝试!

直接实现“具有自己的下半部分的异或”算法。请注意,这22 b.是XOR。


1

MATL,10字节

W:qt2/kZ~B

在线尝试!

好的旧的“与n >> 2的XOR n”方法。

W-计算2 ^(输入)(隐式获取输入)
:q-创建从0到2 ^ n的数字范围-1-
t 复制该范围 -MATL没有移位
2/k,因此将(每个数字)除以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与第一个elem的每个值连接,并将1与第二个elem的每个值连接,在第一次通过时给出((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矩阵,其中包含这些位作为其行:

      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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.