二进角正方形对角线序列


20

二进制正方形对角线序列构造如下:

  1. 取正自然数的序列:
    1,2,3,4,5,6,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. 将它们串联:

    11011100101110111100010011010101111001101111011111000010001 ...

  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. 转换为十进制(忽略前导零):

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

任务

编写以下列方式之一输出序列的程序或函数:

  • 无限返回或打印序列。
  • 给定input i,返回或打印i序列的第一个元素。
  • 给定input i,返回或打印i序列的第th个元素(索引为0或1)。

请在您的答案中说明选择的输出格式。

这是,每种语言中最短的答案将获胜。

测试用例

以下是序列的前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

Answers:


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.

为了清楚起见,我们将nxn正方形的对角线通过将其线性形式分成长度为n + 1的块并检索每个块的第一个元素来提取:

[[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吗?
Erik the Outgolfer'17-10-16

@EriktheOutgolfer:是的,我可以,谢谢!我非常确定这行不通,但这可能是由于较早的解决方案中的问题导致的。相同的字节数,°但速度更快:P
Emigna '17

从1到input ^ 2的数字是不够的。像在python答案中一样输入1到^ 3似乎就足够了。
ovs

@ovs:是的,这就是为什么我以前不使用它。这次我只检查了前几项。我将恢复到以前的解决方案(幸运的是,字节数相同)
Emigna

3

外壳,15个字节

这对马丁的 回答采取了一些不同的方法

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

Python 2,91字节

i=n=1;s=''
while 1:
 s+=bin(i)[2:];i+=1
 if s[n*n:]:print int(s[:n*n:n+1],2);s=s[n*n:];n+=1

在线尝试!

无限打印序列


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

Mathematica,96个字节

输出i序列的第th个元素(1索引)

Diagonal@Partition[TakeList[Flatten@IntegerDigits[Range[#^3],2],Range@#^2][[#]],#]~FromDigits~2&


在线尝试!


1

Perl 5,92 +1(-p)= 93字节

$s.=sprintf'%b',++$"for 1..$_**3;map{say oct"0b".(substr$s,0,$_*$_,'')=~s/.\K.{$_}//gr}1..$_

在线尝试!


1

果冻,18 字节

Erik的解决方案完全不同的方法。

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

在线尝试!

怎么运行的

Ḷ²S'ɓ* 3B€Fṫ-帮助程序链接(单声道)。

Ḷ-降低范围,生成[0,N)。
 ²-矢量化正方形(每个正方形)。
  S-总和
   '-递增,以计入Jelly的1索引编制。
     ɓ-启动一个单独的二元链。
     * 3-3的幂的输入。
       B€-将它们分别转换为二进制。
         F-展平。
          ṫ-尾巴。返回x [y-1:](1索引)。

Çm'ḣµḄ-主链接(单声道)。

Ç-作为单声道的最后一个链接。
 m'-模块化输入+1。获取列表中每个“输入+ 1”个元素。
   ḣ-头。返回上面的元素,其元素的索引高于裁剪的输入。
    µḄ-从二进制转换为整数。

感谢乔纳森·艾伦节省了1个字节!


使用双向链保存一个以删除以下内容³Ḷ²S‘ɓ*3B€Fṫ
Jonathan Allan

@JonathanAllan当然,谢谢!我真的应该学习这个技巧
Xcoder先生,2017年


0

Pyth 27  20字节

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

验证前几个测试用例。

获取的顺序,号码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.
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.