Su tarea es, dado un número entero sin signo n
, encontrar el número más grande que se puede crear eliminando un solo byte (8 bits consecutivos) de datos.
Ejemplo
Dado el número 7831
, primero lo convertimos a binario (eliminando los ceros iniciales):
1111010010111
Luego encontramos el grupo consecutivo de 8 bits que, cuando se eliminan, producirán el mayor resultado nuevo. En este caso, hay 3 soluciones, que se muestran a continuación
1111010010111
^ ^
^ ^
^ ^
Eliminando esto cualquiera de estos rendimientos 11111
, que luego convertimos de nuevo a su valor decimal 31
para la respuesta.
Casos de prueba
256 -> 1
999 -> 3
7831 -> 31
131585 -> 515
7854621 -> 31261
4294967295 -> 16777215 (if your language can handle 32 bit integers)
Reglas
- Se garantiza que la longitud de bits
n
será mayor que 8. - Teóricamente, su solución debería funcionar para cualquier longitud de bits
n
mayor que 8, pero en la práctica, solo necesita trabajar para enteros 255 <n <2 16 - La entrada / salida debe estar en decimal.
- Puede enviar un programa completo o una función.
- Este es el código golf , por lo que gana el programa más corto (en bytes)
Respuestas:
Jalea , 6 bytes
Un enlace monádico que toma un número y devuelve un número.
Pruébalo en línea!
¿Cómo?
Utiliza un buen rápida ,
Ƥ
desarrollado por millas ...fuente
J , 12 bytes
Pruébalo en línea!
fuente
&.
; Este es el tipo de problema perfecto para ello.Python 2 , 41 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 54 bytes
Funciona hasta 2 ** 31-1. Porque alguien pidió una respuesta un poco retorcida ...
fuente
Pyth , 21 bytes
Esta es una función recursiva (debe llamarse con
y
, o ver el enlace).Pruébalo aquí!
fuente
Mathematica, 69 bytes
Pruébalo en línea!
Esta solución funciona para grandes cantidades ¡ Pruébelo en línea!
-3 bytes de KellyLowder
fuente
Max[c=#~RealDigits~2;Array[Drop[c[[1]],#;;#+7]~FromDigits~2&,Last@c-7]]&
Python 3 ,
686660 bytes-2 bytes gracias al Sr. Xcoder!
-4 bytes gracias a los ovs!
-2 bytes gracias a Erik the Outgolfer!
Pruébalo en línea!
fuente
n.bit_length()-8
es equivalente alen(bin(n))-10
.Wolfram Language (Mathematica) , 46 bytes
Pruébalo en línea!
Esta versión solo puede manejar entradas de hasta 2 518 -1, de lo contrario nos encontramos con el límite de tamaño de pila de Mathematica. (El límite puede variar entre las instalaciones de Mathematica.) La segunda solución en esta respuesta lo evita.
Cómo funciona
Un enfoque recursivo basado en la siguiente lógica:
0
para cualquier entrada menor que256
, ya que tomar un byte del número se come todo el número. Este es nuestro caso base, por lo que está incluido a pesar de que las especificaciones nos prometen que no tendremos que manejar tales entradas.Max
dos opciones: comer el byte más bajo (dándonos la entrada dividida por256
) o cortar el bit más bajo, recurrir al entero restante y agregar el bit más bajo cuando hayamos terminado.Wolfram Language (Mathematica) , 55 bytes
Pruébalo en línea!
Una versión alternativa que crea una tabla en lugar de recursividad, por lo que funciona para números de cualquier tamaño que Mathematica pueda manejar.
fuente
Retina ,
716764 bytesPruébalo en línea! Link solo incluye los casos de prueba más rápidos, para no sobrecargar excesivamente el servidor de Dennis. Editar: Guardado 3 bytes gracias a @MartinEnder. Explicación:
Convierte de decimal a binario.
Construya una lista de cadenas obtenidas eliminando 8 dígitos consecutivos de todas las formas posibles.
Ordénelos en orden inverso y tome el primero (el más grande).
Convertir de nuevo a decimal. (Ver la explicación de @ MartinEnder ).
fuente
Java (OpenJDK 8) ,
138134 bytesPruébalo en línea!
fuente
i.toBinaryString(i)
puede seri.toString(i,2)
.ReRegex ,
294275 bytesAhorró 19 bytes usando mejores definiciones de 'función'
Yo diría que esto es bastante bueno para un lenguaje único de Regex.
La base lib permite la conversión entre Unary y Decimal (que es necesario ya que la especificación de desafío declara explícitamente decimal), pero no admite Binary; Así que tuve que escribir eso como parte del script agregando 120 bytes.
Pruébalo en línea!
Por expresiones regulares individuales.
Pasos
En primer lugar, importamos la biblioteca 'base', que da dos expresiones regulares. Uno que se convierte
u<numbers>
en unario. Y uno que convierte ded<unary_underlines>
nuevo a decimal. Esto se debe a que el desafío requiere IO en base10.Luego definimos un puñado de expresiones regulares que convierten unario en binario.
El primero de ellos,
b(\d*):(_*)\2_b/b1$1:$2b/
buscab
, opcionalmente seguido por algunos dígitos binarios, luego a:
, luego cualquier cantidad de subrayados, seguido de exactamente la misma cantidad de subrayados más uno, y finalmente otrob
.Luego reemplazamos eso con
b1
seguido de los dígitos binarios de antes:
, y solo la primera mitad de los guiones bajos, y finalmente la últimab
.Entonces esto verifica si el unario no es divisible por dos, y si es así, antepone 1 a sus dígitos binarios, luego lo divide menos uno por dos.
El segundo,
b(\d*):(_+)\2b/b0$1:$2b/
es casi idéntico, sin embargo, no busca un extra_
, lo que significa que solo coincide si es divisible por dos, y en este caso antepone un0
en su lugar.El tercero verifica si no tenemos dígitos unarios, y si es así, quita el relleno para dejar solo los dígitos binarios.
El último verifica si nunca se proporcionaron dígitos binarios, y en ese caso simplemente se va
0
.El siguiente grupo de expresiones regulares que definimos es convertir binario nuevamente en unario, y son un poco más simples.
El primero de este grupo,
B(_*):1/B$1$1_:/
al igual que su antítesis, detecta aB
, seguido de cualquier cantidad de dígitos unarios:1
. EnB
este caso, no comprueba la coincidencia , ya que solo busca un dígito a la vez. Si esto coincide, duplica la cantidad previamente coincidente de dígitos unarios y agrega uno, luego elimina el uno.El segundo,
B(_*):0/B$1$1:/
es casi idéntico al primero, excepto que coincide con a en0
lugar de a1
, y no agrega un dígito unario adicional.El último de estos,
B(_*):B/$1/
comprueba si no hay más dígitos binarios, y si es así, desenvuelve el unario. A diferencia de su antítesis, esto no necesita un caso especial 0.A continuación definimos las
j
expresiones regulares, que actúan como una función de división.El primero,
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
hace la mayor parte del trabajo pesado. Buscaj
, opcionalmente seguido por dígitos binarios que son el "incrementador", luego una coma seguida por el incrementador, luego exactamente 8 dígitos binarios seguidos por el resto del número binario, luego a:
. El primero de los 8 dígitos se agrega al incrementador, incrementándolo así, luego todo lo que no sean esos 8 dígitos de la entrada binaria se agrega después del:
siguiente a,
. Entonces (si estuviéramos usando 2 dígitos en lugar de 8)j,1001:
seríaj1:1001:,01
entoncesj10:1001,01,11
. Además, los elementos de matriz adjuntos se envuelven enB
s, para convertirlos de nuevo a unario.El otro,
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
verifica si quedan menos de 8 dígitos binarios para verificar después del incrementador, y si es así, elimina todo lo que no sea la matriz envuelta en,
s. P.ej.,_,___,
Durante y después de la creación de la matriz, definimos las expresiones regulares de comparación.
El primero de ellos,
,((_+)_+),(\2),/,$1,/
verifica una coma seguida de una cierta cantidad de guiones bajos, luego un poco más, seguida de una coma, luego la primera cantidad de guiones bajos, que una coma. Luego lo reemplaza con la cantidad total de guiones bajos en el primer elemento rodeado por,
s.El último,
,(_+),(\1_*),/,$2,/
busca una coma seguida de una cierta cantidad de guiones bajos seguidos de otra coma, luego la misma cantidad o más guiones bajos y una última coma. En su lugar, esto dejará el elemento correcto.Finalmente, cuando queda un elemento que coincide
^,(_*),$
, eliminamos las comas circundantes y las convertimos a decimal a través ded<>
. Entonces no se pueden disparar más expresiones regulares y se presenta la salida.La entrada se coloca inicialmente en la plantilla
j,b:u<(?#input)>b:
, que primero convierte la entrada decimal en unario, por ejemplo5
->j,b:_____b:
, luego el unario resultante en binario,j,101:
luego divide el binario (que no funciona para el ejemplo), obtiene el elemento más grande, convierte volver al decimal, y listo.fuente
C (gcc),
91bytes-23 bytes de Colera Su
Soporta hasta
2**31-1
Pruébalo en línea!
Comienza con los 8 bits bajos
(j=0)
, luego sube, cambiando la salida si el número con bits[j,j+8)
recortados es mayor que nuestra corriente, y continúa hasta que x no tenga bits por encimaj+8
fuente
x>>j+8
yx>>j+8<<j|x%(1<<j)
en una variable (paréntesis eliminados) lo reducirá a 68 bytes .Jalea , 12 bytes
Pruébalo en línea!
Bytes guardados gracias a Jonathan Allan !
fuente
JavaScript (ES6),
9491 bytes-3 bytes gracias a Justin Mariner
Simplemente lanzo una solución basada en cadenas de JavaScript, pero espero que alguien publique una solución basada en bits por separado para que pueda aprender algo.
Mi solución toma recursivamente un fragmento de 8 bits de la cadena, tomando el valor máximo que se encuentra.
Mostrar fragmento de código
fuente
+(...)
que se convierte'0b'+c[1]+c[2]
en un número, porqueMath.max
ya lo hace. Pruébalo en línea! ( especificación para referencia futura )C # (.NET Core) ,
122 + 13 = 135120+ 13 = 133 bytesPruébalo en línea!
+13 para
using System;
Me imagino que hay una manera de hacer esto sin usar
Convert
. De cualquier manera, estoy seguro de que esto podría reducirse.Expresiones de gratitud
-2 bytes gracias a Kevin Cruijssen
Sin golf
fuente
while
afor
y poniéndolovar b
en él:for(var b=Convert.ToString(n,2);i<b.Length-7;)
,t
y no usandoMath.Max
, sino una verificación manual en su lugar:n=>{int m=0,i=0,t;for(var b=Convert.ToString(n,2);i<b.Length-7;m=t>m?t:m)t=Convert.ToInt32(b.Remove(i++,8),2);return m;}
( 120 + 13 bytes )PHP, 67 + 1 bytes
Ejecutar como tubería
-nR
o probarlo en línea .fuente
Pyth, 19 bytes
Respuesta alternativa:
Explicación:
La otra respuesta utiliza un enfoque similar, excepto que primero gira a la derecha y obtiene todos los bits, excepto los últimos 8.
fuente
MATL ,
2321 bytesPruébalo en línea!
Lamentablemente,
Bn8-:8:!+q&)
solo produce las rebanadas que se eliminarán, no el resto que nos gustaría conservar.fuente
Bn8-:"GB[]@8:q+(XBvX>
(asignar[]
con en(
lugar de usar&)
y reemplazar&:
por:
y además)Java (OpenJDK 8) , 73 bytes
Pruébalo en línea!
fuente
Octava ,
8180 bytesPruébalo en línea!
Esta es una solución diferente a mi intento original, ahorrando otros 14 bytes.
El código se desglosa de la siguiente manera:
En la sexta línea, el número de grupos se calcula al encontrar el exponente de la siguiente potencia de dos más grande que la entrada (número de bits en el número de entrada), y restando 7 a medida que eliminamos 8 bits de cada grupo; el número resultante es almacenado
b
para más tarde.Luego calculamos una matriz de potencias de dos en la quinta línea que es lo suficientemente grande para todos los grupos posibles que se pueden eliminar. Guardamos esto en variable
c
para más adelante.En la siguiente línea hacia arriba (cuarta línea), multiplicamos la entrada por la matriz de potencias de dos (esencialmente el desplazamiento de bits de cada número hacia arriba) y convertimos el resultado a binario. Si tomamos el ejemplo de 7831, esto da como resultado una matriz 2D que contiene:
Si luego cortamos los 8 bits centrales, eso es equivalente a eliminar cada uno de los grupos de 8 bits. Esto se hace por la tercera línea.
La matriz resultante se convierte de nuevo a decimal en la segunda línea. También tenemos que dividir
c
para deshacer la escala que se hizo a cada grupo inicialmente.Finalmente en la primera línea se declara una función anónima y se calcula el valor máximo de todos los grupos.
nextpow2(x+1)
lugar dennz(bin2dec(x))
Intento original -
120 9895 bytesPruébalo en línea!
El código se divide de la siguiente manera:
Básicamente, calcula una matriz que contiene los posibles grupos de valores que se pueden eliminar, y luego calcula cuál termina dando el mayor número.
Trabajando línea por línea, la quinta línea calcula los grupos que se pueden eliminar. Por ejemplo, tome 7831. Este es un número de 13 bits, que le da a los grupos:
El resultado de la quinta línea es una matriz lógica 2D que se puede usar para indexar.
La cuarta línea del código convierte la entrada en una matriz de bits (representada como caracteres '0' y '1'), y luego la replica
n
-7 veces (n
en número de bits) dando una línea para cada posible agrupamiento. La máscara de grupo anterior se usa para eliminar cada uno de los grupos posibles.En la tercera línea, el resultado se reforma para deshacer el aplanamiento no deseado que resultó de aplicar la máscara de grupo. La segunda línea se convierte de nuevo en una matriz de números decimales resultantes. Y la primera línea define la función anónima como el valor máximo de la matriz de grupos posibles.
fuente
Perl 5 , 78 + 1 (
-p
) = 79 bytesPruébalo en línea!
fuente
Ruby , 55 bytes
Pruébalo en línea!
fuente
Perl, 53 bytes
(el
use 5.10.1
traer perl al nivel de lanugage 5.10.1 es gratis)Dé el número de entrada en STDIN. Se quedará sin memoria para números grandes, pero el número de 32 bits en la entrada aún no es un problema
fuente