ビット浮動シーケンス


22

LSBからMSBにビットが浮き上がり、コンテナの上部に浮くまで毎回1ポジションずつ移動します。

0000
0001
0010
0100
1000

1ビットが最上部に浮かぶと、別のビットがその旅を開始し、他のビットに出会うと停止します。

1001
1010
1100

これは、コンテナがビットでいっぱいになるまで発生します。

1101
1110
1111

チャレンジ

整数を指定すると、そのビット数のコンテナの「ビット浮動シーケンス」を出力します。

  • シーケンスの各用語は、任意のセパレーターで区切ることができます。
  • 編集:シーケンスは、最初のtherm:で始まる10進整数として表示する必要があります0
  • コンテナのサイズはゼロより大きく、選択した言語でサポートされている最大の整数のビット数まででなければなりません。入力は常にこの要件に一致すると想定できます。

数値シーケンスのみが必要です。バイナリ表現が例として示されています。

  • 以下のための10 1

    0 -> 0
    1 -> 1
    
  • 以下の場合30 1 2 4 5 6 7

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • 以下のための40 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
    
  • 以下のための80 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
シーケンスを任意の順序で出力する(つまり、逆にする)か、最低から最高にソートする必要がありますか?
ケビンクルイッセン

1
floatとして出力できますか?例えば[0.0, 1.0]
Grimmy

8
バイナリ表現を使用して出力できますか?
ニール

インデックスがゼロのシーケンスを出力できますか?すなわち0 -> [0, 1]
attinat

回答:


7

05AB1E、10バイト

LRL˜Íoî.¥ï

オンラインでお試しください!

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
私は.0整数のデフォルトでフロートを許可するどこかにメタポストがあると思いますが、確かではありません。個人的には通常ï、フッターにプリティプリントを入れて、バイトカウントには含めません。
ケビンクルーッセン

7

Python 2、45バイト

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

オンラインでお試しください!

2**n入力のシーケンスの各項をマイナスで生成すると短くなりますn。以下ののバイナリ展開を見ると、バイナリ展開n=5に1の三角形の素敵なパターンがあります。

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

各数値は、バイナリ展開の右端の数値を削除することで前の数値から取得されます。ただし、数値が0になる場合は、代わりに1を減算し、新しい小さな三角形を開始する1の新しいブロックを作成します。これはとして実装されy=y&y-1or~-yy&y-1右端の1を削除するためのちょっとしたトリックです。代わりにその値が0だった場合にor~-y与えy-1ます。

Python 2、49バイト

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

オンラインでお試しください!

印刷してエラーで終了する関数。以下のより良いプログラムはより長く判明しました。

51バイト

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

オンラインでお試しください!


6

ゼリー11 10バイト

RUḶ’F2*ĊÄŻ

Port of @Grimyの05AB1E回答なので、必ず彼に賛成してください!
-1バイトのおかげで@Grimyの

オンラインでお試しください。

説明:

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-> Ḷ’-1の場合 あるだけで賢明な範囲、私は本当に05AB1Eはそれ用の単一byterがあればいいのに。
グリムミー

@Grimy Ah、どうやってそれを見逃したのか。範囲を検索しましたが、どうにかして範囲をスキップしたはずです。..>。>ありがとう!
ケビンクルーッセン

4

Perl 5(-n)、 41 40バイト

Xcaliへの-1バイトの感謝

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

TIO

  • "{0,1}"x$_ :文字列 "{0,1}" n回繰り返される
  • "0b". :に連結する "0b"
  • glob :グロブ展開(デカルト積)
  • map{...}:各要素
  • /01.*1/|| :いつスキップするか 01何かが続く1
  • say oct :10進数に変換して言う


4

JavaScript(ES6)、43バイト

疑わしい場合は、xnorのmethodを使用します。

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

オンラインでお試しください!


JavaScript(ES6)、 59 57 55  52バイト

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

オンラインでお試しください!

どうやって?

pバツ2xp(0)=0慣例により。

バツバツ1バツ

p52=52そして52=4

panan(0)=0

an(k+1)={an(k)+p(an(k)),if p(an(k))0 and an(k)+p(an(k))<2nan(k)+1,さもないと

コメント済み

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バイト

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

オンラインでお試しください!

番号を受け取り、改行で区切られたシーケンスを出力する匿名コードブロック。0繰り返しn回は、その後のいずれかの交換で開始することにより、この作品0110、または最後0のAと1、数字がまでます。

または、40バイト、ナウエルフイユルのアプローチを使用

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

オンラインでお試しください!


その後、いずれかの交換0110最後か0との1数まではただのものである」それは天才の動きです!
PaperBirdMaster





2

05AB1E13 12 バイト

Tsãʒ1ÛSO2‹}C{

@Grimyのおかげで-1バイト(こちらの短いアプローチもご覧ください)。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

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)

13代替:oL<ʒbIj1Û1¢2‹。私はそれを低くすることができるように見えません。
グリムシー

1
@Grimy私はちょうどoL<ʒbIj1ÛSO2‹私のエラーがどこにあるかを確認しようとしていました。:)しかし、変更に対する私の答えの1つについて、より短いバージョンを見つけることができないことを嬉しく思います。; p(inb4はやや短いxDを見つけます)
ケビンクルーイッセン

1
私は気持ちが持っている@Grimy SO2‹何とかおそらく3バイトですが、私はそれを見ていないよともない、完全に確認してください。..そこにいくつかの選択肢は次のように、あるSO1~SÆ>dが、私は3-byterを見つけることができませんよ。
ケビンクルーッセン

1
完全に異なるアプローチで10
グリミー

1
あなたの気持ちは正しかった、私はちょうど3バイトを見つけました:SO!。これからも2‹恩恵を受ける可能性のある古い答えをいくつか使用していることをかなり確信しています。
グリムシー

2

網膜、26バイト

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

オンラインでお試しください!バイナリで出力します。それが受け入れられない場合、39バイトの場合:

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

オンラインでお試しください!説明:

.+
*0

入力をnゼロの文字列に変換します。

L$w`.(.*)

空の可能性のあるすべての部分文字列に一致します。

$.`*1$'1$1

各サブストリングについて、出力:0sから1sに変更されたプレフィックス。サフィックス; イニシャルとの一致がに0変更されました1

+`10
011
%`1

2進数から10進数に変換します。



1

、19バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

    θ               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

網膜、24バイト

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

バイナリで出力します。入力には末尾の改行が必要です。

説明の試み:

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

/0/オプションを再配置することで、3バイト長の正規表現オプションを回避しようとしましたが、できませんでした。

オンラインでお試しください!


バイナリでの出力は許可されていません。そこには、許可されているかどうかを尋ねるコメントだが、それは、あなたができないアスカー回答までと仮定すると良いでしょう
ジョー・キング


1

K4、 28の 24バイト

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

@Grimyのアプローチはk4に移植されました

編集:-4 ngnのおかげで!


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

後にスペースを削除できますxexp
ngn

@ngn、ああ |,\!:、私はそれを見るのではとても明白なようです!
10
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.