Schräge Binärzahlen

15

Geben Sie bei einer Ganzzahl ndie ersten ngeneigten Binärzahlen aus, entweder 0- oder 1-indiziert. Sie werden so genannt, weil sie so erzeugt werden:

Zahlen in Binärschrift untereinander schreiben (rechtsbündig):

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

Dann müssen Sie jede Diagonale von links unten nach rechts oben nehmen, sodass jede letzte Ziffer die letzte Ziffer einer Diagonale ist. Hier ist die vierte Diagonale (mit Nullindex), die mit x's markiert ist 100:

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

Die aufwärts geneigten Diagonalen in der Reihenfolge sind:

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

Dann konvertieren Sie in eine Dezimalzahl und geben 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

Das ist , also gewinnt der kürzeste Code in Bytes.

mbomb007
quelle
12
Ich denke nicht, dass diese Spezifikation sehr klar ist. Ich musste viel extern lesen, bevor ich verstehen konnte, was hier gefragt wurde.
Wheat Wizard
1
Ist hier eine Sichtbarmachung, wenn sie hilft. Lesen Sie die "Ovale" von oben nach unten und innerhalb des Ovals von links unten nach rechts oben. Diese geben Ihnen die Binärzahlen, die Sie in Dezimalzahlen konvertieren müssen.
Pavel
Was meinst du mit " entweder 0- oder 1-indiziert "? Meinen Sie damit, dass man entweder die erste noder die erste n+1Zahl ausgeben darf ?
smls
4
Ich denke, das hätte interessantere Antworten ermöglichen können, wenn Sie nur den n-ten Wert zurückgeben müssten.
Xnor
1
@PatrickRoberts Ich habe nie eine Grenze gesetzt, wie viele generiert werden sollen. Ich sagte einfach "schreibe Zahlen in Binär ...". Sie generieren so viele, wie Sie benötigen.
mbomb007

Antworten:

3

Jelly, 11 Bytes

ḤḶBUz0ŒDUḄḣ

Probieren Sie es online!

Erläuterung

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

Die Transponierung ist der einfachste Weg, das Array mit den eingebauten Diagonalen zu füllen. Dann werden die Umkehrungen hinzugefügt, um alles in der richtigen Reihenfolge zu erhalten.

PurkkaKoodari
quelle
Die Implementierung der OEIS-Formel in Jelly könnte auch sehr kurz sein.
Yytsi
@ TuukkaX Könnte sein. Ich bin müde genug, um eine Obergrenze für die Summe schwer zu finden.
PurkkaKoodari
@ TuukkaX Ich habe es versucht, aber ich sehe es nicht. Ich bin sicher, Dennis & Co wird es in 5 Bytes oder so implementieren.
PurkkaKoodari
Derzeit haben Sie Glück ;)
geisterfurz007 Stoppen Sie dieses Chaos
7

JavaScript (ES6), 53 Byte

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

0-indiziert. Es kommt nicht oft vor, dass ich eine rekursive Funktion als Parameter benutze map.

Neil
quelle
4

Mathematica, 46 Bytes

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

Unbenannte Funktion, die eine nichtnegative Ganzzahl #als Eingabe verwendet und die 0-Index-Sequenz bis zum #dritten Ausdruck zurückgibt. Konstruiert die abfallenden Binärzahlen unter Verwendung von BitAnd(bitweise "und") mit entsprechenden Potenzen von 2.

Greg Martin
quelle
2

Python3, 63 61 Bytes

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

Verwendet die Formel von OEIS.

-2 Bytes dank Luis Mendo ! i+1->i

Yytsi
quelle
Können Sie erklären, wie Sie Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kzu dieser einfacheren bitweisen Formel gekommen sind?
smls
@smls Es werden nur die Aufwärtsdiagonalen direkt berechnet. Ich dachte eigentlich, es sei offensichtlicher als die andere Form.
Neil
1

PHP, 68 Bytes

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

Nimmt Eingaben vom Befehlszeilenargument entgegen und gibt durch Unterstriche getrennte Zahlen aus. Laufen Sie mit -r.

Titus
quelle
1

MATL , 18 17 Bytes

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

Probieren Sie es online!

Dies verwendet die Formel von OEIS:

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

Code:

: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
quelle
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..$_},^$_}

Verwendet die Formel von der OESIS-Seite.
Update: Von TuukkaXs Python-Antwort auf die bitweise und basierte Formel umgestellt .

Perl 6 , 67 Bytes

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

Naive Lösung.
Konvertiert die Zahlen, die Teil der Diagonale sind, zur Basis 2, nimmt die richtige Ziffer von jeder und konvertiert das Ergebnis zurück zur Basis 10.

smls
quelle
0

Gelee , 15 Bytes

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

Dies wäre kürzer als die andere Jelly-Antwort, wenn wir nur den n- ten Term drucken müssten .

Probieren Sie es online!

Dennis
quelle
0

R, 66 Bytes

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

Unbenannte Funktion, die die binFunktion aus dem miscFuncsPaket verwendet, um die Länge der nBinärdarstellung zu berechnen und dann eine der OEIS-Formeln zu verwenden.

Billywob
quelle