Calcola la serie più lunga di 1 nel valore binario di un numero intero


32

Obbiettivo

Dato un numero intero non negativo, creare una funzione che restituisca la posizione iniziale del numero di 1 consecutivi più grandi nel valore binario di quel numero intero.

Quando viene fornito un input 0, restituire 0.

Se il numero ha più strisce di uguale lunghezza, è necessario restituire la posizione dell'ultima striscia.

Ingresso

Un numero intero maggiore o uguale a 0.

Produzione

Un numero intero calcolato come spiegato di seguito.

Regole

  • Questo è code-golf, quindi vince il codice più breve in byte in ogni lingua.
  • Sono vietate le scappatoie standard.

Esempi e casi di test

Esempio 1

  • Alla tua funzione viene passato l'intero 142
  • 142 è uguale a 10001110 in binario
  • La sequenza più lunga è "111" (una sequenza di tre)
  • La sequenza inizia nella posizione 2 ^ 1
  • La tua funzione restituisce 1 come risultato

Esempio 2

  • Alla tua funzione viene passato l'intero 48
  • 48 è uguale a 110000 in binario
  • La striscia più lunga è "11" (una striscia di due)
  • La sequenza inizia nella posizione 2 ^ 4
  • La tua funzione restituisce 4 come risultato

Esempio 3

  • La tua funzione è passata all'intero 750
  • 750 è uguale a 1011101110 in binario
  • La sequenza più lunga è "111" (una sequenza di tre)
  • Poiché ci sono due strisce di uguale lunghezza, restituiamo la striscia successiva.
  • La sequenza successiva inizia nella posizione 2 ^ 5
  • La tua funzione restituisce 5 come risultato

1
Hai bisogno di un criterio vincente, come code-golf
Okx,

@Okx Era stato menzionato nel corpo stesso, quindi ho aggiunto il tag.
totalmente umano il

Assicurati che le persone eseguano il test 0. Questo è un caso di test importante.
mbomb007,

2
Invece di "ultima serie" o "ultima serie", suggerirei "serie con il valore del posto più grande".
aschepler,

@Okx Perché è necessario un criterio vincente? Perché non può essere semplicemente un puzzle?
corsiKa

Risposte:


21

Gelatina , 10 8 byte

Ba\ÐƤṀċ¬

Provalo online!

Come funziona

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.

Congratulazioni!
Defacto,

24

JavaScript (ES6), 41 40 36 34 byte

Salvato 4 byte grazie a @ThePirateBay

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

Casi test

Come?

Caso generale x> 0

Abbiamo ricorsivamente E l'ingresso x con x / 2 che riduce progressivamente i modelli di bit impostati consecutivi fino a quando rimane solo il bit più a destra della sequenza. Conserviamo una copia dell'ultimo valore diverso da zero e determiniamo la posizione del suo bit più significativo arrotondando il logaritmo di base 2.

Di seguito sono riportati i passaggi che eseguiamo per x = 750 ( 1011101110 in binario).

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

Custodia perimetrale x = 0

Il caso speciale x = 0porta immediatamente a Math.log2(0) | 0. Il logaritmo di 0valuta -Infinitye OR binario bit a bit forza una coercizione a un numero intero a 32 bit. In conformità con le specifiche dell'operazione astratta ToInt32 , ciò fornisce l'atteso 0:

Se il numero è NaN , +0 , −0 , + ∞ o −∞ , restituisce +0


Questo errore per l'input 0, che fa parte dell'intervallo di input.
Justin Mariner,

@JustinMariner Fixed.
Arnauld,

Che dire Math.log2(k)|0invece di 31-Math.clz32(k)? Oppure mi sfugge qualcosa?

@ThePirateBay Math.log2(k)|0è in realtà sia più breve che più semplice per il caso speciale x=0. Grazie. :)
Arnauld,

1
Algoritmo molto bello e buona spiegazione. L'ho implementato in 14 byte di codice macchina x86 .
Peter Cordes,

12

codice macchina x86, 14 byte

L'utilizzo dell'algoritmo di @ Arnauldx &= x>>1 e l'assunzione della posizione di bit impostata più alta nella fase precedente xdiventa 0.

Callable da C / C ++ con firma unsigned longest_set(unsigned edi);nell'ABI System V x86-64. Gli stessi byte di codice macchina decodificheranno allo stesso modo in modalità 32 bit, ma le convenzioni di chiamata standard a 32 bit non inseriscono il primo argomento edi. (La modifica del registro di input in ecxo edxper Windows _fastcall/ _vectorcallo gcc -mregparmpotrebbe essere eseguita senza interrompere nulla.)

   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

