傾斜2進数


15

整数を指定するとnn0インデックスまたは1インデックスの最初の傾斜2進数を出力します。それらは、それらがどのように生成されるかからこれと呼ばれます:

数字を上下にバイナリで書きます(右揃え):

........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
.......

次に、10進数に変換して、 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

これはであるため、バイト単位の最短コードが優先されます。


12
この仕様はあまり明確ではないと思います。ここで何が求められているのか理解する前に、私はたくさんの外部の読書をしなければなりませんでした。
ポストロックガーフハンター

1
それが役立つ場合、ここに視覚化があります。「楕円」を上から下へ、楕円内で左下から右上へ読みます。これらは、10進数に変換する必要がある2進数を提供します。
パベル

0または1のインデックス付き」とはどういう意味ですか?n最初のn+1数字または最初の数字のいずれかを出力できるということですか?
smls 16

4
n番目の値を返さなければならなかった場合、これによりもっと興味深い答えが得られたと思います。
XNOR

1
@PatrickRoberts生成する数に制限を設けません。私は単に「バイナリで数字を書く...」と言いました。必要な数だけ生成します。
mbomb007 16

回答:


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.

転置は、組み込みの対角線が機能するように配列をパディングする最も簡単な方法です。次に、すべてを正しい順序で取得するために逆が追加されます。


OEISフォーミュラの実装もJellyで非常に短いかもしれません。
Yytsi 16

@TuukkaXかもしれない。合計の上限を選ぶのが難しいと思うほど疲れています。
PurkkaKoodari 16

@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}]&

#入力として非負の整数を取り、#th項までの0インデックスシーケンスを返す名前のない関数。BitAnd適切な2のべき乗で(ビット単位の "and")を使用して、傾斜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バイト!i+1->i


Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kその単純なビット式にどのように移行したのか説明できますか?
smls 16

@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式のいずれかを使用。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.