Chuỗi nổi bit


22

Một bit trôi từ LSB sang MSB di chuyển một vị trí mỗi lần cho đến khi nó nổi lên trên đỉnh của container:

0000
0001
0010
0100
1000

Khi một bit nổi lên trên đỉnh, một bit khác bắt đầu hành trình của nó và nó dừng lại khi gặp bit khác:

1001
1010
1100

Điều này xảy ra cho đến khi container chứa đầy bit:

1101
1110
1111

Thử thách

Cho một số nguyên, xuất ra " chuỗi nổi bit " cho một thùng chứa số bit đó.

  • Mỗi thuật ngữ của chuỗi có thể được phân tách bằng bất kỳ dấu phân cách nào bạn chọn.
  • Chỉnh sửa : Chuỗi phải được hiển thị dưới dạng số nguyên thập phân, bắt đầu bằng nhiệt thứ nhất : 0.
  • Kích thước thùng chứa phải lớn hơn 0 và tối đa số bit của số nguyên lớn nhất được thay thế bởi ngôn ngữ bạn chọn. Bạn có thể cho rằng đầu vào luôn phù hợp với yêu cầu này.

Ví dụ

Chỉ có chuỗi số là bắt buộc, biểu diễn nhị phân được hiển thị như ví dụ:

  • Cho 1 :0 1

    0 -> 0
    1 -> 1
    
  • Cho 3 :0 1 2 4 5 6 7

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • Cho 4 :0 1 2 4 8 9 10 12 13 14 15

    0000 -> 0
    0001 -> 1
    0010 -> 2
    0100 -> 4
    1000 -> 8
    1001 -> 9
    1010 -> 10
    1100 -> 12
    1101 -> 13
    1110 -> 14
    1111 -> 15
    
  • Trong 8 :0 1 2 4 8 16 32 64 128 129 130 132 136 144 160 192 193 194 196 200 208 224 225 226 228 232 240 241 242 244 248 249 250 252 253 254 255

    00000000 -> 0
    00000001 -> 1
    00000010 -> 2
    00000100 -> 4
    00001000 -> 8
    …
    …
    …
    11111000 -> 248
    11111001 -> 249
    11111010 -> 250
    11111100 -> 252
    11111101 -> 253
    11111110 -> 254
    11111111 -> 255
    

2
Chúng ta có thể xuất chuỗi theo thứ tự bất kỳ (nghĩa là đảo ngược), hoặc chúng phải được sắp xếp từ thấp nhất đến cao nhất?
Kevin Cruijssen

1
Chúng ta có thể xuất ra như phao không? Ví dụ:[0.0, 1.0]
Grimmy

8
Chúng ta có thể xuất ra bằng cách sử dụng biểu diễn nhị phân không?
Neil

Chúng ta có thể xuất chuỗi không có chỉ số không? tức là0 -> [0, 1]
attinat

Câu trả lời:


7

05AB1E , 10 byte

LRL˜Íoî.¥ï

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

L                 # range [1..input]
 R                # reversed
  L               # convert each to a range: [[1..input], [1..input-1], ..., [1]]
   ˜              # flatten
    Í             # subtract 2 from each
     o            # 2**each
      î           # round up (returns a float)
       ï          # convert to integer
        .¥        # undelta

2
Tôi nghĩ rằng có một meta-post ở đâu đó cho phép nổi .0theo mặc định cho số nguyên, nhưng không chắc chắn. Cá nhân tôi thường đặt phần ïchân trang thành bản in đẹp và không bao gồm nó trong số đếm byte.
Kevin Cruijssen

7

Python 2 , 45 byte

y=n=2**input()
while y:print n-y;y=y&y-1or~-y

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

Nó chỉ ra ngắn hơn để tạo ra 2**ntrừ mỗi thuật ngữ trong chuỗi cho đầu vào n. Nếu chúng ta nhìn vào sự mở rộng nhị phân của chúng, bên dưới n=5, chúng ta sẽ thấy một mô hình tam giác 1 đẹp trong các mở rộng nhị phân.

100000  32
011111  31
011110  30
011100  28
011000  24
010000  16
001111  15
001110  14
001100  12
001000  8
000111  7
000110  6
000100  4
000011  3
000010  2
000001  1

Mỗi số được lấy từ số trước bằng cách loại bỏ số ngoài cùng bên phải trong khai triển nhị phân, ngoại trừ nếu điều đó tạo ra số 0, chúng ta trừ đi 1, thay vào đó, tạo một khối mới 1 bắt đầu một tam giác mới nhỏ hơn. Này được thực hiện như y=y&y-1or~-y, nơi y&y-1là một thủ thuật chút để loại bỏ các bìa phải 1, và or~-yđưa ra y-1thay vì nếu giá trị là 0.

