Số nhị phân dốc


15

Cho một số nguyên n, xuất ra các nsố nhị phân dốc đầu tiên , 0 hoặc 1 được lập chỉ mục. Chúng được gọi như vậy vì cách chúng được tạo:

Viết các số nhị phân dưới nhau (hợp lý):

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

Sau đó, bạn cần lấy từng đường chéo từ dưới cùng bên trái sang trên cùng bên phải, sao cho mỗi chữ số cuối cùng là chữ số cuối cùng của một đường chéo. Đây là đường chéo thứ tư (không có chỉ mục) được đánh dấu bằng x's, đó là 100:

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

Các đường chéo dốc lên theo thứ tự là:

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

Sau đó, chuyển đổi thành số thập phân, cho 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


12
Tôi không nghĩ rằng đặc điểm kỹ thuật này là rất rõ ràng. Tôi đã phải làm rất nhiều việc đọc bên ngoài trước khi tôi có thể hiểu những gì đang được hỏi ở đây.
Đăng Rock Garf Hunter

1
Đây là một hình dung, nếu nó giúp. Đọc "hình bầu dục" từ trên xuống dưới và trong hình bầu dục từ dưới trái sang trên phải. Những số này cung cấp cho bạn các số nhị phân bạn cần chuyển đổi thành số thập phân.
Pavel

Ý bạn là gì, " 0 hoặc 1-index "? Bạn có nghĩa là người ta có thể xuất số đầu tiên nhoặc n+1số đầu tiên ?
smls

4
Tôi nghĩ rằng điều này có thể đã cho phép câu trả lời thú vị hơn nếu bạn phải trả về giá trị thứ n.
xnor

1
@PatrickRoberts Tôi không bao giờ đặt giới hạn về số lượng tạo. Tôi chỉ đơn giản nói "viết số trong nhị phân ...". Bạn tạo ra nhiều như bạn cần.
mbomb007

Câu trả lời:


3

Thạch, 11 byte

ḤḶBUz0ŒDUḄḣ

Hãy thử trực tuyến!

Giải trình

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

Transpose là cách đơn giản nhất để đệm mảng cho các đường chéo dựng sẵn hoạt động. Sau đó, đảo ngược được thêm vào để có được mọi thứ theo đúng thứ tự.


Việc triển khai công thức OEIS cũng có thể rất ngắn trong Jelly.
Yytsi

@TuukkaX Có thể. Tôi đủ mệt mỏi để tìm một giới hạn trên cho tổng số khó khăn.
PurkkaKoodari

@TuukkaX Tôi đã thử nó, nhưng tôi không thấy nó xảy ra. Tôi chắc chắn Dennis & co sẽ triển khai nó trong 5 byte hoặc lâu hơn.
PurkkaKoodari


7

JavaScript (ES6), 53 byte

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

Chỉ số 0. Tôi không thường xuyên sử dụng hàm đệ quy làm tham số map.


4

Toán học, 46 byte

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

Hàm không tên lấy một số nguyên không âm #làm đầu vào và trả về chuỗi 0 chỉ mục cho đến số hạng #thứ. Xây dựng các số nhị phân dốc bằng cách sử dụng BitAnd(bitwise "và") với quyền hạn thích hợp là 2.


2

Python3, 63 61 byte

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

Sử dụng công thức từ OEIS.

-2 byte nhờ Luis Mendo ! i+1->i


Bạn có thể giải thích làm thế nào bạn đi từ Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kcông thức bitwise đơn giản hơn?
smls

@smls Nó chỉ tính toán các đường chéo đi lên trực tiếp. Tôi thực sự nghĩ rằng nó rõ ràng hơn so với hình thức khác.
Neil

1

PHP, 68 byte

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

lấy đầu vào từ đối số dòng lệnh, in các số được phân tách bằng dấu gạch dưới. Chạy với -r.


1

MATL , 18 17 byte

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

Hãy thử trực tuyến!

Điều này sử dụng công thức từ OEIS:

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

Mã số:

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

Sử dụng công thức từ trang OESIS.
Cập nhật: Chuyển sang công thức dựa trên bitwise và dựa trên câu trả lời Python của TuukkaX .

Perl 6 , 67 byte

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

Giải pháp ngây thơ.
Chuyển đổi các số là một phần của đường chéo thành cơ sở 2, lấy chữ số chính xác của mỗi số và chuyển đổi kết quả trở lại cơ sở 10.



0

R, 66 byte

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

Hàm không tên được sử dụng binhàm từ miscFuncsgói để tính độ dài của nbiểu diễn trong nhị phân và sau đó sử dụng một trong các công thức OEIS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.