Urutan mengambang bit

22

Sedikit mengapung dari LSB ke MSB bergerak satu posisi setiap kali sampai mengapung ke atas wadah:

0000
0001
0010
0100
1000

Setelah satu bit mengapung ke atas, bit lain memulai perjalanannya dan berhenti ketika bertemu bit lain:

1001
1010
1100

Ini terjadi sampai wadah diisi dengan bit:

1101
1110
1111

Tantangan

Diberikan angka integer, tampilkan " Urutan mengambang bit " untuk sebuah wadah dengan jumlah bit itu.

  • Setiap istilah urutan dapat dipisahkan oleh pemisah pilihan Anda.
  • Mengedit : Urutan harus ditampilkan sebagai angka integer desimal, dimulai oleh satuan panas pertama: 0.
  • Ukuran kontainer harus lebih besar dari nol dan hingga jumlah bit integer terbesar yang didukung oleh bahasa pilihan Anda. Anda dapat mengasumsikan bahwa input selalu cocok dengan persyaratan ini.

Contohnya

Hanya urutan numerik yang diperlukan, representasi biner ditampilkan sebagai contoh:

  • Untuk 1 :0 1

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

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • Untuk 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
    
  • Untuk 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
    
PaperBirdMaster
sumber
2
Bisakah kita menampilkan urutan dalam urutan apa pun (yaitu terbalik), atau apakah mereka harus diurutkan dari terendah ke tertinggi?
Kevin Cruijssen
1
Bisakah kita menghasilkan sebagai pelampung? Misalnya[0.0, 1.0]
Grimmy
8
Bisakah kita output menggunakan representasi biner?
Neil
Bisakah kita menampilkan urutan tanpa indeks? yaitu0 -> [0, 1]
attinat

Jawaban:

7

05AB1E , 10 byte

LRL˜Íoî.¥ï

Cobalah online!

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
Grimmy
sumber
2
Saya pikir ada meta-post di suatu tempat yang memungkinkan mengapung dengan .0default untuk bilangan bulat, tetapi tidak yakin. Saya pribadi biasanya memasukkan ïfooter ke dalam pretty-print dan tidak memasukkannya dalam byte-count.
Kevin Cruijssen
7

Python 2 , 45 byte

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

Cobalah online!

Ternyata lebih pendek untuk menghasilkan 2**nminus setiap istilah dalam urutan input n. Jika kita melihat ekspansi biner mereka, di bawah ini n=5, kita melihat pola segitiga 1 yang bagus dalam ekspansi biner.

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

Setiap angka diperoleh dari yang sebelumnya dengan menghapus yang paling kanan dalam ekspansi biner, kecuali jika itu akan membuat angka 0, kita mengurangi 1 sebagai gantinya, membuat blok baru 1 yang memulai segitiga kecil baru. Ini diimplementasikan sebagai y=y&y-1or~-y, di mana y&y-1ada sedikit trik untuk menghapus paling kanan 1, dan or~-ymemberikan y-1sebaliknya jika nilai itu 0.

Python 2 , 49 byte

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

Cobalah online!

Fungsi yang mencetak, mengakhiri dengan kesalahan. Program yang lebih bagus di bawah ini ternyata lebih lama.

51 byte

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

Cobalah online!

Tidak
sumber
6

Jelly , 11 10 byte

RUḶ’F2*ĊÄŻ

Pelabuhan @Grimy 's 05AB1E jawaban , jadi pastikan untuk upvote dia!
-1 byte terima kasih kepada @Grimy .

Cobalah online.

Penjelasan:

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)
Kevin Cruijssen
sumber
2
R_2-> Ḷ’untuk -1. adalah satu-satunya rentang yang masuk akal , saya benar-benar berharap 05AB1E memiliki byter tunggal untuk itu.
Grimmy
@ Grimy Ah, bagaimana saya merindukan yang itu. Saya mencari jangkauan dan pasti melewatkannya entah bagaimana ..>.> Terima kasih!
Kevin Cruijssen
4

Perl 5 ( -n), 41 40 byte

-1 byte thanls ke Xcali

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

TIO

  • "{0,1}"x$_: string "{0,1}"berulang n kali
  • "0b". : menyatu dengan "0b"
  • glob : glob expansion (produk kartesian)
  • map{... }: untuk setiap elemen
  • /01.*1/||: untuk melewati saat 01diikuti oleh sesuatu kemudian1
  • say oct : untuk mengkonversi ke desimal dan katakan
Nahuel Fouilleul
sumber
40
Xcali
4

JavaScript (ES6), 43 byte

Jika ragu, gunakan metode xnor .

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

Cobalah online!


JavaScript (ES6),  59 57 55  52 byte

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

Cobalah online!

Bagaimana?

Kami mendefinisikan p(x)2xhal(0)=0 oleh konvensi.

