バイナリスクエアダイアゴナルシーケンス


20

バイナリ平方対角線シーケンスは次のように構成されています。

  1. 正の自然数のシーケンスを取ります。
    1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、...
  2. 各数値をバイナリに変換します:

    1、10、11、100、101、110、111、1000、1001、1010、1011、1100、1101、1110、1111、10000、10001、...

  3. それらを連結します。

    11011100101110111100010001010101111001101111011111000010001 ...

  4. で始まり、上記のシーケンスの要素で左から右、上から下に満たされるn=1辺の長さnが増加する正方形を生成します。

    1
    1 0
    1 1
    1 0 0 
    1 0 1
    1 1 0
    1 1 1 1
    0 0 0 1
    0 0 1 1 
    0 1 0 1
    0 1 1 1 1
    0 0 1 1 0
    1 1 1 1 0
    1 1 1 1 1
    0 0 0 0 1
    ...

  5. 各正方形の対角線(左上から右下)を取得します。

    1、11、100、1011、00111、...

  6. 10進数に変換(先行ゼロを無視):

    1、3、4、11、7、...

仕事

次のいずれかの方法でシーケンスを出力するプログラムまたは関数を作成します。

  • シーケンスを無限に返すか印刷します。
  • inputを指定すると、シーケンスのi最初のi要素を返すか出力します。
  • inputを指定すると、シーケンスのth要素(0または1のインデックス付き)をi返すか出力しiます。

選択した出力形式を回答に明記してください。

これはであり、各言語で最も短い答えが勝ちです。

テストケース

シーケンスの最初の50要素は次のとおりです。

1,3,4,11,7,29,56,141,343,853,321,3558,8176,3401,21845,17129,55518,134717,151988,998642,1478099,391518,7798320,8530050,21809025,61485963,66846232,54326455,221064493,256373253,547755170,4294967295,1875876391,2618012644,24710258456,6922045286,132952028155,217801183183,476428761596,51990767390,687373028085,1216614609441,7677215985062,15384530216172,22714614479340,15976997237789,0,256145539974868,532024704777005,601357273478135

回答:


10

ハスク15 14バイト

zȯḋm←CtNCİ□ṁḋN

オンラインでお試しください!

結果を無限リストとして継続的に印刷します。

説明

リストを長さnのチャンクに分割し、各チャンクのヘッドを取得するよりも、リストからn番目ごとの要素を取得するより良い方法があるのだろうかと思います。

      tN          Get a list of all natural numbers except 1. (A)

             N    Get a list of all natural numbers.
           ṁḋ     Convert each to its binary representation and join them 
                  all into a single list.
         İ□       Get a list of squares of all natural numbers.
        C         Cut the list of bits into chunks of corresponding sizes. (B)

zȯ                Zip (A) and (B) together with the following function.
     C            Split the bit list (from B) into chunks of the given length
                  (from A).
   m←             Get the head of each chunk. This is the diagonal of the
                  bit list arranged as a square.
  ḋ               Interpret the resulting bits as binary digits and return
                  the result.

明確にするために、線形形式を長さn + 1のチャンクに分割し、各チャンクの最初の要素を取得することにより、nxn正方形の対角線を抽出します。

[[1 , 0 , 1 , 0
  0],[1 , 0 , 1
  1 , 0],[1 , 0
  0 , 1 , 0],[1]]



4

05AB1E19 17 16バイト

°LbJsLn£θs>ô€нJC

°非常に遅くなる傾向があるため3m、リンクでに置き換えられます°

オンラインでお試しください! またはテストスイートとして

説明

°L                 # push the range [1 ... 10^input]
  bJ               # convert each to binary and join to string
    sLn            # push the range [1 ... input]^2
       £θ          # split the binary string into pieces of these sizes and take the last
         s>ô       # split this string into chunks of size (input+1)
            €н     # get the first digit in each chunk
              JC   # join to string and convert to int

あなたは置き換えることはできません3mn
エリックアウトゴルファー

@EriktheOutgolfer:はい、できます、ありがとう!私はそれがうまくいかなかったと確信していましたが、それは以前のソリューションのねじれによるものかもしれません。バイトカウントと同じです°が、はるかに高速です:P
Emigna

1からinput ^ 2までの数字では不十分です。pythonの回答のように1からinput ^ 3で十分なようです。
ovs

