Numeri binari inclinati


15

Dato un numero intero n, genera i primi nnumeri binari inclinati, indicizzati 0 o 1. Si chiamano così per come sono generati:

Scrivi i numeri in binario l'uno sotto l'altro (giustificato a destra):

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

Quindi, devi prendere ogni diagonale da in basso a sinistra a in alto a destra, in modo tale che ogni cifra finale sia la cifra finale di una diagonale. Ecco la quarta diagonale (indicizzata con zero) contrassegnata con x's, che è 100:

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

Le diagonali inclinate verso l'alto in ordine sono:

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

Quindi, converti in decimale, dando 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

Questo è , quindi vince il codice più breve in byte.


12
Non credo che questa specifica sia molto chiara. Ho dovuto fare molte letture esterne prima di poter capire cosa mi veniva chiesto qui.
Post Rock Garf Hunter,

1
Ecco una visualizzazione, se aiuta. Leggi gli "ovali" dall'alto verso il basso e all'interno dell'ovale dal basso a sinistra verso l'alto a destra. Questi ti danno i numeri binari che devi convertire in decimali.
Pavel,

Che cosa vuoi dire con " indicizzato 0 o 1 "? Vuoi dire che uno può produrre il primo no il primo n+1numero?
smls

4
Penso che ciò avrebbe potuto consentire risposte più interessanti se si dovesse semplicemente restituire l'ennesimo valore.
xnor

1
@PatrickRoberts Non ho mai messo un limite al numero da generare. Ho semplicemente detto "scrivi numeri in binario ...". Ne generi quante ne hai bisogno.
mbomb007,

Risposte:


3

Gelatina, 11 byte

ḤḶBUz0ŒDUḄḣ

Provalo online!

Spiegazione

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

La trasposizione è il modo più semplice per riempire l'array affinché le diagonali integrate funzionino. Quindi vengono aggiunti i rovesci per ottenere tutto nell'ordine corretto.


L'implementazione della formula OEIS potrebbe anche essere molto breve in Jelly.
Yytsi il

@TuukkaX Potrebbe essere. Sono abbastanza stanco da trovare difficile scegliere un limite superiore per la somma.
PurkkaKoodari il

@TuukkaX L'ho provato, ma non lo vedo accadere. Sono sicuro che Dennis & co lo implementeranno in circa 5 byte.
PurkkaKoodari,


7

JavaScript (ES6), 53 byte

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

0-indicizzati. Non capita spesso di usare una funzione ricorsiva come parametro per map.


4

Mathematica, 46 byte

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

Funzione senza nome che accetta un intero non negativo #come input e restituisce la sequenza di indice 0 fino al #termine. Costruisce i numeri binari inclinati usando BitAnd(bit a bit "e") con potenze appropriate di 2.


2

Python3, 63 61 byte

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

Utilizza la formula di OEIS.

-2 byte grazie a Luis Mendo ! i+1->i


Puoi spiegare come sei passato da Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kquella formula bit per bit più semplice?
smls

@smls Calcola direttamente le diagonali verso l'alto. In realtà ho pensato che fosse più ovvio dell'altra forma.
Neil,

1

PHP, 68 byte

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

accetta input dall'argomento della riga di comando, stampa i numeri separati da caratteri di sottolineatura. Corri con -r.


1

MATL , 18 17 byte

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

Provalo online!

Questo utilizza la formula di OEIS:

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

Codice:

: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 byte

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

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

Utilizza la formula dalla pagina OESIS.
Aggiornamento: passato alla formula bit per bit e basata dalla risposta Python di TuukkaX .

Perl 6 , 67 byte

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

Soluzione ingenua.
Converte i numeri che fanno parte della diagonale in base 2, prende la cifra corretta di ciascuno e converte il risultato in base 10.


0

Gelatina , 15 byte

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

Questo sarebbe più corta dell'altra risposta Jelly se abbiamo dovuto stampare solo il n ° periodo.

Provalo online!


0

R, 66 byte

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

Funzione senza nome che utilizza la binfunzione dal miscFuncspacchetto per calcolare la lunghezza del nrappresentato in binario e quindi utilizzando una delle formule OEIS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.