Dado un número entero n > 0
, genera la longitud de la secuencia contigua más larga de 0
o 1
en su representación binaria.
Ejemplos
6
está escrito110
en binario; la secuencia más larga es11
, así que deberíamos volver2
16
→10000
→4
893
→1101111101
→5
1337371
→101000110100000011011
→6
1
→1
→1
9965546
→100110000000111111101010
→7
code-golf
sequence
binary
subsequence
Arnaud
fuente
fuente
Respuestas:
Python 2 ,
4645 bytesPruébalo en línea!
Cómo funciona
Al XORing n y n / 2 (dividiendo por 2 esencialmente corta el último bit), obtenemos un nuevo entero m cuyos bits sin establecer indican bits adyacentes coincidentes en n .
Por ejemplo, si n = 1337371 , tenemos lo siguiente.
Esto reduce la tarea de encontrar la ejecución más larga de ceros. Dado que la representación binaria de un entero positivo siempre comienza con un 1 , trataremos de encontrar la cadena de dígitos 10 * más larga que aparece en la representación binaria de m . Esto se puede hacer de forma recursiva.
Inicialice k como 1 . Cada vez que se ejecuta f , primero probamos si la representación decimal de k aparece en la representación binaria de m . Si lo hace, multiplicamos k por 10 y llamamos a f nuevamente. Si no lo hace, el código a la derecha de
and
no se ejecuta y devolvemos False .Para hacer esto, primero calculamos
bin(k)[3:]
. En nuestro ejemplo,bin(k)
devuelve'0b111100101110000010110'
, y0b1
al principio se elimina con[3:]
.Ahora,
-~
antes de que la llamada recursiva incremente False / 0 una vez por cada vez que f se llama recursivamente. Una vez que 10 {j} ( 1 seguido de j repeticiones de 0 ) no aparece en la representación binaria de k , la ejecución más larga de ceros en k tiene longitud j - 1 . Como j - 1 ceros consecutivos en k indican j que coinciden con los bits adyacentes en n , el resultado deseado es j , que es lo que obtenemos al incrementar Falso / 0un total de j veces.fuente
Python 2, 46 bytes
Pruébalo en línea
Extrae dígitos binarios de forma
n
inversa al tomar repetidamenten/2
yn%2
. Realiza un seguimiento de la longitud de la ejecución actualr
de dígitos iguales restableciéndolo a 0 si los dos últimos dígitos son desiguales, y luego suma 1.La expresión
~-n/2%2
es un indicador de si los dos últimos dígitos son iguales,n
es decir, es 0 o 3 módulo 4. Comprobar los dos últimos dígitos juntos resultó más corto que recordar el dígito anterior.fuente
05AB1E , 6 bytes
Pruébalo en línea!
Explicación
fuente
.¡
, puedo dejar de obligarme a tratar de usarlo.Mathematica, 38 bytes
o
fuente
Python, 53 bytes
Función lambda anónima.
fuente
Jalea , 6 bytes
Pruébalo en línea!
Cómo funciona
fuente
Ruby,
4140 bytesEncuentre la secuencia más larga de '1' en bo su inversa.
Gracias a manatwork por guardar 1 byte.
fuente
%b
's.JavaScript (ES6), 54 bytes
Una solución recursiva con mucha manipulación de bits.
n
almacena la entrada,r
almacena la duración de la ejecución actual,l
almacena la duración de la ejecución más larga yd
almacena el dígito anterior.Fragmento de prueba
fuente
f=(x,b,n,m)=>x?f(x>>1,x&1,n=x&1^b||-~n,m>n?m:n):m
Ruby,
514443 bytesSolución funcional.
@manatwork está hecho de magia
fuente
0
s consecutivos ?->s{s.to_s(2).scan(/0+|1+/).map(&:size).max}
.Python 2, 57 bytes
Una solución recursiva. Puede haber una forma más corta para la magia de bits.
fuente
Perl, 43 bytes
Contando el shebang como uno, la entrada se toma de stdin.
Pruébalo en línea!
fuente
#!perl
cuenta como cero, no#!perl -p
.-p
costo 1, suponiendo que su línea de comando Perl tendría un argumento de todos modos (por ejemplo,-e
o-M5.010
), por lo que puede ingresar unp
poco después de uno de los guiones. El#!perl
es gratis (aunque innecesario).Pipa , 16 bytes
Parece que debe haber una forma más corta de obtener las corridas del mismo dígito ...
Toma entrada como argumento de línea de comando. Pruébalo en línea!
Explicación
fuente
Perl 6 , 36 bytes
Explicación:
Pruébalo en línea .
fuente
Haskell, 79 caracteres
dónde
O en versión sin golf:
Explicación:
intToBin
convierte un int en una lista de dígitos binarios (lsb primero).group
agrupa secuencias contiguas, de modo que se[1, 1, 0, 0, 0, 1]
convierte en[[1, 1],[0, 0, 0],[1]]
.maximum . map length
calcula para cada lista interna su longitud y devuelve la longitud de la más larga.Editar: Gracias a @xnor y @Laikoni por guardar bytes
fuente
group
no está en Prelude de forma predeterminada, debe hacerimport Data.List
para usarlo.let
:i n|(q,r)<-n`quotRem`2=r:i q
. Vea nuestros consejos de golf Haskell .quotRem
puede serdivMod
. Creo que puedes usarloi 0=[]
como el caso base.div
ymod
directa es aún más corto:i n=mod n 2:i(div n 2)
.Pyth, 7 bytes
Ejecute la codificación de longitud en la cadena binaria, luego ordénela de modo que las ejecuciones más largas sean las últimas, luego tome el primer elemento (la longitud) del último elemento (la ejecución más larga) de la lista.
En pseudocódigo:
fuente
J , 21 bytes
Pruébalo en línea!
Explicación
fuente
MATLAB 71 bytes
Esto convierte la variable entera 'a' en una matriz binaria int8 y luego cuenta el número de veces que el resultado debe diferenciarse hasta que no haya cero en el resultado.
Soy nuevo aquí. ¿Este tipo de entrada y una línea están permitidas por las reglas PCG?
fuente
a
cona=input('');
. Además, algunos consejos de golf: en~a
lugar dea==0
. ¿Realmente necesitasint8
)?Octava , 31 bytes
Pruébalo en línea!
Explicación
Esta es una traducción de mi respuesta MATL. Mi plan inicial fue un enfoque diferente, a saber
@(n)max(diff(find(diff([0 +dec2bin(n) 0]))))
. Pero resulta que Octave tiene unarunlength
función (que acabo de descubrir). Por defecto, solo genera el conjunto de longitudes de ejecución, por lo que el resultado deseado es elmax
de ese conjunto. La salida dedec2bin
, que es una matriz de caracteres (cadena) que contiene'0'
y'1'
, debe convertirse a una matriz numérica usando+
, porquerunlength
espera una entrada numérica.fuente
Utilidades Bash / Unix,
666542 bytesGracias a @DigitalTrauma por mejoras significativas (¡23 bytes!).
Pruébalo en línea!
fuente
Bash (+ coreutils, + GNU grep),
33, 32 bytesEDICIONES:
Golfed
Explicado
¡Pruébelo en línea!
fuente
Brachylog , 9 bytes
Pruébalo en línea!
Explicación
fuente
C #, 106 bytes
Versión formateada:
Y un enfoque alternativo para acceder a la cadena por índice a 118 bytes, con espacios en blanco eliminados:
fuente
Javascript, 66 bytes
Gracias a manatwork por el código.
Explicación
Convertir número a cadena binaria.
Dividir cada carácter diferente (0 o 1) (esta expresión regular captura espacios vacíos pero pueden ignorarse)
Para cada elemento de la matriz, obtenga su longitud y colóquela en la matriz devuelta.
Convertir matriz en lista de argumentos ([1,2,3] -> 1,2,3)
Obtenga el mayor número de argumentos.
fuente
x=>x.toString(2).split(/(0+|1+)/g).map(y=>y.length).sort().pop()
x=>Math.max(...x.toString(2).split(/(0+|1+)/g).map(y=>y.length))
sort((a,b)=>b-a)
. Por defecto, la función de clasificación se ubica10
entre1
y2
.Maravilla , 27 bytes
Uso:
Convierte a binario, coincide con cada secuencia de 0 y 1, obtiene la duración de cada coincidencia y obtiene el máximo.
fuente
Lote, 102 bytes
Respuesta del puerto de @ edc65.
%2
..%4
estará vacío en la primera llamada, así que tengo que escribir las expresiones de tal manera que aún funcionen. El caso más general es el%3
que tuve que escribir(%3+0)
.%2
es más fácil, ya que solo puede ser0
o1
, que son iguales en octal, por lo que0%2
funciona aquí.%4
resultó ser aún más fácil, ya que solo necesito restarlo.(%4-r>>5)
se utiliza para compararl
conr
tan lotes deset/a
no tiene un operador de comparación.fuente
Dyalog APL , 22 bytes
Tren de funciones anónimo
⌈/∘(
... El máximo de los resultados del siguiente tren de funciones anónimo ...≢¨
el recuento de cada⊢⊂⍨
partición del argumento, donde la partición está determinada por los que están en1,
uno antepuesto a2≠/
la desigual desigual de⊢
el argumento)
aplicado a2⊥⍣¯1
from-base-2 aplicado negativo una vez (es decir, to-base-2, una vez) a⊢
el argumentoTryAPL en línea!
fuente
Japt, 15 bytes
¡Pruébalo en línea! o Verificar todos los casos de prueba a la vez .
Cómo funciona
fuente
R,
4534 bytesSe corrigió un malentendido tonto gracias a @rturnbull y @plannapus.
fuente
0
o de1
, no solo0
, ¿verdad?PowerShell ,
787473 bytesPruébalo en línea!
Ugh esos métodos .Net.
Esto solo usa una expresión regular para encontrar (y hacer coincidir) secuencias contiguas de unos y ceros, luego toma la
Length
propiedad (con un nuevo patrón que encontré que usa un conjunto de parámetros poco conocido deForEach-Object
, para guardar 1 byte) de los objetos de coincidencia resultantes, los ordena y genera el último (el más grande).fuente
J, 27 bytes
Un enfoque ligeramente diferente (y desafortunadamente más largo) para la respuesta de millas .
Uso:
Explicación
fuente