정수의 이진 값에서 가장 긴 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

우리는 재귀 적으로 입력 xx / 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)⍷⌽b2⊥⍣¯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.