将所有正数按其正则顺序(1,2,3,.)有点无聊,不是吗?因此,这里有一系列关于所有正数排列(改组)的挑战。这是本系列的第二个挑战。第一个挑战是这里。
在这个挑战中,我们使用灰色码来获取自然数。灰色码或“反射二进制码”是一种二进制编码,其方式是两个连续值仅相差一位。这种编码的一个实际应用是在旋转编码器中使用它,因此我参考了“转我的路”。

请注意,这种编码留下了一定程度的自由度。例如,在二进制1100之后,有四种可能的代码: 1101、1110、1000和0100。这就是为什么我将a(n)定义为最小的值,而不是以前使用的值,该值仅与二进制编码中的一个字符不同。该序列与A163252相对应。
由于这是一个“纯序列”的挑战,任务是将给定n的D9输出为输入,其中a(n)是A163252。
给定整数输入n,以整数格式输出a(n) (而不是二进制格式)。
a(n)被定义为序列中没有出现的最小正整数,因此当以二进制形式写入时,a(n-1)和a(n)仅相差一位。
注意:这里假设基于1的索引;您可以使用基于0的索引,所以a(0) = 1; a(1) = 3__等等。如果您选择使用这个索引,请在您的答案中提到这一点。
Input | Output
--------------
1 | 1
5 | 4
20 | 18
50 | 48
123 | 121
1234 | 1333
3000 | 3030
9999 | 9997a(0)被定义为0。对于这一挑战,我们将忽视这一点。请参阅以下与PP&CG相关(但不相等)的问题:
发布于 2019-03-19 17:35:03
1-索引。
n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}n => { // n = index of requested term
for( // for loop:
o = // o = storage object for the terms of the sequence
p = // p = last term found in the sequence
[k = 1]; // k = current term
o[k] | // if k was already encountered
~-(i = p ^ k) & i ? // or (p XOR k) has more than 1 bit set:
k++ // increment k
: // else:
k = o[p = k] // set o[k], set p to k
= !!n--; // stop if n is equal to 0 or set k to 1; decrement n
); // end of for()
return p // return p
} // end发布于 2019-03-19 20:02:52
https://codegolf.stackexchange.com/questions/181825
复制相似问题