Наклонные двоичные числа

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

Это , поэтому выигрывает самый короткий код в байтах.

mbomb007
источник
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.

Транспонирование - это самый простой способ дополнить массив для работы встроенных диагоналей. Затем реверсы добавляются, чтобы получить все в правильном порядке.

PurkkaKoodari
источник
Реализация формулы OEIS также может быть очень короткой в ​​желе.
Yytsi
@TuukkaX Может быть. Я достаточно устал, чтобы найти верхний предел для суммы трудно.
PurkkaKoodari
@TuukkaX Я попробовал, но не вижу, чтобы это случилось. Я уверен, что Dennis & co выполнит это в 5 байтах или около того.
PurkkaKoodari
На данный момент вам повезло ;)
geisterfurz007
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

Mathematica, 46 байт

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

Безымянная функция, принимающая неотрицательное целое число в #качестве входных данных и возвращающая последовательность с 0 индексами вплоть до #th-го члена. Создает наклонные двоичные числа, используя 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

Yytsi
источник
Можете ли вы объяснить, как вы перешли Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kк этой более простой побитовой формуле?
Смс
@smls Просто вычисляет прямые диагонали. Я действительно думал, что это было более очевидно, чем другая форма.
Нил
1

PHP, 68 байт

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

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

Titus
источник
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.
Обновление: переключен на побитовую и основанную формулу из Python ответа TuukkaX .

Perl 6 , 67 байт

{map {:2(flip [~] map {.base(2).flip.comb[$++]//""},$_..2*$_)},^$_}

Наивное решение.
Преобразует числа, являющиеся частью диагонали, в основание 2, берет правильные цифры каждого и преобразует результат обратно в основание 10.

SMLS
источник
0

R, 66 байт

function(n,k=0:length(miscFuncs::bin(n-1)))sum(bitwAnd(k+n-1,2^k))

Безымянная функция, которая использует binфункцию из miscFuncsпакета для вычисления длины, nпредставленной в двоичном формате, а затем с помощью одной из формул OEIS.

Billywob
источник