整数のバイナリ値で1の最長シリーズを計算します


32

ゴール

負でない整数が与えられた場合、その整数のバイナリ値で最大数の連続した1の開始位置を返す関数を作成します。

入力が与えられたら0、を返し0ます。

番号に同じ長さの複数のストリークがある場合、最後のストリークの位置を返す必要があります。

入力

整数より大きいか等しい 0。

出力

以下で説明するように計算された整数。

ルール

  • これはコードゴルフなので、各言語のバイト単位の最短コードが優先されます。
  • 標準的な抜け穴は禁止されています。

例とテストケース

例1

  • 関数には整数142が渡されます
  • 142はバイナリで10001110に等しい
  • 最長のストリークは「111」(3つのストリーク)です
  • ストリークは2 ^ 1の位置から始まります
  • 関数は結果として1を返します

例2

  • 関数には整数48が渡されます
  • 48はバイナリで110000に等しい
  • 最長のストリークは「11」(2つのストリーク)です
  • ストリークは2 ^ 4の位置から始まります
  • 関数は結果として4を返します

例3

  • 関数には整数750が渡されます
  • 750はバイナリで1011101110に等しい
  • 最長のストリークは「111」(3つのストリーク)です
  • 長さが等しい2つのストリークがあるので、後のストリークを返します。
  • 後のストリークは2 ^ 5の位置から始まります
  • 関数は結果として5を返します


@Okx本体自体で言及されていたので、タグを追加しました。
完全に人間

必ずテストしてください0。それは重要なテストケースです。
mbomb007

2
「最後のストリーク」または「最新のストリーク」の代わりに、「最大の場所の値を持つストリーク」を提案します。
アシェプラー

@Okx勝利基準が必要なのはなぜですか?なぜパズルになれないのですか?
corsiKa

回答:


21

ゼリー10 8バイト

Ba\ÐƤṀċ¬

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

使い方

Ba\ÐƤṀċ¬  Main link. Argument: n


B         Binary; convert n to base 2.

   ÐƤ     Apply the link to the left to all postfixes of the binary array.
 a\         Cumulatively reduce by logical AND.

          For example, the array

          [1, 0, 1, 1, 1, 0, 1, 1, 1, 0]

          becomes the following array of arrays.

          [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
             [0, 0, 0, 0, 0, 0, 0, 0, 0]
                [1, 1, 1, 0, 0, 0, 0, 0]
                   [1, 1, 0, 0, 0, 0, 0]
                      [1, 0, 0, 0, 0, 0]
                         [0, 0, 0, 0, 0]
                            [1, 1, 1, 0]
                               [1, 1, 0]
                                  [1, 0]
                                     [0]

     Ṁ    Take the lexicographical maximum, i.e., the array with the most 1's at
          the beginning, breaking ties by length.

       ¬  Yield the logical NOT of n, i.e., 0 if n > 0 and 1 if n = 0.

      ċ   Count the occurrences of the result to the right in the one to the left.

おめでとうございます!
デファクト

24

JavaScript(ES6)、41 40 36 34バイト

@ThePirateBayのおかげで4バイト節約

f=x=>(k=x&x/2)?f(k):Math.log2(x)|0

テストケース

どうやって?

一般的なケースx> 0

入力xx / 2を再帰的にANDします。これにより、シーケンスの右端のビットのみが残るまで、連続するセットビットのパターンが徐々に減少します。最後の非ゼロ値のコピーを保持し、その底2の対数を四捨五入してその最上位ビットの位置を決定します。

以下は、x = 750(バイナリで1011101110)の場合の手順です。

    1011101110 --.
,----------------'
'-> 1011101110
AND 0101110111
    ----------
=   0001100110 --.
,----------------'
'-> 0001100110
AND 0000110011
    ----------
=   0000100010 --.  --> output = position of MSB = 5  (0000100010)
,----------------'                                         ^
'-> 0000100010
AND 0000010001
    ----------
=   0000000000

エッジケースx = 0

特別な場合はx = 0すぐにつながりMath.log2(0) | 0ます。の対数は2進ビット単位のOR に0評価され-Infinity、強制的に32ビット整数に強制されます。抽象操作ToInt32の仕様に準拠し、これにより期待される結果が得られます0

もし番号があるのNaN0-0+∞、または-∞、リターン 0


入力のこのエラー0は、入力範囲の一部です。
ジャスティンマリナー

@JustinMariner修正。
アーナルド

どの程度Math.log2(k)|0の代わりに31-Math.clz32(k)?それとも何か不足していますか?

@ThePirateBay Math.log2(k)|0は、実際には特別な場合には短くてシンプルですx=0。ありがとう。:)
アーナウド

