Chuỗi đường chéo vuông nhị phân


20

Trình tự nhị phân vuông-chéo được xây dựng như sau:

  1. Lấy dãy số tự nhiên dương:
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ...
  2. Chuyển đổi từng số thành nhị phân:

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

  3. Nối chúng:

    11011100101110111100010011010101111001101111011111000010001 ...

  4. Bắt đầu với n=1, tạo các hình vuông với chiều dài tăng dần nđược lấp đầy từ trái sang phải, từ trên xuống dưới với các yếu tố của chuỗi trê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. Lấy đường chéo (trên cùng bên trái xuống dưới bên phải) của mỗi hình vuông:

    1, 11, 100, 1011, 00111, ...

  6. Chuyển thành số thập phân (bỏ qua các số 0 đứng đầu):

    1, 3, 4, 11, 7, ...

Bài tập

Viết chương trình hoặc hàm tạo ra chuỗi theo một trong các cách sau:

  • Trả lại hoặc in trình tự vô hạn.
  • Cho đầu vào i, trả lại hoặc in các iphần tử đầu tiên của chuỗi.
  • Cho đầu vào i, trả về hoặc in iphần tử thứ của chuỗi (0 hoặc 1 được lập chỉ mục).

Vui lòng nêu trong câu trả lời của bạn mà bạn chọn định dạng đầu ra.

Đây là , câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.

Các trường hợp thử nghiệm

Dưới đây là 50 yếu tố đầu tiên của chuỗi:

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

Câu trả lời:


10

Husk , 15 14 byte

zȯḋm←CtNCİ□ṁḋN

Hãy thử trực tuyến!

Liên tục in kết quả dưới dạng một danh sách vô hạn.

Giải trình

Tôi tự hỏi liệu có cách nào tốt hơn để lấy mọi phần tử thứ n từ một danh sách hơn là chia danh sách thành các phần có độ dài n và lấy phần đầu của mỗi phầ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.

Để rõ ràng, chúng tôi trích xuất đường chéo của một hình vuông nxn bằng cách chia dạng tuyến tính của nó thành các đoạn có độ dài n + 1 và lấy phần tử đầu tiên của mỗi khối:

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



4

05AB1E , 19 17 16 byte

°LbJsLn£θs>ô€нJC

°được thay thế bởi 3mtrong các liên kết vì °có xu hướng rất chậm.

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

°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

Bạn không thể thay thế 3mbằng n?
Erik the Outgolfer

@EriktheOutgolfer: Vâng tôi có thể, cảm ơn! Tôi khá chắc chắn rằng nó không hoạt động, nhưng điều đó có thể là do kinks trong một giải pháp trước đó. Cùng một byte được tính °nhưng nhanh hơn nhiều: P
Emigna

Các số từ 1 đến đầu vào ^ 2 là không đủ . 1 đến đầu vào ^ 3 như trong câu trả lời python dường như là đủ.
trứng

@ovs: À đúng rồi, đó là lý do tại sao tôi không sử dụng nó trước đây. Tôi chỉ kiểm tra vài mục đầu tiên lần này. Tôi sẽ trở lại giải pháp trước đó (may mắn là có cùng số byte)
Emigna

3

Husk , 15 byte

Điều này có một cách tiếp cận hơi khác với câu trả lời của Martin

moḋz!NCNCṘNNṁḋN

Hãy thử trực tuyến!

Giải trình:

              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

Trong hành động

ṁḋ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 byte

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);}

Hãy thử trực tuyến!




2

Thạch , 16 byte

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

Hãy thử trực tuyến!

Giải trình

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

Toán học, 96 byte

Kết quả đầu ra các inguyên tố thứ của dãy (1-lập chỉ mục)

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


Hãy thử trực tuyến!



1

Thạch , 18 byte

Cách tiếp cận hoàn toàn khác so với giải pháp của Erik .

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ḷ²S'ɓ * 3B € Fṫ - Liên kết trợ giúp (đơn âm).

Ḷ - Phạm vi hạ thấp, tạo [0, N).
 ² - Vectorized vuông (mỗi hình vuông).
  S - Tổng.
   '- Tăng, để tính đến việc lập chỉ mục 1 của Jelly.
     - Bắt đầu một chuỗi dyadic riêng biệt.
     * 3 - Đầu vào cho sức mạnh của 3.
       B € - Chuyển đổi từng thành nhị phân.
         F - Làm phẳng.
          - Đuôi. Trả về x [y - 1:] (1 chỉ mục).

Çm'ḣḣ - Liên kết chính (đơn âm).

- Liên kết cuối cùng là một đơn nguyên.
 m '- Đầu vào mô-đun + 1. Nhận từng phần tử "đầu vào + 1" của danh sách.
   ḣ - Đầu. Trả về phần trên với các phần tử có chỉ số cao hơn phần được cắt.
    Tập hợp - Chuyển đổi từ nhị phân sang số nguyên.

Lưu được 1 byte nhờ Jonathan Allan !


Lưu một cái bằng cách sử dụng chuỗi dyadic để xóa ³:Ḷ²S‘ɓ*3B€Fṫ
Jonathan Allan

@Jonathan ALLan Tất nhiên, cảm ơn! Tôi thực sự nên học mẹo đó
Ông Xcoder


0

Bình thường ,  27  20 byte

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

Xác nhận một vài trường hợp thử nghiệm đầu tiên.

Có được thuật ngữ thứ I của chuỗi, 1 được lập chỉ mục.

Làm thế nào nó hoạt động?

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.