倾斜的二进制数


15

给定一个整数n,输出n索引为0或1 的第一个倾斜的二进制数。它们之所以被称为是因为它们是如何生成的:

将数字以二进制形式彼此下写(右对齐):

........0
........1
.......10
.......11
......100
......101
......110
......111
.....1000
.........

然后,您需要从左下角到右上角取每个对角线,以使每个最后一位是对角线的最后一位。这是标记为的第四个对角线(零索引)x,它是100

........0
........1
.......10
.......11
......10x
......1x1
......x10
......111
.....1000
.........

向上倾斜的对角线顺序为:

0
11
110
101
100
1111
1010
.......

然后,转换为十进制 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

这是,因此以字节为单位的最短代码获胜。


12
我认为这个说明不是很清楚。我必须做大量的外部阅读,才能理解这里的要求。
发布Rock Garf Hunter,2016年

1
如果有帮助,这里是可视化。从上至下以及从左下至右上的椭圆内读取“椭圆”。这些为您提供了需要转换为十进制的二进制数字。
帕维尔

您是什么意思,“ 0或1索引 ”?您是说一个人输出第一个n还是第一个n+1数字?
smls

4
我认为,如果您只需要返回第n个值,则可能会提供更多有趣的答案。
xnor

1
@PatrickRoberts我从来没有限制生成多少个。我只是说“用二进制写数字...”。您可以生成所需数量的东西。
mbomb007'2013/

Answers:


3

果冻,11个字节

ḤḶBUz0ŒDUḄḣ

在线尝试!

说明

ḤḶBUz0ŒDUḄḣ    Main link. Argument: n
Ḥ              Double the argument. This ensures there are enough
               rows, since n + log2(n) <= 2n.
 Ḷ             Get range [0 .. 2n-1].
  B            Convert each number to binary.
   U           Reverse each list of digits. 
    z0         Transpose, padding with zeroes to a rectangle.
      ŒD       Get the diagonals of the rectangle, starting from the
               main diagonal. This gets the desired numbers, reversed,
               in binary, with some extras that'll get dropped.
        U      Reverse each diagonal.
         Ḅ     Convert each diagonal from binary to a number.
          ḣ    Take the first n numbers.

转置是填充数组以使对角线内置工作的最简单方法。然后添加反向,以正确的顺序获取所有内容。


在Jelly中,OEIS公式的实现可能也确实很短。
Yytsi

@TuukkaX可能会。我已经厌倦了,很难找到一个上限。
PurkkaKoodari

@TuukkaX我尝试过,但是我看不到它的发生。我确定Dennis&co将在5个字节左右的时间内实现它。
PurkkaKoodari


7

JavaScript(ES6),53个字节

n=>[...Array(n)].map(g=(j=1,i)=>j>i?0:j&i|g(j+j,i+1))

0索引。我不太经常使用递归函数作为的参数map


4

Mathematica,46个字节

Plus@@@Table[BitAnd[n+k,2^k],{n,0,#},{k,0,n}]&

未命名函数,将非负整数#作为输入并返回0索引序列直至#第th项。使用BitAnd(按位“和”)以2的适当幂构建倾斜的二进制数。


2

Python3,63 61个字节

lambda i:[sum(n+k&2**k for k in range(n+1))for n in range(i)]

使用OEIS中的公式。

-2个字节感谢Luis Mendoi+1->i


您能解释一下您是如何开始Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^k使用该更简单的按位公式的吗?
smls

@smls它只是直接计算向上的对角线。我实际上认为它比其他形式更明显。
尼尔

1

PHP,68字节

for(;$n++<$argv[1];print$s._)for($s=$i=0;$i<$n;)$s|=$n+$i-1&1<<$i++;

从命令行参数获取输入,打印下划线分隔的数字。用运行-r


1

MATL18 17字节

:q"@tt:+5MW\~fWs+

在线尝试!

这使用OEIS中的公式:

a(n) = n + Sum_{ k in [1 2... n] such that n + k == 0 mod 2^k } 2^k

码:

:q"     % For k in [0 1 2 ...n-1], where n is implicit input
  @     %   Push k
  tt    %   Push two copies
  :     %   Range [1 2 ... k]
  +     %   Add. Gives [n+1 n+2 ... n+k]
  5M    %   Push [1 2... k] again
  W     %   2 raised to that
  \     %   Modulo
  ~f    %   Indices of zero entries
  W     %   2 raised to that
  s     %   Sum of array
  +     %   Add
        % End implicitly. Display implicitly

0

Perl 6的59 43个字节

{map ->\n{n+sum map {2**$_ if 0==(n+$_)%(2**$_)},1..n},^$_}

{map {sum map {($_+$^k)+&2**$k},0..$_},^$_}

使用OESIS页面中的公式。
更新:从TuukkaX的Python answer切换到基于位和的公式。

Perl 6、67字节

{map {:2(flip [~] map {.base(2).flip.comb[$++]//""},$_..2*$_)},^$_}

天真的解决方案。
将对角线的一部分数字转换为以2为底的数字,取每个数字的正确数字,然后将结果转换回以10为底的数字。



0

R,66个字节

function(n,k=0:length(miscFuncs::bin(n-1)))sum(bitwAnd(k+n-1,2^k))

未命名函数,该bin函数使用miscFuncs包中的函数计算n二进制表示的长度,然后使用OEIS公式之一。

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.