L' BSRistruzione di x86 (Bit Scan Reverse) è perfetta per questo, dandoci direttamente l'indice di bit, piuttosto che contare gli zeri iniziali. ( bsrnon produce direttamente 0 per input = 0 come 32-lzcnt(x)farebbe, ma abbiamo bisogno di bsr = 31-lzcnt per input diversi da zero, quindi lzcntnon salveremo nemmeno le istruzioni, per non parlare del conteggio dei byte. Azzerando eax prima che il ciclo funzioni a causa di bsr' s comportamento semi-ufficiale di lasciare la destinazione non modificata quando l'ingresso è zero.)

Ciò sarebbe ancora più breve se potessimo restituire la posizione MSB nel lungo periodo. In tal caso, lea ecx, [rdi+rdi](3 byte) copierebbe + left -shift invece di mov+ shr(4 byte).

Vedere questo collegamento TIO per un chiamante asm che lo faexit(longest_set(argc-1));

Test con un loop shell:

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
Bello! Una nota per coloro che (come me) hanno più familiarità con altri dialetti di assembly: il mnemonico BSR x86 sta per "Bit Scan Reverse", non "Branch to SubRoutine".
Arnauld,

@Arnauld: buon punto, modificato per decodificare il mnemonico oltre ad avere un collegamento alla voce del manuale di riferimento insn.
Peter Cordes,

5

Gelatina , 19 17 11 byte

HÐĿ&\ḟ0ṪBL’

Provalo online!

-6 (!) Byte grazie alle acute osservazioni di @Dennis

Come funziona

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

Errori per 0, che si trova nell'intervallo di input.
Mr. Xcoder,

@ Mr.Xcoder Fixed
fireflame241

Puoi salvare un byte per la correzione conȯ-µ...
Jonathan Allan,

@JonathanAllan Non capisco come l'OR-ing sarebbe d'aiuto. Hai un codice?
fireflame241

1
Poiché Brestituisce sempre un array che inizia con 1 , BUṪMṪ’×Ṡpuò diventare ṪBL’. Inoltre, non è necessario , e ḟ0salva un byte ¹Ðf.
Dennis,

5

Python 2 , 45 byte

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

Provalo online!

Risparmio di byte grazie a Dennis! (Il testa a testa len(bin(...))-3invece di math.frexp)

Grazie a @xnor per aver trovato un bug, che fortunatamente era facilmente risolvibile!


Questo sembra dare risposte sbagliate come per x=3, penso perché i and/orcortocircuiti sbagliati quando la funzione restituisce 0.
xnor

@xnor Grazie per averlo notato! È sistemato.
Mr. Xcoder,

4

Perl 6 ,45 35 byte

Questa versione altamente migliorata è per gentile concessione di @nwellnhof.

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

Provalo online!


Puoi semplicemente abbinare :gper ottenere tutte le partite. Con l'operatore smart-match, ho potuto giocare a golf fino a 40 byte:{sort(.base(2).flip~~m:g/1+/).tail.from}
nwellnhof


@nwellnhof, grazie mille. In qualche modo mi mancava :ge non riuscivo a capire come usare l'avverbio con l'operatore smartmatch. Anche il .msbmetodo è abbastanza utile qui e non lo sapevo prima.
Ramillies,

3

Python 2 , 89 78 byte

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

Provalo online!

EDIT: salvato 11 byte grazie a Mr. Xcoder.




@ Mr.Xcoder Ho pensato anche a questo, anche se la domanda chiede specificamente di scrivere una funzione.
Jonathan Frech,

@JonathanFrech Non penso che l'OP abbia significato davvero la funzione . Probabilmente solo un termine generico.
Mr. Xcoder,

@ Mr.Xcoder Per favore, spiegalo. Grazie,
lifebalance,

3

05AB1E , 14 12 11 byte

bDγàŠrkrJgα

Provalo online!o eseguire casi di test .

Spiegazione

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 byte

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

Provalo online!

Spiegazione