1
非常に素晴らしいアルゴリズムと良い説明。14バイトのx86マシンコードで実装しました。
ピーターコーデス

12

x86マシンコード、14バイト

使用アルノーのアルゴリズム@x &= x>>1と前のステップで最高のセットのビット位置を取るxなり0

unsigned longest_set(unsigned edi);x86-64 System V ABIの署名を使用してC / C ++から呼び出し可能。同じマシンコードバイトは32ビットモードでも同じ方法でデコードされますが、標準の32ビット呼び出し規約では最初のargがに入れられませんedi。(Windows への入力レジスタecxまたはedxWindowsの入力レジスタの変更_fastcall/ _vectorcallまたはgcc -mregparm何も壊さずに行うことができます。)

   address   machine-code
             bytes
                         global longest_set
 1                       longest_set:
 2 00000000 31C0             xor  eax, eax    ; 0 for input = 0
 3                       
 4                       .loop:               ; do{
 5 00000002 0FBDC7           bsr  eax, edi    ;  eax = position of highest set bit
 6                           ;; bsr leaves output unmodified when input = 0 (and sets ZF)
 7                           ;; AMD documents this; Intel manuals say unspecified but Intel CPUs implement it
 8 00000005 89F9             mov  ecx, edi
 9 00000007 D1E9             shr  ecx, 1
10 00000009 21CF             and  edi, ecx
11 0000000B 75F5             jnz .loop        ; } while (x &= x>>1);
12                       
13 0000000D C3               ret