x-x1x

hal(52)=52DAN-52=4

Menggunakan halSebuahnSebuahn(0)=0

Sebuahn(k+1)={Sebuahn(k)+hal(Sebuahn(k)),jika hal(Sebuahn(k))0 dan Sebuahn(k)+hal(Sebuahn(k))<2nan(k)+1,otherwise

Commented

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
Arnauld
sumber
3

Python 2, 95 76 bytes

n=input()
a=0
print 0
while n:
 for j in range(n):print a+2**j
 n-=1;a+=2**n

Try it online!

TFeld
sumber
3

Perl 6, 43 bytes

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

Try it online!

Anonymous code block that takes a number and outputs the sequence separated by newlines. This works by starting with 0 repeated n times then replacing either 01 with 10 or the last 0 with a 1 until the number is just ones.

Or 40 bytes, using Nahuel Fouilleul's approach

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

Try it online!

Jo King
sumber
"then replacing either 01 with 10 or the last 0 with a 1 until the number is just ones" That's a genius move!
PaperBirdMaster
3

Python 2, 60 bytes

f=lambda i,n=0,b=1:[n][i:]or[n]+f(i-1/b,n^b+b/2,b>>i or 2*b)

Try it online!


Python 3, 76 bytes

f=lambda n:[0][n:]or[0]+[2**i for i in range(n-1)]+[x|1<<n-1for x in f(n-1)]

Try it online!

ovs
sumber
3

Python 3, 62 bytes

def f(n,c=0):
 while c<2**n:yield c;r=c&-c;c+=c+r>>n or r or 1

Try it online!

The idea is more or less the same as @Arnauld's solution.

Another 65-byte solution:

lambda n:g(2**n-1)
g=lambda c:[0][c:]or g(c-((c&-c)//2 or 1))+[c]

Try it online!

Joel
sumber
2

05AB1E, 13 12 bytes

Tsãʒ1ÛSO2‹}C{

-1 byte thanks to @Grimy (also take a look at his shorter approach here).

Try it online or verify all test cases.

Explanation:

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)
Kevin Cruijssen
sumber
Alternate 13: oL<ʒbIj1Û1¢2‹. Doesn't look like I can get it lower.
Grimmy
1
@Grimy I just had oL<ʒbIj1ÛSO2‹ and was trying to see where my error was. :) But I'm glad to see you aren't able to find a shorter version for one of my answers for a change. ;p (inb4 you find a shorter one after all xD)
Kevin Cruijssen
1
@Grimy I have the feeling SO2‹ can be 3 bytes somehow perhaps, but I'm not seeing it and also not entirely sure.. There are some alternatives, like SO1~ or SÆ>d, but I'm unable to find a 3-byter.
Kevin Cruijssen
1
10 with a completely different approach
Grimmy
1
Your feeling was right, I just found a 3-byter: SO!. Pretty sure I have some old answers using 2‹ that could benefit from this as well.
Grimmy
2

Retina, 26 bytes

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

Try it online! Outputs in binary. If that's not acceptable, then for 39 bytes:

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

Try it online! Explanation:

.+
*0

Convert the input into a string of n zeros.

L$w`.(.*)

Match all possible non-empty substrings.

$.`*1$'1$1

For each substring, output: the prefix with 0s changed to 1s; the suffix; the match with the initial 0 changed to 1.

+`10
011
%`1

Convert from binary to decimal.

Neil
sumber
2

Brachylog, 27 bytes

1;0|⟦₅;2z^₍ᵐLtT&-₁↰+ᵐ↙T,L,0

Try it online!

Outputs out of order and with duplicates. If that's not okay, tack do onto the end.

Unrelated String
sumber
1

Charcoal, 19 bytes

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

Try it online! Link is to verbose version of code. Explanation:

    θ               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
Neil
sumber
1

Perl 5, 40 bytes

map{say$-;$-+=2**$_}0,0..$_-2;$_--&&redo

Try it online!

Grimmy
sumber
1

Retina, 24 bytes

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

Outputs in binary. Input should have a trailing newline.

Attempt at explanation:

.+              #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 $

I tried to avoid the 3 bytes long /0/ regex option by rearranging the options, but couldn't.

Try it online!

my pronoun is monicareinstate
sumber
I don't think outputting in binary is allowed. There's a comment asking if it is allowed, but it's better to assume that you can't until the asker replies
Jo King
1

C (clang), 73 bytes

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;}

Try it online!

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
AZTECCO
sumber
1

k4, 28 24 bytes

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

@Grimy's approach ported to k4

edit: -4 thanks to ngn!

scrawl
sumber
1
!:'1+|!: -> |,\!:
ngn
you can remove the space after xexp
ngn
@ngn, agh |,\!: seems so obvious now that i see it!
scrawl