(#-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

Molto lucido. Non sono sicuro di aver compreso appieno cosa sta succedendo con la conversione di base mista. Perché conta il numero di quelli consecutivi alla fine della stringa? Inoltre, se le basi specificate sulla xdiade sono tutte 0 e 1, cosa significa? Un numero di base 2 ha cifre 0e 1, quindi un 1numero di base ha cifre ... 0? allora cosa 1significa in quel contesto? Ed è sempre un 0numero di base 0?
Giona

@Jonah È più dovuto all'implementazione della conversione di base mista. x #. yprima calcola w =: */\. }. x , 1poi ritorna+/ w * y
miglia

considereresti questo un trucco da golf piuttosto che un uso legittimo #., dal momento che fai affidamento sui dettagli di implementazione interna piuttosto che sull'API pubblica?
Giona,

3

C # (.NET Core) , 64 60 byte

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

Provalo online!

Versione AC # della risposta di @ Arnauld

Ringraziamenti

4 byte salvati grazie a Kevin Cruijssen.

C # (.NET Core) , 131 123 + 18 = 141 byte

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

Provalo online!

+18 byte per using System.Linq;

Ringraziamenti

8 byte salvati grazie a Grzegorz Puławski.

Degolfed

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 byte

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

Provalo online!

Una non Linqsoluzione, che sono sicuro potrebbe essere migliorata, anche se nulla è immediatamente evidente.

Degolfed

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
Puoi salvare 8 byte abbandonando rla prima risposta: tio.run/##dY9RS8MwFIWfza/…
Grzegorz Puławski,

Puoi salvare due byte nel tuo porto di Arnauld in questo modo:T=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
Kevin Cruijssen,

1
O anche altri due byte salvati ( 60 byte ):T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
Kevin Cruijssen,

2

Buccia , 12 byte

→S§-€¤≠Lo▲gḋ

Provalo online!

Spiegazione

                 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

Gelatina ,  14 13 12  11 byte

Bµṣ0Ṫ$ƤMḢạL

Un collegamento monadico che prende e restituisce numeri interi non negativi.

Provalo online! o vedi la suite di test .

Come?

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

Avevo una soluzione simile ma ŒrṪPinvece ho usato i prefissi.
miglia,

2

Gelatina , 19 byte

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

Provalo online!

Grazie a Jonathan Allan per aver salvato  4  6 byte!

Ho lavorato troppo per abbandonarlo, anche se è un po 'lungo. Volevo davvero aggiungere una soluzione che cercasse letteralmente la sottostringa più lunga di 1s nella rappresentazione binaria ...

Spiegazione

BŒgḄṀB - Collegamento di supporto monadico. Verrà utilizzato con Ç nel collegamento successivo.

B - Rappresentazione binaria.
 --G - Esecuzioni di gruppo di elementi uguali consecutivi.
   Ḅ - Converti da binario a intero.
    Ṁ - Valore massimo.
     B - Converti da intero a binario.


BwÇɓÇL + ɓBL_ '- Collegamento principale.

B - Rappresentazione binaria (dell'ingresso).
  Ç - Ultimo collegamento come monade. Accetta il numero intero di input.
 w - Primo indice della lista secondaria.
   ɓ - Avvia una catena diadica separata. Annulla gli argomenti.
    Ç - Ultimo collegamento come monade.
     L - Lunghezza.
      + - Aggiunta
       ɓ - Avvia una catena diadica separata. Annulla gli argomenti.
        B - Binario.
         L - Lunghezza.
          _ '- Sottrai e incrementa il risultato (perché Jelly usa 1-indicizzazione).
              - Uscita implicita.

Il tuo collegamento di supporto potrebbe essere BŒgḄṀBinvece
Jonathan Allan,

@JonathanAllan Oh wow grazie!
Mr. Xcoder,

Il tuo link principale potrebbe essereBwÇɓÇL+ɓBL_‘
Jonathan Allan,

@JonathanAllan Wow, grazie ancora!
Mr. Xcoder,

2

Kotlin , 77 byte

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

Abbellire

{
    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()!!)
}

Test

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}")
}

Non ho provato ma penso che funzioni anche in scala.
V. Courtois,

2

Haskell , 101 98 96 75 byte

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

Provalo online! Utilizzo: snd.maximum.(`zip`[0..]).c $ 142rese 1.

Spiegazione:

  • cconverte l'input in binario contando allo stesso tempo la lunghezza delle strisce di uno, raccogliendo i risultati in un elenco. r<-c$div n 2calcola ricorsivamente il resto rdi questo elenco, mentre sum[r!!0+1|mod n 2>0]:raggiunge la lunghezza corrente della sequenza a r. La comprensione dell'elenco controlla se mod n 2>0, ovvero se la cifra binaria corrente è una, e in tal caso, prende la lunghezza della sequenza precedente (il primo elemento di r) e ne aggiunge una. Altrimenti la comprensione dell'elenco è vuota esum[] produce 0. Per l'input di esempio, c 142restituisce l'elenco[0,3,2,1,0,0,0,1,0] .

  • (`zip`[0..])aggiunge la posizione a ciascun elemento dell'elenco precedente come secondo componente di una tupla. Per l'esempio questo dà [(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)].

  • maximumtrova la tupla lessicograficamente massima in questo elenco, ovvero le lunghezze delle strisce vengono considerate per prime in quanto sono il primo componente, e in caso di legame il secondo componente, ovvero l'indice più grande, decide. Questo produce (3,1)nell'esempio e sndrestituisce il secondo componente della tupla.