x86のBSR命令(ビットスキャンリバース)はこれに最適で、先行ゼロをカウントするのではなく、ビットインデックスを直接提供します。(bsr直接のように入力= 0の場合は0を生成しない32-lzcnt(x)だろうが、我々はそう、ゼロ以外の入力のためにBSR = 31-lzcntを必要とlzcntしても命令を保存して、単独のバイト数をできないだろう。ゼロ化eaxにループが原因の作品の前にbsr" s入力がゼロの場合に宛先を変更しないままにする半公式の動作。

最長実行のMSB位置を返すことができれば、これはさらに短くなります。その場合、lea ecx, [rdi+rdi](3バイト)は+ (4バイト)ではなく+ シフトをコピーします。movshr

行うasm呼び出し元については、このTIOリンクを参照してくださいexit(longest_set(argc-1));

シェルループを使用したテスト:

l=(); for ((i=0;i<1025;i++));do 
    ./longest-set-bitrun "${l[@]}";   # number of args = $i
    printf "$i %#x: $?\n" $i; 
    l+=($i); 
done | m

0 0: 0
1 0x1: 0
2 0x2: 1
3 0x3: 0
4 0x4: 2
5 0x5: 2
6 0x6: 1
7 0x7: 0
8 0x8: 3
9 0x9: 3
10 0xa: 3
11 0xb: 0
12 0xc: 2
13 0xd: 2
14 0xe: 1
15 0xf: 0
16 0x10: 4
17 0x11: 4
18 0x12: 4
19 0x13: 0
20 0x14: 4
21 0x15: 4

...

747 0x2eb: 5
748 0x2ec: 5
749 0x2ed: 5
750 0x2ee: 5
751 0x2ef: 0
752 0x2f0: 4
753 0x2f1: 4
754 0x2f2: 4

1
いいね!(私のように)他のアセンブリ方言に詳しい人への注意:x86 BSRニーモニックは、「Branch to SubRoutine」ではなく「Bit Scan Reverse」の略です。
アーナウルド

@Arnauld:ニーモニックをデコードするために編集されただけでなく、insnリファレンスマニュアルエントリへのリンクがあります。
ピーターコーデス

5

ゼリー19 17 11バイト

HÐĿ&\ḟ0ṪBL’

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

@Dennisの鋭い観察のおかげで-6(!)バイト

使い方

HÐĿ&\ḟ0ṪBL’
HÐĿ         - halve repeatedly until reaching 0 due to rounding
   &\       - cumulative AND
     ḟ0Ṫ    - final non-zero, or 0 if all elements are 0
        BL  - length of binary representation (log base 2). 0->[0]->1
          ’ - decrement

のエラー0。入力範囲内です。
ミスターXcoder

@ Mr.Xcoderは固定
fireflame241

あなたはと修正のためにバイトを保存することができますȯ-µ...
ジョナサン・アラン

@JonathanAllan OR-ingがどのように役立つかわかりません。コードはありますか?
fireflame241

1
B常に1で始まる配列を返すため、にBUṪMṪ’×ṠなりṪBL’ます。また、を必要とせずḟ0を1バイト節約し¹Ðfます。
デニス

5

Python 2、45バイト

f=lambda x:f(x&x/2)if x&x/2else len(bin(x))-3

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

デニスのおかげでたくさんのバイトを節約できました!(のlen(bin(...))-3代わりにヘッドアップmath.frexp

幸運にも簡単に修正できるバグを見つけてくれた@xnorに感謝します!


これはforなどの間違った答えを与えるようです。関数が0を返すときに短絡が間違っているx=3ためだと思いand/orます。
xnorSep

@xnorそれに気づいてくれてありがとう!修正されました。
ミスターXcoder

4

Perl 645 35バイト

この非常に改善されたバージョンは、@ nwellnhofの好意によるものです。

{.msb+1-(.base(2)~~m:g/1+/).max.to}

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


単純に一致し:gて、すべての一致を取得できます。スマートマッチ演算子で、私は40バイトにゴルフそれをダウンでした:{sort(.base(2).flip~~m:g/1+/).tail.from}
nwellnhof


@nwellnhof、どうもありがとうございます。私はどういうわけか見逃しました:gが、smartmatch演算子で副詞を使用する方法を理解できませんでした。また、この.msb方法はここでは非常に役立ちますが、以前は知りませんでした。
ラミリーズ

3

パイソン289の 78バイト

m=t=i=j=0
for c in bin(input()):
 t=-~t*(c>'0');i+=1
 if t>m:j=i;m=t
print i-j

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

編集:氏Xcoderのおかげで11バイトを保存しました。




@ Mr.Xcoder私もそれを考えましたが、質問は具体的には関数を書くように求めています。
ジョナサンフレッチ

@JonathanFrech OPは本当にfunctionを意味しているとは思いません。おそらく単なる一般用語。
ミスターXcoder

@ Mr.Xcoderこれを説明してください。おかげで、
lifebalance

3

05AB1E14 12 11バイト

bDγàŠrkrJgα

オンラインでお試しください!またはテストケースを実行します

説明

bDγàŠrkrJgα  Implicit input (ex: 750)
bD           Convert input to binary string and duplicate
                 '1011101110', '1011101110'
  γ          Split into groups of 1s or 0s
                 '1011101110', ['1', '0', '111', '0', '111', '0']
   à         Pull out max, parsing each as an integer
                 '1011101110', ['1', '0', '0', '111', '0'], '111'
    Šrk      Rearrange stack and get first index of max run of ones
                 ['1', '0', '0', '111', '0'], 2
       rJg   Reverse stack, join the array to a string, and get its length
                 2, 7
          α  Get absolute difference
                 5

3

J18 17バイト

(#-0{#\\:#.~\)@#:

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

説明

(#-0{#\\:#.~\)@#:  Input: integer n
               #:  Binary
     #\            Length of each prefix
       \:          Sorted down using
         #.~\      Mixed base conversion on each prefix
   0{              Get the value at index 0
  -                Subtract from
 #                 Length

とても滑らか。ただし、混合ベース変換で何が起こっているのかを完全に理解しているわけではありません。なぜ文字列の最後にある連続したものの数をカウントするのですか?また、xダイアドのベースで指定されているベースがすべて0と1である場合、それはどういう意味ですか?基数2には数字が0あり1、であるため、基数に1は数字があります... 01その文脈で何が意味するのでしょうか?そして、基数は0常に常に0ですか?
ジョナ

@Jonah混合ベース変換の実装方法が原因です。x #. y最初に計算してw =: */\. }. x , 1から戻ります+/ w * y
マイル

#.あなたはパブリックAPIではなく内部実装の詳細に依存しているので、これを合法的な使用ではなくゴルフハックとみなしますか?
ジョナ

3

C#(.NET Core)64 60バイト

T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)

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

@Arnauldの答えの AC#バージョン

謝辞

Kevin Cruijssenのおかげで4バイト節約されました。

C#(.NET Core)131 123 + 18 = 141バイト

a=>{string s=Convert.ToString(a,2),t=s.Split('0').OrderBy(x=>x.Length).Last();return a<1?0:s.Length-s.IndexOf(t)-t.Length;}

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

+18バイト using System.Linq;

謝辞

GrzegorzPuławskiのおかげで8バイトが節約されました。

デゴルフド

a=>{
    string s=Convert.ToString(a,2),      // Convert to binary
    t=s.Split('0')                       // get largest group of 1's
       .OrderBy(x=>x.Length)
       .Last();
    return 
        a<1?0:                          // handle 0 case
        s.Length-s.IndexOf(t)-t.Length; // get position in reversed string
}

C#(.NET Core)164 161バイト

a=>{var s=Convert.ToString(a,2);int c=0,l=0,p=0,k=0,j=s.Length-1,i=j;for(;i>=0;i--){if(s[i]>'0'){if(i==j||s[i+1]<'1'){p=i;c=0;}if(++c>=l){l=c;k=p;}}}return j-k;}

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

Linqすぐに明らかなものはありませんが、非解決策であり、改善できると確信しています。

デゴルフド

a=>{
    var s=Convert.ToString(a,2); // Convert to binary
    int c=0,l=0,p=0,k=0,j=s.Length-1,i=j;
    for(;i>=0;i--)               // Loop from end of string
    {
        if(s[i]>'0')             // if '1'
        {
            if(i==j||s[i+1]<'1') // if first digit or previous digit was '0'
            {
                p=i;             // set the position of the current group
                c=0;             // reset the count
            }
            if(++c>=l)           // if count is equal or greater than current largest count
            {
                l=c;             // update largest count
                k=p;             // store position for this group
            }
        }
    }
    return j-k;                  // as the string is reversed, return string length minus position of largest group
}

1
r最初の答えを捨てることで8バイトを節約できます:tio.run
GrzegorzPuławski17年

あなたはあなたのポートで2バイト保存することができアルノー:このようなのT=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
ケビンCruijssen

1
またはさらに2バイト節約(60バイト):T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
ケビンクルーイッセン

2

、12バイト

→S§-€¤≠Lo▲gḋ

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

説明

                 Implicit input, e.g                           750
           ḋ     Convert to binary                             [1,0,1,1,1,0,1,1,1,0]
          g      Group equal elements                          [[1],[0],[1,1,1],[0],[1,1,1],[0]]
        o▲       Maximum                                       [1,1,1]
    €            Index of that substring in the binary number  3
     ¤≠L         Absolute difference of lengths                abs (3 - 10) = 7
 S§-             Subtract the two                              7 - 3 = 4
→                Increment                                     5

2

ゼリー 14 13 12  11 バイト

Bµṣ0Ṫ$ƤMḢạL

負でない整数を取り、返す単項リンク。

オンラインでお試しください!またはテストスイートを参照してください。

どうやって?

Bµṣ0Ṫ$ƤMḢạL - Main link: number, n                   e.g. 750
B           - convert to a binary list                    [1,0,1,1,1,0,1,1,1,0]
 µ          - monadic chain separation, call that b
      Ƥ     - map over prefixes:  (i.e. for [1], [1,0], [1,0,1], [1,0,1,1],...)
     $      -   last two links as a monad:                e.g.: [1,0,1,1,1,0,1,1]
   0        -     literal zero                                   0
  ṣ         -     split (prefix) at occurrences of (0)           [[1],[1,1,1],[1,1]]
    Ṫ       -     tail                                                        [1,1]
       M    - maximal indices                             [5,9]
        Ḣ   - head                                        5
          L - length (of b)                               10
         ạ  - absolute difference                         5

同様の解決策がありŒrṪPましたが、代わりにプレフィックスで使用しました。
マイル

2

ゼリー、19バイト

BŒgḄṀB
BwÇɓÇL+ɓBL_‘

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

 4  6バイトを節約してくれたJonathan Allanに感謝します!

私はこれを放棄するために働きすぎましたが、それはちょっと長いです。私は本当に1バイナリ表現でsの最も長い部分文字列を検索するソリューションを追加したかった...

説明

BŒgḄṀB-モナドヘルパーリンク。次のリンクでwithとともに使用されます。

B-バイナリ表現。
 Œg-連続する等しい要素のグループ実行。
   Ḅ-バイナリから整数に変換します。
    Ṁ-最大値。
     B-整数からバイナリに変換します。


BwÇɓÇL+ɓBL_ '-メインリンク。

B-(入力の)バイナリ表現。
  Ç-モナドとしての最後のリンク。入力整数を受け取ります。
 w-最初のサブリストインデックス。
   ɓ-別のダイアディックチェーンを開始します。引数を逆にします。
    Ç-モナドとしての最後のリンク。
     L-長さ。
      +-追加
       ɓ-別のダイアディックチェーンを開始します。引数を逆にします。
        B-バイナリ。
         L-長さ。
          _ '-結果を減算および増分します(Jellyは1インデックスを使用するため)。
              -暗黙的に出力されます。

BŒgḄṀB代わりにヘルパーリンクを使用できます
ジョナサンアラン

@JonathanAllanああすごいありがとう!
ミスターXcoder

主なリンクはBwÇɓÇL+ɓBL_‘
ジョナサンアラン

@JonathanAllanうわー、ありがとう!
氏Xcoder

2

Kotlin、77バイト

{val b=it.toString(2)
b.reversed().lastIndexOf(b.split(Regex("0+")).max()!!)}

美化

{
    val b = it.toString(2)
    // Find the left position of the first instance of
    b.reversed().lastIndexOf(
            // The largest group of 1s
            b.split(Regex("0+")).max()!!)
}

テスト

var s:(Int)->Int =
{val b=it.toString(2)
b.reversed().lastIndexOf(b.split(Regex("0+")).max()!!)}
fun main(args: Array<String>) {
    r(0, 0)
    r(142, 1)
    r(48, 4)
    r(750, 5)
}

fun r(i: Int, i1: Int) {
    var v = s(i)
    println("$i -> $v [$i1] ${i1 == v}")
}

私はテストしませんでしたが、これはscalaでも機能すると思います。
V.クルトワ

2

Haskell101 98 96 75バイト

snd.maximum.(`zip`[0..]).c
c 0=[0]
c n|r<-c$div n 2=sum[r!!0+1|mod n 2>0]:r

オンラインでお試しください!使用法:snd.maximum.(`zip`[0..]).c $ 142yields 1

説明:

  • c入力をバイナリに変換すると同時に、1つのストリークの長さをカウントし、結果をリストに収集します。このリストr<-c$div n 2の残りの部分rを再帰的に計算しsum[r!!0+1|mod n 2>0]:r、現在のストリークの長さをに追加しrます。リスト内包mod n 2>0表記は、、つまり現在の2進数が1であるかどうかをチェックし、そうであれば、前のストリーク(の最初の要素r)の長さを取り、1を追加します。それ以外の場合、リストの内包表記は空であり、をsum[]生成し0ます。入力例でc 142は、listが生成されます[0,3,2,1,0,0,0,1,0]

  • (`zip`[0..])タプルの2番目のコンポーネントとして、前のリストの各要素に位置を追加します。例では、これはを与え[(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)]ます。

  • maximumこのリストで辞書式に最大のタプルを見つけます。つまり、ストリークの長さが最初のコンポーネントであるため最初に考慮され、タイの場合、2番目のコンポーネント、つまり大きなインデックスが決定します。これにより(3,1)、この例では結果が得られsnd、タプルの2番目のコンポーネントが返されます。




2

MS SQL Serverの、437の 426 407 398バイト

SQLフィドル

私は改行などを削除できると確信していますが、これは私がそれを作るつもりだったのと同じくらいコンパクトです:

create function j(@ int)
returns int
as BEGIN
declare @a varchar(max)='',@b int,@c int=0,@d int=0,@e int=0,@f int=0,@g int=0,@h int=0
while @>0 BEGIN SELECT @a=cast(@%2 as char(1))+@a,@=@/2
END
SET @b=len(@a)
while @<@b
BEGIN
select @c=@d,@d=cast(substring(@a,@b-@,1)as int)
IF @d=1
BEGIN IF @c=0
SELECT @e=@,@g=1
else SET @g+=1 END
IF @g>=@h BEGIN select @h=@g,@f=@e END
SET @+=1
END
return @f
END

より読みやすいバージョンは次のとおりです。

create function BinaryString(@id int)
returns int
as BEGIN
  declare @bin varchar(max)
  declare @binLen int
  declare @pVal int = 0
  declare @Val int = 0
  declare @stC int = 0 --start of current string of 1s
  declare @stB int = 0 --start of biggest string of 1s
  declare @lenC int = 0 --length of current string of 1s
  declare @lenB int = 0 --length of biggest string of 1s

  set @bin = ''

    while @id>0
      BEGIN
        SET @bin = cast(@id%2 as varchar(1)) + @bin
        SET @id = @id/2
      END

    SET @binLen = len(@bin)

    while @id<@binLen
      BEGIN
        set @pVal = @Val
        set @Val = cast(substring(@bin,@binLen-@id,1) as int)
        IF @Val = 1 and @pVal = 0
          BEGIN 
            SET @stC = @id
            SET @lenC = 1
          END
        IF @Val = 1 and @pVal = 1
          BEGIN 
            SET @lenC = @lenC + 1
          END
        IF @lenC >= @lenB
          BEGIN
            set @lenB = @lenC
            set @StB = @StC
          END

        SET @id = @id + 1 
      END

  return @StB
END

本当のトリックは、私が見つけた限りでは、数値を10進数から2進数に変換するネイティブSQL機能がないことです。その結果、変換をバイナリに手動でコーディングする必要があり、それを文字列として、正しい数字が見つかるまで一度に1文字ずつ比較することができました。

これを行うためのより良い方法があると確信していますが、(n)SQLの回答が表示されなかったので、そこに捨てるだろうと考えました。


もっとゴルフできるなら、そうしてください。しかし、そうでなければ、これは素晴らしいです!PPCGへようこそ!
NoOneIsHere

@NoOneIsHereありがとう!自分の関数名も短縮できることに気付きました;)
phroureo

2

APL(Dyalog Unicode)、22文字= 53バイト

⎕IO←0多くのシステムでデフォルトである必要があります。

⊃⌽⍸(∨⌿↑⊆⍨b)⍷⌽b2⊥⍣¯1⊢⎕

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

 入力を促す

 その結果(¯1から分離

2⊥⍣¯1 必要な数の位置を使用して、base-2に変換します

b← として保存bb inaryの場合)

 逆

() 以下の開始位置をマークします:

⊆⍨b 自己パーティションb(つまりの1連b

 ミックス(リストのリストを行列にし、ゼロでパディングする)

∨⌿ 垂直OR削減(最長のストリークを生成)

starting開始位置のndices

 逆

 最初のものを選択します(使用可能なものがない場合はゼロになります)


tioのフッターにmissingがない
ngn

@ngnそうですね。
アダム

1

MATL、15バイト

`tt2/kZ&t]xBnq&

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

半分とANDアイデアを使用します。これk1、何らかの理由で1 AND 0.5が1を返すために終了させるためにのみ必要で、無限ループを引き起こします。

(代替ソリューション:BtnwY'tYswb*&X>)-バイナリおよびランレングスエンコーディングへの変換による)


1

Googleスプレッドシート、94バイト

=Len(Dec2Bin(A1))-Find(MAX(Split(Dec2Bin(A1),0)),Dec2Bin(A1))-Len(MAX(Split(Dec2Bin(A1),0)))+1

いいえ、あまりきれいではありません。Dec2Bin(A1)参照用の変数として保存できると便利です。

キーポイント:Excelと同様に、Dec2Bin関数の最大入力値は511です。以下に示すように、それより大きいものはエラーを返します。

結果


1

R、117バイト

z=rev(Reduce(function(x,y)ifelse(y==1,x+y,y),strtoi(intToBits(scan())),,,T));ifelse(!sum(z),0,33-which.max(z)-max(z))

104バイト!の代わりにrevReduce(...,T,T)右から累積するために使用します(x,y関数定義の切り替え)。1+max(z)-which.max(z)結果は多少異なるため、使用します。ベクトル化が必要ないため、"if"代わりに使用し"ifelse"ます。aaandのany(z)代わりに使用する場合は!sum(z)、バイトをドロップします。
ジュゼッペ

これを100バイト未満にできるはずです。
ジュゼッペ

@giuseppe私はあなたの前にここにいるために多少の不正行為を感じます!たくさんの時間tnxをします!
ザヒロMor

しかし、素敵なアプローチはありませんか?
ザヒロモル

1
ああ、心配は、私はこの前に見たないが、Rは、ビット演算ではとても悪いので、うん...良い仕事をし、それに答えるように感じていなかった、あなたは私の1だ
ジュゼッペ・

1

Excel VBA、54 44バイト

@EngineerToastのおかげで-10バイト

範囲から入力を受け取り[A1]、VBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数

?Instr(1,StrReverse([Dec2Bin(A1)]),1)+[A1>0]

1
監視のC1代わりにまだそこにA1いるInstrことに加えて、ゼロ入力補正のために少しひねりを加えて結果を直接出力できると思います:?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0)(46バイト)。True = -1理由は... VBA。
エンジニアトースト

@EngineerToast-甘い!私はそれを見るべきだった。を表記に取り込むことで2バイトをドロップダウンすることができ>0ました[A1]
テイラースコット



0

R、66バイト

function(i){a=rle(intToBits(i));max(0,a[[1]][which(a[[2]]==1)])}

説明:

function(i){
  a = rle(                  # Run-length encode
    intToBits(i)            # The bits in i
  );                        # And assign it to a.
  max(0,                    # Return the maximum of zero and
      a[[1]][               # The lengths of a,
        which(a[[2]]==1)    # But only those where the repeated bit is 1
        ])
}

1
これは、その位置ではなく、最長のストリークの長さを返します。上部のテストケースと仕様を確認してください。
user2390246

この回答が修正されたら、下票を上票に変更します。また、いくつかのバイトを保存するためにのa$l代わりにa[[1]]およびのa$v代わりにa[[2]]を使用できることに注意してください:)、およびの>0代わりに==1
ジュゼッペ


0

Javascript、54文字

f=i=>i.toString(2).split(0).sort().reverse()[0].length
  • i.toString(2) 整数のバイナリ文字列を取得します。
  • .split(0)アレイ素子の各シーケンシャルなものの一部を取得します。
  • .sort().reverse() 最初に最高値を取得します。
  • [0].length私たちはその最初の値の長さを与えます。

the starting position of number of largest consecutive 1's
L3viathan

0

Perl 5、45 + 1(-p)

(sprintf"%b",$_)=~/(1+)(?!.*1\1)/;$_=length$'

ほとんどのシェルのコマンドラインでこれを記述した場合、次のように入力する必要があります。

perl -pE'(sprintf"%b",$_)=~/(1+)(?!.*1\1)/;$_=length$'"'"

最後の引用符の踊りは、perlがaを参照する'ことです。そうでなければ、シェルによって消費されます。


0

網膜52 43バイト

バイナリに変換し、1の最大文字列に続くものの長さに置き換えます。

.*
$*
+`(1+)\1
$+0
01
1

$'¶
O`
A-3`
^1+

.

オンラインで試す -すべてのテストケース

Martinのおかげで9バイト節約されました。


あなたは使用することができる$+ため${1}。しかし、最後のステージを次のような一連の
Martin Ender

@MartinEnder OK。これ${1}は、Githubのチュートリアルからコピーされました。
mbomb007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.