정수의 이진 값에서 가장 긴 1의 시리즈를 계산하십시오.


32

골

음수가 아닌 정수가 주어지면 해당 정수의 이진 값에서 최대 연속 1의 수의 시작 위치를 반환하는 함수를 만듭니다.

입력이 주어지면을 0반환 0합니다.

숫자에 같은 길이의 여러 줄이있는 경우 마지막 줄의 위치를 ​​반환해야합니다.

입력

정수보다 크 거나 같음 0.

산출

아래에 설명 된대로 계산 된 정수입니다.

규칙

  • 이것은 코드 골프이므로 각 언어에서 가장 짧은 바이트 코드가 이깁니다.
  • 표준 허점은 금지되어 있습니다.

예 및 테스트 사례

실시 예 1

  • 함수에 정수 142가 전달되었습니다.
  • 142는 이진에서 10001110과 같습니다.
  • 가장 긴 줄무늬는 "111"(세 개의 줄무늬)
  • 행진은 2 ^ 1 위치에서 시작합니다
  • 함수는 결과로 1을 반환합니다

실시 예 2

  • 함수에 정수 48이 전달되었습니다.
  • 이진수로 48은 110000과 같습니다.
  • 가장 긴 줄은 "11"(두 줄의 줄)입니다.
  • 행진은 2 ^ 4 위치에서 시작합니다
  • 함수는 결과로 4를 반환합니다

실시 예 3

  • 함수에 정수 750이 전달되었습니다.
  • 750은 이진수 1011101110과 같습니다.
  • 가장 긴 줄무늬는 "111"(세 개의 줄무늬)
  • 길이가 같은 두 줄이 있으므로 나중에 줄을 반환합니다.
  • 후행은 2 ^ 5 위치에서 시작됩니다.
  • 함수는 결과로 5를 반환합니다


@Okx 본문 자체에서 언급되었으므로 태그를 추가했습니다.
— 완전히 인간적인

사람들이 테스트하도록하십시오 0. 중요한 테스트 사례입니다.
— mbomb007

2
"마지막 행진"또는 "최신 행진"대신 "가장 큰 값을 가진 줄거리"를 제안합니다.
— aschepler

@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.

축하합니다!
— Defacto

24

자바 스크립트 (ES6), 41 40 36 34 바이트

@ThePirateBay 덕분에 4 바이트 절약

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

테스트 사례

방법?

일반적인 경우 x> 0

우리는 재귀 적으로 입력 x 와 x / 2 를 사용하여 시퀀스의 가장 오른쪽 비트 만 남을 때까지 연속 세트 비트의 패턴을 점진적으로 줄입니다. 우리는 0이 아닌 마지막 값의 사본을 유지하고 밑이 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. 의 대수 0로 평가 -Infinity하고 32 비트 정수로 바이너리 비트 또는 강제 설정 강제. 추상 작업 ToInt32 의 사양에 따라 다음과 같이 예상됩니다 0.

경우 수 있습니다 NaN를 , +0 , -0 , + ∞ , 또는 -∞ , 돌려 공을


입력에 대한이 오류 0는 입력 범위의 일부입니다.
— 저스틴 마리너

@JustinMariner 수정되었습니다.
— Arnauld

무엇에 대해 Math.log2(k)|0대신 31-Math.clz32(k)? 아니면 뭔가 빠졌습니까?

@ThePirateBay Math.log2(k)|0는 실제로 특별한 경우 더 짧고 단순하다 x=0. 감사. :)
— Arnauld

1
아주 좋은 알고리즘과 좋은 설명. 나는 그것을 14 바이트의 x86 기계 코드로 구현했다 .
— Peter Cordes

12

x86 기계 코드, 14 바이트

사용 Arnauld의 알고리즘 @ 의 x &= x>>1와 전에이 단계에서 가장 높은 세트 비트 위치 복용 x하게를 0.