Python 2 , 49 byte

def f(n,x=0):1%n;print x;f(n-x%2,x+(x%2**n or 1))

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

Một chức năng in, chấm dứt với lỗi. Các chương trình tốt đẹp hơn dưới đây bật ra lâu hơn.

51 byte

n=input()
x=0
while n:n-=x%2;print x;x+=x%2**n or 1

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


6

Thạch , 11 10 byte

RUḶ’F2*ĊÄŻ

Cảng @Grimy 's 05AB1E câu trả lời , vì vậy hãy chắc chắn để upvote anh ta!
-1 byte nhờ @Grimy .

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

Giải trình:

R           # Create a list in the range [1, (implicit) argument]
 U          # Reverse it to [argument, 1]
           # Create an inner list in the range [0, N) for each value N in this list
           # Decrease each by 1
    F       # Flatten the list of lists
     2*     # Take 2 to the power each
       Ċ    # Ceil
        Ä   # Undelta (cumulative sum) the list
         Ż  # And add a leading 0
            # (after which the result is output implicitly)

2
R_2-> Ḷ’cho -1. phạm vi hợp lý duy nhất , tôi thực sự muốn 05AB1E có một bộ lọc đơn cho nó.
Grimmy

@Grimy Ah, làm thế nào tôi bỏ lỡ cái đó. Tôi đã tìm kiếm phạm vi và phải bỏ qua nó bằng cách nào đó ..>.> Cảm ơn!
Kevin Cruijssen

4

Perl 5 ( -n), 41 40 byte

-1 byte so với Xcali

map{/01.*1/||say oct}glob"0b"."{0,1}"x$_

TIO

  • "{0,1}"x$_: chuỗi "{0,1}"lặp lại n lần
  • "0b". : nối với "0b"
  • glob : mở rộng toàn cầu (sản phẩm cartesian)
  • map{... }: cho từng yếu tố
  • /01.*1/||: bỏ qua khi 01theo sau bởi một cái gì đó sau đó1
  • say oct : để chuyển sang số thập phân và nói


4

JavaScript (ES6), 43 byte

Khi nghi ngờ, hãy sử dụng phương pháp của xnor .

n=>(g=x=>x?[n-x,...g(x&--x||x)]:[])(n=1<<n)

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


JavaScript (ES6),  59 57 55  52 byte

f=(n,x=0)=>x>>n?[]:[x,...f(n,x+=x+(x&=-x)>>n|!x||x)]

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

Làm sao?

p(x)2xp(0)= =0

x-x1x

p(52)= =52-52= =4

pmộtnmộtn(0)= =0

mộtn(k+1)= ={mộtn(k)+p(mộtn(k)),nếu p(mộtn(k))0 và mộtn(k)+p(mộtn(k))<2nmộtn(k)+1,nếu không thì

Đã bình luận

f = (                   // f is a recursive function taking:
  n,                    //   n = input
  x = 0                 //   x = current term of the sequence
) =>                    //
  x >> n ?              // if x is greater than or equal to 2**n:
    []                  //   stop recursion
  :                     // else:
    [                   //   update the sequence:
      x,                //     append the current term to the sequence
      ...f(             //     do a recursive call:
        n,              //       pass n unchanged
        x +=            //       update x:
          x + (x &= -x) //         given x' = lowest bit of x set to 1:
          >> n          //         if x + x' is greater than or equal to 2**n
          | !x          //         or x' is equal to 0: add 1 to x
          || x          //         otherwise, add x' to x
      )                 //     end of recursive call
    ]                   //   end of sequence update


3

Perl 6 , 43 byte

{0 x$_,{say :2($_);S/(0)1|0$/1$0/}...1 x$_}

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

Khối mã ẩn danh lấy một số và xuất ra chuỗi được phân tách bằng các dòng mới. Điều này hoạt động bằng cách bắt đầu với 0 lần lặp lại n lần sau đó thay thế 01bằng 10hoặc lần cuối 0bằng một 1cho đến khi số chỉ là số.

Hoặc 40 byte, sử dụng phương pháp của Nahuel Fouilleul

{grep /010*1/|{say :2($_)},[X~] ^2 xx$_}

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


" sau đó thay thế 01bằng 10hoặc cuối cùng 0bằng một 1cho đến khi số chỉ là số " Đó là một động thái thiên tài!
PaperBirdMaster





2

05AB1E , 13 12 byte

Tsãʒ1ÛSO2‹}C{

-1 byte nhờ @Grimy (cũng hãy xem cách tiếp cận ngắn hơn của anh ấy ở đây).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

T             # Push 10
 sã           # Swap to get the (implicit) input, and get the cartesian product with "10"
   ʒ          # Filter it by:
    1Û        #  Remove leading 1s
      SO      #  Get the sum of the remaining digits
        !     #  Check that the sum is either 0 or 1 by taking the factorial
              #  (NOTE: Only 1 is truthy in 05AB1E)
         }C   # After the filter: convert all remaining strings from binary to integer
           {  # And sort (reverse) them
              # (after which the result is output implicitly)

Thay thế 13 : oL<ʒbIj1Û1¢2‹. Không có vẻ như tôi có thể làm cho nó thấp hơn.
Grimmy

1
@Grimy Tôi vừa có oL<ʒbIj1ÛSO2‹và đang cố gắng xem lỗi của tôi ở đâu. :) Nhưng tôi rất vui khi thấy bạn không thể tìm thấy phiên bản ngắn hơn cho một trong những câu trả lời của tôi để thay đổi. ; p (inb4 bạn tìm thấy một cái ngắn hơn sau tất cả xD)
Kevin Cruijssen