2

MS SQL Server, 437 426 407 398 byte

SQL Fiddle

Sono sicuro di poter rimuovere le interruzioni di riga, ecc., Ma è compatto come ero disposto a farlo:

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

Ecco una versione più leggibile:

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

Il vero trucco è che, per quanto ho potuto trovare, non esiste alcuna funzionalità SQL nativa per convertire un numero da decimale a binario. Di conseguenza, ho dovuto codificare manualmente la conversione in binario, quindi ho potuto confrontarlo come una stringa, un carattere alla volta fino a quando non ho trovato il numero giusto.

Sono sicuro che c'è un modo migliore per farlo, ma non ho visto una (n) risposta SQL, quindi ho pensato di buttarla lì.


Se puoi giocare a golf di più, per favore fallo. Ma per il resto, è fantastico! Benvenuti in PPCG!
NoOneIsHere

@NoOneIsHere grazie! Mi sono reso conto che posso abbreviare anche il nome della mia funzione;)
phroureo,

2

APL (Dyalog Unicode) , 22 caratteri = 53 byte

Richiede il ⎕IO←0valore predefinito su molti sistemi.

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

Provalo online!

 richiesta di input

 cedere che (separa ¯1da )

2⊥⍣¯1 converti in base-2, usando tutte le posizioni necessarie

b← memorizza come b(per b inary)

 inverso

(... ) contrassegnare le posizioni iniziali di quanto segue in quanto:

⊆⍨b auto-partizione b(cioè le 1 strisce di b)

 mix (crea una lista di liste in matrice, imbottitura con zeri)

∨⌿ riduzione OR verticale (produce una striscia più lunga)

ɩ ndices delle posizioni di partenza

 inverso

 scegli il primo (restituisce zero se non disponibile)


ti manca un ∇ nel piè di pagina su tio
ngn il

@ngn Hai ragione.
Adám,

1

MATL , 15 byte

`tt2/kZ&t]xBnq&

Provalo online!

Usa la metà e l'idea AND. Ilk è necessaria solo per rendere terminare per1 - per qualche motivo, 1 e 0,5 restituisce 1, causando un ciclo infinito.

(soluzione alternativa: BtnwY'tYswb*&X>)-convertendo in codifica binaria e run-length)


1

Fogli Google, 94 byte

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

No, non è molto carino. Sarebbe davvero bello poter memorizzare Dec2Bin(A1)come variabile come riferimento.

Punto chiave: come Excel, la Dec2Binfunzione ha un valore di input massimo di 511. Qualsiasi cosa di dimensioni maggiori restituisce un errore, come mostrato di seguito.

Results


1

R, 117 byte

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 byte! Invece di rev, usa Reduce(...,T,T)per accumulare da destra (cambiando x,ynella definizione della funzione). Quindi utilizzare 1+max(z)-which.max(z)poiché il risultato è leggermente diverso. Utilizzare "if"invece di "ifelse"poiché non è necessaria la vettorializzazione; aae se usi any(z)invece di !sum(z)rilasciare un byte.
Giuseppe,

Penso che dovremmo riuscire a portarlo a meno di 100 byte.
Giuseppe,

@giuseppe Mi sento un po 'imbroglione per essere qui davanti a te! Farà volte grazie mille!
Zahiro Mor,

Ma un buon approccio no?
Zahiro Mor,

1
Oh, non preoccuparti, l'ho visto prima ma non mi andava di rispondere perché R è così male nelle operazioni di bit ... Sì, buon lavoro, hai ottenuto il mio +1
Giuseppe,

1

Excel VBA, 54 44 byte

-10 byte grazie a @EngineerToast

Funzione di finestra immediata VBE anonima che accetta input dalla gamma [A1]e output alla finestra immediata VBE

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

1
Oltre alla svista che è C1ancora presente invece di A1, penso che tu possa emettere i Instrrisultati direttamente con una leggera torsione per la correzione dello zero input: ?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0)(46 byte). Vero = -1 perché ... VBA.
Ingegnere Toast,

@EngineerToast - Sweet! Avrei dovuto vederlo; Sono stato in grado di rilasciarlo di 2 byte inserendo >0la [A1]notazione
Taylor Scott,



0

R, 66 byte

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

Spiegazione:

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
Ciò restituisce la lunghezza della striscia più lunga, non la sua posizione. Controlla i casi di test e le specifiche in alto.
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.