@ovs:ああ、そういうわけで、以前は使用していませんでした。今回は最初の数項目のみをチェックしました。以前のソリューションに戻ります(
残念

3

、15バイト

これは、Martinの 答えに対してやや異なるアプローチを取ります

moḋz!NCNCṘNNṁḋN

オンラインでお試しください!

説明:

              N   List of all natural numbers
            ṁḋ    Convert each to it's binary representation and flatten
         ṘNN      Repeat the list of natural numbers according the natural numbers:
                  [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5...]
        C         Cut the list of bits into lists of lengths corresponding to the above
      CN          Cut that list into lists of lengths corresponding to the natural numbers
moḋz!N            For each in the list, get the diagonals and convert from binary.
m                   For each list in the list
   z!N              Zip it with natural numbers, indexing.
 oḋ                 Convert to binary

動作中

ṁḋN[1,1,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1...]

ṘNN[1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8...]

C[[1],[1,0],[1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1,1],[0,0,0,1]...]

CN[[[1]],[[1,0],[1,1]],[[1,0,0],[1,0,1],[1,1,0]]...]

m z!N[[1],[1,1],[1,0,0],[1,0,1,1],[0,0,1,1,1],[0,1,1,1,0,1]...]

oḋ[1,3,4,11,7,29,56,141,343,853,321,3558,8176,3401,21845...]


3

Java(OpenJDK 8)215 212 206 202 197バイト

i->{String b="",t;int s=0,x=++i,j;for(;--x>0;s+=x*x);while(b.length()<s)b+=i.toString(++x,2);for(j=1,s=0;j<i;System.out.println(i.valueOf(t,2)),s+=j*j++)for(t="",x=s;x<s+j*j;x+=j+1)t+=b.charAt(x);}

オンラインでお試しください!




2

ゼリー、16バイト

RBFṁ
R²SÇṫ²C$m‘Ḅ

オンラインでお試しください!

説明

RBFṁ  Helper link. Input: integer k
R     Range, [1, 2, ..., k]
 B    Convert each to a list of its binary digits
  F   Flatten
   ṁ  Mold to length k

R²SÇṫ²C$m‘Ḅ  Main link. Input: integer n
R            Range, [1, 2, ..., n]
 ²           Square each
  S          Sum
   Ç         Call helper link on the sum of the first n squares
       $     Monadic chain
     ²         Square n
      C        Complement, 1-n^2
    ṫ        Tail, take the last n^2 elements
        m    Modular indexing, take each
         ‘   (n+1)th element
          Ḅ  Convert from list of binary digits to decimal



1

ゼリー、18 バイト

エリックのソリューションとはまったく異なるアプローチ。

Ḷ²S‘ɓ*3B€Fṫ
Çm‘ḣµḄ

オンラインでお試しください!

使い方

Ḷ²S'ɓ* 3B€Fṫ-ヘルパーリンク(単項)。

Ḷ-範囲を下げ、[0、N)を生成します。
 ²-ベクトル化された正方形(それぞれ正方形)。
  S-合計。
   '-増分、Jellyの1インデックスを説明します。
     ɓ-別のダイアディックチェーンを開始します。
     * 3-3のべき乗の入力。
       B€-それぞれをバイナリに変換します。
         F-フラット化。
          ṫ-テール。x [y-1:](1-indexed)を返します。

Çm'ḣµḄ-メインリンク(単項)。

Ç-モナドとしての最後のリンク。
 m '-モジュラー入力+1。リストの各「入力+ 1」番目の要素を取得します。
   ḣ-頭。入力を切り取ったよりも高いインデックスの要素で上記を返します。
    µḄ-バイナリから整数に変換します。

ジョナサンアランのおかげで1バイト節約できました!


削除するには、ダイアディックチェーンを使用して1保存³Ḷ²S‘ɓ*3B€Fṫ
ジョナサン・アラン

@JonathanAllanもちろん、ありがとう!私は本当にトリックを学ぶべきである
氏Xcoder


0

Pyth 27  20バイト

i<%hQ>s.BS^Q3s^R2QQ2

最初のいくつかのテストケースを確認します。

シーケンスのI番目の項を取得します(1インデックス付き)。

使い方?

i<%hQ>s.BS^Q3s^R2QQ2   - Full program. Q represents the input.

         S^Q3          - Generate the (inclusive) range [1, Q ^ 3].
       .B              - Convert each to binary.
      s                - Join into a single string.
     >                 - Trim all the elements at indexes smaller than:
               ^R2Q      - The elements of the range [0, Q) squared.
              s          - And summed.
  %hQ                  - Get each Q + 1 element of the list above.
 <                     - Trim all the elements at indexes higher than:
                   Q   - The input.
i                   2  - Convert from binary to integer.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.