unsigned longest_set(unsigned edi);x86-64 System V ABI의 서명 을 사용하여 C / C ++에서 호출 할 수 있습니다 . 동일한 기계 코드 바이트는 32 비트 모드에서 동일한 방식으로 디코딩되지만 표준 32 비트 호출 규칙은 첫 번째 인수를에 넣지 않습니다 edi. (입력이 등록 변경 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명령어 (Bit Scan Reverse)는이 경우에 적합하므로 선행 0을 계산하는 대신 비트 인덱스를 직접 제공합니다. ( bsr직접 = 0과 같은 입력에 0을 생성하지 않습니다 32-lzcnt(x),하지만 우리는 너무 비 제로 입력에 대한 = 31 lzcnt BSR 필요가 lzcnt혼자 바이트 수를 것조차 지침에 저장 할 수 있습니다. 영점의 EAX를 때문에 루프가 작동하기 전에 bsr' 입력이 0 일 때 대상을 수정하지 않은 반 공식 동작.)

가장 긴 실행의 MSB 위치를 반환 할 수 있다면이 길이는 더 짧을 것입니다. 이 경우 lea ecx, [rdi+rdi](3 바이트)는 + (4 바이트) 대신 + 왼쪽 -shift를 복사 합니다.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

@Arnauld : 좋은 점, 니모닉을 해독하고 insn 참조 매뉴얼 항목에 대한 링크를 갖도록 편집되었습니다.
— Peter Cordes

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입력 범위에 있습니다.
— Mr. Xcoder

@ Mr.Xcoder 고정
— fireflame241

수정 사항에 대한 바이트를 저장할 수 있습니다ȯ-µ...
— Jonathan Allan

@JonathanAllan 나는 OR-ing이 어떻게 도움이 될지 이해하지 못한다. 코드가 있습니까?
— fireflame241

1
때문에 B항상로 시작되는 배열 반환 1 , BUṪMṪ’×Ṡ될 수 있습니다 ṪBL’. 또한, 당신은 필요하지 않습니다 Ḟ, 그리고 ḟ0이상 한 바이트를 저장합니다 ¹Ðf.
— Dennis

5

파이썬 2 , 45 바이트

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

온라인으로 사용해보십시오!

Dennis 덕분에 많은 바이트를 절약했습니다! ( len(bin(...))-3대신에 머리 위로 올라감 math.frexp)

다행히도 쉽게 고칠 수있는 버그를 찾은 @xnor에게 감사합니다!


이 같은 경우와 잘못된 답변을 제공하는 것 x=3, 내가 생각 때문에 and/or단락의 잘못 때 함수가 반환 0
— XNOR

@xnor 그것을 알아 주셔서 감사합니다! 고정되어 있습니다.
— Mr. Xcoder

4

펄 6 ,45 35 바이트

이 개선 된 버전은 @nwellnhof가 제공합니다.

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

온라인으로 사용해보십시오!


당신은 단순히 :g모든 일치를 얻기 위해 일치 할 수 있습니다 . 스마트 일치 연산자를 사용하면 40 바이트로 줄일 수 있습니다.{sort(.base(2).flip~~m:g/1+/).tail.from}
— nwellnhof

그리고 35 바이트까지 :{.msb+1-(.base(2)~~m:g/1+/).max.to}
— nwellnhof

@nwellnhof, 대단히 감사합니다. 어떻게 든 놓 쳤고 :gsmartmatch 연산자로 부사를 사용하는 방법을 알지 못했습니다. 또한.msb 방법은 여기에 상당히 도움이되며 전에는 몰랐습니다.
— Ramillies

3

파이썬 2 , 89 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

온라인으로 사용해보십시오!

편집 : Mr. Xcoder 덕분에 11 바이트를 절약했습니다.




@ Mr.Xcoder 나는 또한 그것을 생각했지만 질문은 특별히 함수를 작성하도록 요구합니다.
— Jonathan Frech

@JonathanFrech OP가 실제로 기능을 의미한다고 생각하지 않습니다 . 아마도 일반적인 용어 일 것입니다.
— Mr. Xcoder

@ Mr.Xcoder 이것을 설명하십시오. 감사합니다,
— lifebalance

3

05AB1E , 14 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

J , 18 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숫자는 ... 0? 그렇다면 1그 맥락에서 무슨 의미입니까? 그리고 0항상 기본 번호 0입니까?
— 요나

@Jonah 혼합 된 기본 변환이 구현되는 방식 때문입니다. x #. y먼저 계산 w =: */\. }. x , 1한 다음+/ w * y
— 마일

그래서 이것을 합법적으로 사용하기보다는 골프 핵으로 간주하겠습니까? #. 공공 API 대신 내부 구현 세부 정보에 의존 합니까?
— 요나

3

C # (. NET 코어) , 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 코어) , 131123 + 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;

감사의 말

Grzegorz Puł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 코어) , 164 바이트

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
당신은 죽겠다에서 8 바이트를 저장할 수 있습니다 r: 첫 번째 대답 tio.run/##dY9RS8MwFIWfza/...
— 그르 Puławski을

Arnauld 포트에 다음 과 같이 2 바이트를 저장할 수 있습니다 .T=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
— Kevin Cruijssen

1
심지어 두 개 더 (저장 바이트 60 바이트 )T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
— 케빈 Cruijssen

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  을 저장 해준 Jonathan Allan에게 감사합니다 6 바이트 합니다!

오래 걸리지 만 이것을 포기하기에는 너무 많은 노력을 기울였습니다. 나는 1이진 표현에서 s 의 가장 긴 부분 문자열을 문자 그대로 검색하는 솔루션을 추가하고 싶었습니다 ...

설명

BŒgḄṀB-수도원 도우미 링크. 다음 링크에서 Ç과 함께 사용됩니다.

B-이진 표현.
 Œg-연속적인 동일한 요소로 구성된 그룹 런.
   Ḅ-이진수를 정수로 변환합니다.
    Ṁ-최대 값.
     B-정수에서 이진으로 변환합니다.


BwÇɓÇL + ɓBL_ '-메인 링크.

B-이진 표현 (입력).
  Ç-모나드로서의 마지막 링크. 입력 정수를받습니다.
 w-첫 번째 서브리스트 색인.
   ɓ-별도의 2 차원 체인을 시작하십시오. 인수를 반대로합니다.
    Ç-모나드로서의 마지막 링크.
     L-길이.
      +-추가
       ɓ-별도의 2 차원 체인을 시작하십시오. 인수를 반대로합니다.
        B-이진.
         L-길이.
          _ '-젤리가 1- 인덱싱을 사용하기 때문에 결과를 빼고 증가시킵니다.
              -암시 적으로 출력됩니다.

BŒgḄṀB대신 도우미 링크가 될 수 있습니다
— Jonathan Allan

@JonathanAllan 오 와우 감사합니다!
— Mr. Xcoder

주요 링크는 다음과 같습니다BwÇɓÇL+ɓBL_‘
— Jonathan Allan

@JonathanAllan 와우, 다시 한번 감사합니다!
— Mr. Xcoder

2

코 틀린 , 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}")
}

