Números binários inclinados

15

Dado um número inteiro n, imprima os primeiros nnúmeros binários inclinados, indexados em 0 ou 1. Eles são chamados assim devido à forma como são gerados:

Escreva números em binário um sob o outro (justificado à direita):

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

Em seguida, você precisa colocar cada diagonal da parte inferior esquerda para a parte superior direita, de modo que cada dígito final seja o dígito final de uma diagonal. Aqui está a quarta diagonal (indexada a zero) marcada com x's, que é 100:

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

As diagonais inclinadas para cima em ordem são:

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

Em seguida, converta para decimal, dando 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

Isso é , então o código mais curto em bytes vence.

mbomb007
fonte
12
Não acho que essa especificação seja muito clara. Eu tive que fazer uma boa leitura externa antes de entender o que estava sendo pedido aqui.
Post Rock Garf Hunter
1
Aqui está uma visualização, se ajudar. Leia os "ovais" de cima para baixo e dentro do oval da parte inferior esquerda para a direita superior. Esses fornecem os números binários que você precisa para converter em decimal.
Pavel
O que você quer dizer com " indexado em 0 ou 1 "? Você quer dizer que um pode gerar o primeiro nou o primeiro n+1número?
SMLS
4
Eu acho que isso pode ter permitido respostas mais interessantes se você tivesse que retornar o n-ésimo valor.
Xnor
1
@PatrickRoberts Eu nunca coloquei um limite de quantos gerar. Eu simplesmente disse "escreva números em binário ...". Você gera quantos você precisar.
mbomb007

Respostas:

3

Gelatina, 11 bytes

ḤḶBUz0ŒDUḄḣ

Experimente online!

Explicação

ḤḶ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.

A transposição é a maneira mais simples de preencher a matriz para que as diagonais incorporadas funcionem. Em seguida, os reversos são adicionados para obter tudo na ordem correta.

PurkkaKoodari
fonte
A implementação da fórmula OEIS também pode ser muito curta no Jelly.
21716 Yytsi
@TuukkaX Pode ser. Estou cansado o suficiente para achar difícil escolher um limite superior para a soma.
PurkkaKoodari
@TuukkaX Eu tentei, mas não vejo isso acontecendo. Tenho certeza que Dennis & co irá implementá-lo em 5 bytes ou mais.
PurkkaKoodari
No momento você tem sorte ;)
geisterfurz007
7

JavaScript (ES6), 53 bytes

n=>[...Array(n)].map(g=(j=1,i)=>j>i?0:j&i|g(j+j,i+1))

Indexado a 0. Não é sempre que eu uso uma função recursiva como parâmetro para map.

Neil
fonte
4

Mathematica, 46 bytes

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

Função sem nome, recebendo um número inteiro não negativo #como entrada e retornando a sequência do índice 0 até o #termo th. Constrói os números binários inclinados usando BitAnd(bit a bit "e") com potências apropriadas de 2.

Greg Martin
fonte
2

Python3, 63 61 bytes

lambda i:[sum(n+k&2**k for k in range(n+1))for n in range(i)]

Usa a fórmula do OEIS.

-2 bytes graças a Luis Mendo ! i+1->i

Yytsi
fonte
Você pode explicar como foi Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kpara a fórmula bit a bit mais simples?
SMLS
@smls Apenas calcula as diagonais para cima diretamente. Na verdade, eu pensei que era mais óbvio que a outra forma.
Neil
1

PHP, 68 bytes

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

recebe entrada do argumento da linha de comando, imprime números separados por sublinhados. Corra com -r.

Titus
fonte
1

MATL , 18 17 bytes

:q"@tt:+5MW\~fWs+

Experimente online!

Isso usa a fórmula do OEIS:

a(n) = n + Sum_{ k in [1 2... n] such that n + k == 0 mod 2^k } 2^k

Código:

: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
Luis Mendo
fonte
0

Perl 6 , 59 43 bytes

{map ->\n{n+sum map {2**$_ if 0==(n+$_)%(2**$_)},1..n},^$_}

{map {sum map {($_+$^k)+&2**$k},0..$_},^$_}

Usa a fórmula da página OESIS.
Atualização: Alternada para a fórmula baseada em bits e baseada na resposta Python do TuukkaX .

Perl 6 , 67 bytes

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

Solução ingênua.
Converte os números que fazem parte da diagonal na base 2, pega o dígito correto de cada um e converte o resultado novamente na base 10.

smls
fonte
0

Gelatina , 15 bytes

2*ḍ+
ḶçЀḶUḄ+Ḷ’

Isso seria mais curto do que a outra resposta Jelly se tivéssemos para imprimir apenas o n º prazo.

Experimente online!

Dennis
fonte
0

R, 66 bytes

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

Função sem nome, que usa a binfunção do miscFuncspacote para calcular o comprimento do nrepresentado em binário e, em seguida, usando uma das fórmulas OEIS.

Billywob
fonte