Похилі двійкові числа


15

Враховуючи ціле число n, виведіть перші nпохилі двійкові числа, 0 або 1-індексовані. Вони називаються цим через те, як вони генеруються:

Запишіть числа у двійковій формі один під одним (правильно виправдано):

........0
........1
.......10
.......11
......100
......101
......110
......111
.....1000
.........

Потім потрібно взяти кожну діагональ зліва-вліво-вправо, таким чином, щоб кожна кінцева цифра була кінцевою цифрою діагоналі. Ось четверта діагональ (нульова індексація), позначена символом x's, а саме 100:

........0
........1
.......10
.......11
......10x
......1x1
......x10
......111
.....1000
.........

Діагоналі вгору похилі в порядку:

0
11
110
101
100
1111
1010
.......

Потім перетворіть у десятковий, даючи 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

Це , тому виграє найкоротший код у байтах.


12
Я не думаю, що ця специфікація є дуже зрозумілою. Мені довелося зробити багато зовнішнього читання, перш ніж я зрозумів, про що тут питають.
Пост Рок-Гарф Мисливець

1
Ось візуалізація, якщо це допоможе. Прочитайте "овали" зверху вниз, а в межах овалу знизу вліво вгорі праворуч. Вони дають вам двійкові числа, які потрібно перетворити в десяткові.
Павло

Що ви маєте на увазі " 0 або 1-індексований "? Ви маєте на увазі, що можна вивести або перше, nабо перше n+1число?
smls

4
Я думаю, що це могло б дати більш цікаві відповіді, якби вам просто довелося повернути n-е значення.
xnor

1
@PatrickRoberts Я ніколи не ставив обмеження на кількість створення. Я просто сказав "записуйте числа у двійковій формі ...". Ви генеруєте стільки, скільки вам потрібно.
mbomb007

Відповіді:


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

@TuukkaX Можливо, буде. Я досить втомився, щоб важко підібрати верхню межу для суми.
PurkkaKoodari

@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

Математика, 46 байт

Plus@@@Table[BitAnd[n+k,2^k],{n,0,#},{k,0,n}]&

Безіменна функція, яка приймає #як вхідне невід’ємне ціле число і повертає 0-індексну послідовність до першого числа #. Побудує похилі двійкові числа за допомогою BitAnd(порозрядних "та") з відповідними потужностями 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

@smls Він просто обчислює діагоналі вгору безпосередньо. Я насправді вважав це більш очевидним, ніж інші форми.
Ніл

1

PHP, 68 байт

for(;$n++<$argv[1];print$s._)for($s=$i=0;$i<$n;)$s|=$n+$i-1&1<<$i++;

приймає вхід з аргументу командного рядка, друкує числа, розділені підкресленнями. Бігайте з -r.


1

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

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.