나는 테스트하지 않았지만 이것이 스칼라에서도 작동한다고 생각합니다.
— V. Courtois

2

하스켈 , 101 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 $ 142수확량 1.

설명:

  • c한 줄의 길이를 계산하면서 입력을 이진으로 변환하고 결과를 목록으로 수집합니다. 이 목록 r<-c$div n 2의 나머지 부분 r을 재귀 적으로 계산 하면서 sum[r!!0+1|mod n 2>0]:r현재 줄의 길이 를에 추가합니다 r. 목록 이해는 다음을 확인합니다.mod n 2>0 , 즉 현재 이진수가 1인지 여부를 , 이진 행의 길이 (의 첫 번째 요소 r)를 취하여 1 을 더합니다. 그렇지 않으면 목록 이해가 비어 sum[]있고을 산출 0합니다. 예제 입력의 c 142경우 list를 생성합니다 [0,3,2,1,0,0,0,1,0].

  • (`zip`[0..])튜플의 두 번째 구성 요소로 이전 목록의 각 요소에 위치를 추가합니다. 예를 들어 이것은 [(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)].

  • maximum이 목록에서 사전 식적으로 최대 튜플을 찾습니다. 즉, 첫 번째 구성 요소 인 것처럼 연속 길이가 먼저 고려되고, 동점 인 경우 두 번째 구성 요소 인 즉, 더 큰 색인이 결정됩니다. 이 (3,1)예에서는 snd결과가 나오고 튜플의 두 번째 구성 요소를 반환합니다.




2

MS SQL 서버, 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

진짜 요령은 내가 찾을 수있는 한 숫자를 십진수에서 이진수로 변환하는 기본 SQL 기능이 없다는 것입니다. 결과적으로 변환을 수동으로 이진으로 코딩해야했고 올바른 숫자를 찾을 때까지 한 번에 한 문자 씩 문자열로 비교할 수있었습니다.

이 작업을 수행하는 더 좋은 방법이 있다고 확신하지만 SQL 응답이 표시되지 않으므로 거기에 버릴 것이라고 생각했습니다.


더 골프를 타실 수 있다면 그렇게하십시오. 그러나 그렇지 않으면 이것이 좋습니다! PPCG에 오신 것을 환영합니다!
— NoOneIsHere9

@NoOneIsHere 감사합니다! 함수 이름도 줄일 수 있다는 것을 깨달았습니다.)
— phroureo

