Діагональна послідовність двійкової площі


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. Об’єднайте їх:

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

Завдання

Напишіть програму або функцію, яка виводить послідовність одним із наступних способів:

  • Повертайте або друкуйте послідовність нескінченно.
  • Дано введення i, повернення або друк перших iелементів послідовності.
  • Дано введення i, поверніть або роздрукуйте цей iелемент послідовності (або 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

Відповіді:


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

05AB1E , 19 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

Ви не можете замінити 3mїх n?
Erik the Outgolfer

@EriktheOutgolfer: Так, можу, спасибі! Я був майже впевнений, що це не спрацювало, але це, можливо, було пов’язано з перемичками в попередньому рішенні. °
Цей

Чисел від 1 до входу ^ 2 недостатньо . 1 для введення ^ 3, як у відповіді python, здається, достатньо.
ов

@ovs: Ага так, тому я раніше не користувався цим. Цього разу я перевірив лише перші пару предметів. Я повернусь до попереднього рішення (на щастя, при тому ж байті)
Емінья

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

Желе , 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 - сума.
   '- приріст для обліку 1-індексації желе.
     ɓ - запускає окремий діадічний ланцюг.
     * 3 - Вхід до потужності 3.
       B € - Перетворення кожного у двійкове.
         F - Згладжувати.
          ṫ - Хвіст. Повернення x [y - 1:] (1-індексований).

Çm'ḣµḄ - Головна посилання (монадійна).

Ç - Останнє посилання як монада.
 m '- модульний вхід + 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.