1
@Grimy Tôi có cảm giác SO2‹có thể là 3 byte bằng cách nào đó, nhưng tôi không nhìn thấy nó và cũng không hoàn toàn chắc chắn .. Có một số lựa chọn thay thế, như SO1~hoặc SÆ>d, nhưng tôi không thể tìm thấy 3 -ter.
Kevin Cruijssen

1
10 với cách tiếp cận hoàn toàn khác
Grimmy

1
Cảm giác của bạn là đúng, tôi chỉ tìm thấy 3-byter : SO!. Khá chắc chắn rằng tôi có một số câu trả lời cũ bằng cách sử dụng 2‹cũng có thể được hưởng lợi từ điều này.
Grimmy

2

Võng mạc , 26 byte

.+
*0
L$w`.(.*)
$.`*1$'1$1

Hãy thử trực tuyến! Đầu ra ở dạng nhị phân. Nếu điều đó không được chấp nhận, thì với 39 byte:

.+
*0
L$w`.(.*)
$.`*1$'1$1
+`10
011
%`1

Hãy thử trực tuyến! Giải trình:

.+
*0

Chuyển đổi đầu vào thành một chuỗi nsố không.

L$w`.(.*)

Phù hợp với tất cả các chất nền không trống có thể.

$.`*1$'1$1

Đối với mỗi chuỗi con, đầu ra: tiền tố với 0s thay đổi thành 1s; hậu tố; trận đấu với sự 0thay đổi ban đầu thành 1.

+`10
011
%`1

Chuyển đổi từ nhị phân sang thập phân.



1

Than , 19 byte

I⮌E⊕θEι⁺⁻X²IθX²ιX²λ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

    θ               Input
   ⊕                Incremented
  E                 Map over implicit range
      ι             Outer index
     E              Map over implicit range
           Iθ       Input cast to integer
               ι    Outer index
                  λ Inner index
         X²  X² X²  Power of 2
       ⁺⁻           Subtract and add
 ⮌                  Reverse outer list
I                   Cast to string
                    Implicitly print


1

Võng mạc , 24 byte

.+
*0
/0/+<0`(0)1|0$
1$1

Đầu ra ở dạng nhị phân. Đầu vào nên có một dòng mới.

Cố gắng giải thích:

.+              #match the entire input
*0              #replace it with that many zeroes
/0/+<0`(0)1|0$  #while the string has a 0, substitute the first match and output
1$1             #if 01 is present in the string, replace it with 10, else replace the last character with $

Tôi đã cố gắng tránh 3 byte dài /0/ tùy chọn regex bằng cách sắp xếp lại các tùy chọn, nhưng không thể.

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


Tôi không nghĩ xuất ra nhị phân được cho phép. Có một bình luận hỏi liệu nó có được phép không, nhưng tốt hơn là giả sử rằng bạn không thể cho đến khi người hỏi trả lời
Jo King

1

C (tiếng kêu) , 73 byte

o,j,y;f(x){for(o=j=0;printf("%d ",o),x;o+=y+!y,y+=y+!y)j=!j?y=0,--x:--j;}

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

for(o=j=0;printf("%d ",o),x;  o+=y+!y, y+=y+!y) 
// adds 1, 1+1=>2 , 2+2=> 4 .... sequence

 j=!j?y=0,--x:--j; 
// uses ternary instead of nested loop to decrement 'x' when 'j' go to 0

1

k4, 28 24 byte

0,+\"j"$2 xexp,/-1+|,\!:

Cách tiếp cận @ Grimy chuyển đến k4

chỉnh sửa: -4 cảm ơn ngn!


1
!:'1+|!:->|,\!:
ngn

bạn có thể xóa khoảng trống sauxexp
ngn

@ngn, agh |,\!:dường như quá rõ ràng bây giờ tôi thấy nó!
nguệch ngoạc
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.