2

APL (Dyalog Unicode) , 22 자 = 53 바이트

⎕IO←0많은 시스템에서 기본값이 필요합니다 .

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

온라인으로 사용해보십시오!

⎕ 입력 프롬프트

⊢ 그 수율 (분리형 ¯1에서 ⎕)

2⊥⍣¯1 필요한만큼 많은 위치를 사용하여 밑이 2로 변환

b← 로 저장 b( b inary)

⌽ 역

(… ) 다음의 시작 위치를 표시하십시오.

 ⊆⍨b 자체 파티션 b(즉, 1 줄 b)

 ↑ 믹스 (리스트 목록을 행렬로 만들고 0으로 채 웁니다)

 ∨⌿ 수직 OR 감소 (가장 긴 줄무늬)

⍸ ɩ 시작 위치 ndices

⌽ 역

⊃ 첫 번째 것을 고르세요 (아무것도 없으면 0을 얻습니다)


당신은 tio의 바닥 글에 ∇이 없습니다
— ngn

@ngn 맞아.
— Adám

1

MATL , 15 바이트

`tt2/kZ&t]xBnq&

온라인으로 사용해보십시오!

반과 AND 아이디어를 사용합니다. 는 k이 종료되는 있도록에만 필요1 어떤 이유로, 1 및 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입니다. 그보다 큰 것은 아래에 표시된 것처럼 오류를 반환합니다.

Results


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 바이트! 대신에 오른쪽에서 누적 rev하는 Reduce(...,T,T)데 사용 합니다 ( x,y함수 정의에서 전환 ). 그런 다음 1+max(z)-which.max(z)결과가 약간 다르므로 사용하십시오. 벡터화가 필요하지 않으므로 "if"대신 사용하십시오 "ifelse". aaand any(z)대신 사용 !sum(z)하면 바이트를 삭제합니다.
— 주세페

우리는 이것을 100 바이트 미만으로 가져올 수 있어야한다고 생각합니다.
— 주세페

@ giuseppe 나는 당신 앞에 여기에있는 것에 대해 다소 사기꾼을 느낍니다! 시간 tnx 무리를 할 것입니다!
— Zahiro Mor

그러나 좋은 접근 방식은 없습니까?
— Zahiro Mor

1
오, 걱정하지 마세요, 나는 이것을 일찍 보았지만 R이 비트 연산에서 너무 나쁘기 때문에 대답하고 싶지 않았습니다 ... 그래, 잘했습니다. 내 +1을 얻었습니다
— Giuseppe

1

엑셀 VBA, 54 44 Bytes

@EngineerToast 덕분에 -10 바이트

범위에서 입력 [A1]을 받고 VBE 즉시 창으로 출력하는 익명 VBE 즉시 창 기능

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

1
Besides the oversight having C1 still in there instead of A1, I think you can output the Instr results directly with a little twisting for the zero input correction: ?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0) (46 bytes). True = -1 because... VBA.
— Engineer Toast

@EngineerToast - Sweet! I should have seen that; I was able to drop it down 2 bytes by bringing the >0 into the [A1] notation
— Taylor Scott



0

R, 66 Bytes

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

Explanation:

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
This returns the length of the longest streak, not its position. Check against the test cases and the specs at the top.
— user2390246

I will change my downvote to an upvote once this answer is corrected. Also, note that you can use a$l instead of a[[1]] and a$v instead of a[[2]] to save some bytes :), as well as >0 instead of ==1.
— Giuseppe


0

Javascript, 54 chars

f=i=>i.toString(2).split(0).sort().reverse()[0].length
  • i.toString(2) gets the binary string for the integer.
  • The .split(0) gets each sequential ones part in an array element.
  • .sort().reverse() gets us the highest value as first.
  • The [0].length gives us the length of that first value.

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

0

Perl 5, 45 + 1 (-p)

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

If you write this out on the command line of most shells, you may have to type this as:

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

The dance of the quotes at the end is just to get perl see a ', which would otherwise be consumed by the shell.


0

Retina, 52 43 bytes

Convert to binary, then replace with the length of what follows the largest string of ones.

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

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

.

Try it online - all test cases

Saved 9 bytes thanks to Martin.


You can use $+ for ${1}. But you can save even more by replacing the last stage with a bunch of stages like this: tio.run/##K0otycxL/K/…
— Martin Ender

@MartinEnder Ok. The ${1} was copied from your tutorial on Github.
— mbomb007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.