格雷码是一系列的位宽二进制数字,n
其中连续数字仅在一位中有所不同(请参见示例输出)。
输入示例:
3
输出示例:
000
001
011
010
110
111
101
100
笔记:
- 这个问题似乎有欺骗,但它不是,对于这个问题是不是代码高尔夫球场,它需要不同的输出。不过,这将有助于检查答案。
- 您可以假定
n
包含输入的变量。
格雷码是一系列的位宽二进制数字,n
其中连续数字仅在一位中有所不同(请参见示例输出)。
输入示例:
3
输出示例:
000
001
011
010
110
111
101
100
笔记:
n
包含输入的变量。Answers:
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));
2≠/0,↑,⍳n⍴2
n⍴2
是2 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
业余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。
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
的结果-将结果中的每个数字转换为二进制
(隐式显示输出)。
{(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 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)