Pochyłe liczby binarne


15

Biorąc pod uwagę liczbę całkowitą n, wypisz pierwsze npochylone liczby binarne, indeksowane 0 lub 1. Nazywa się to tak, ponieważ są generowane:

Pisz pod sobą liczby binarne (wyrównane do prawej):

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

Następnie musisz poprowadzić każdą przekątną od lewej dolnej do prawej górnej, tak aby każda ostatnia cyfra była ostatnią cyfrą przekątnej. Oto czwarta przekątna (zero-indeksowana) oznaczona x„s”, która jest 100:

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

Ukośne nachylenie w górę to:

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

Następnie przelicz na dziesiętne, podając 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

To jest , więc wygrywa najkrótszy kod w bajtach.


12
Nie sądzę, że ta specyfikacja jest bardzo jasna. Musiałem zrobić dużo zewnętrznego czytania, zanim zrozumiałem, o co tu pytano.
Post Rock Garf Hunter

1
Oto wizualizacja, jeśli to pomaga. Przeczytaj „owale” od góry do dołu i wewnątrz owalu od dołu od lewej do prawej u góry. Dają ci liczby binarne, które musisz przekonwertować na dziesiętne.
Pavel

Co masz na myśli mówiącindeksowane 0 lub 1 ”? Czy masz na myśli, że można wypisać pierwszą nlub pierwszą n+1liczbę?
smls,

4
Myślę, że mogłoby to pozwolić na bardziej interesujące odpowiedzi, gdybyś musiał zwrócić n-tą wartość.
xnor

1
@PatrickRoberts Nigdy nie ograniczam liczby generowanych. Powiedziałem po prostu „pisz liczby w formacie binarnym ...”. Generujesz tyle, ile potrzebujesz.
mbomb007

Odpowiedzi:


3

Galaretka, 11 bajtów

ḤḶBUz0ŒDUḄḣ

Wypróbuj online!

Wyjaśnienie

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

Transpozycja jest najprostszym sposobem na uzupełnienie tablicy dla wbudowanych przekątnych do działania. Następnie dodaje się rewersy, aby uzyskać wszystko we właściwej kolejności.


Wdrożenie formuły OEIS może być bardzo krótkie w przypadku Galaretki.
Yytsi

@TuukkaX Może być. Jestem na tyle zmęczony, że ciężko wybrałem górny limit sumy.
PurkkaKoodari

@TuukkaX Próbowałem, ale nie widzę, żeby to się działo. Jestem pewien, że Dennis & co zaimplementuje go w około 5 bajtach.
PurkkaKoodari,


7

JavaScript (ES6), 53 bajty

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

0-indeksowane. Nie często używam funkcji rekurencyjnej jako parametru map.


4

Mathematica, 46 bajtów

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

Nienazwana funkcja przyjmująca nieujemną liczbę całkowitą #jako dane wejściowe i zwracająca sekwencję 0 indeksów do# th. Konstruuje pochyłe liczby binarne za pomocą BitAnd(bitowego "i") z odpowiednimi potęgami 2.


2

Python3, 63 61 bajtów

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

Korzysta z formuły z OEIS.

-2 bajty dzięki Luisowi Mendo ! i+1->i


Czy możesz wyjaśnić, jak przeszedłeś Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kdo tej prostszej formuły bitowej?
smls,

@smls To po prostu oblicza bezpośrednio przekątne w górę. Myślałem, że to bardziej oczywiste niż druga forma.
Neil,

1

PHP, 68 bajtów

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

pobiera dane z argumentu wiersza poleceń, drukuje liczby oddzielone podkreślnikami. Uruchom z -r.


1

MATL , 18 17 bajtów

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

Wypróbuj online!

Wykorzystuje to wzór z OEIS:

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

Kod:

: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 bajtów

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

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

Korzysta z formuły ze strony OESIS.
Aktualizacja: zmieniono na formułę bitową i opartą na odpowiedzi Python TuukkaX .

Perl 6 , 67 bajtów

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

Naiwne rozwiązanie.
Konwertuje liczby, które są częścią przekątnej na bazę 2, pobiera poprawną cyfrę każdej z nich i konwertuje wynik z powrotem na bazę 10.



0

R, 66 bajtów

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

Funkcja bez nazwy, która używa binfunkcji z miscFuncspakietu do obliczania długości nreprezentowanej w postaci binarnej, a następnie przy użyciu jednej z formuł OEIS.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.