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.

mbomb007
źródło
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.

PurkkaKoodari
źródło
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,
Obecnie masz szczęście ;)
geisterfurz007
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.

Neil
źródło
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.

Greg Martin
źródło
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

Yytsi
źródło
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.

Tytus
źródło
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
Luis Mendo
źródło
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.

smls
źródło
0

Galaretka , 15 bajtów

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

Byłoby to krócej niż druga odpowiedź Jelly, gdybyśmy musieli wydrukować tylko n- ty termin.

Wypróbuj online!

Dennis
źródło
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.

Billywob
źródło