Un entero es pesado en binario si su representación binaria contiene más 1
s que 0
s mientras ignora los ceros a la izquierda. Por ejemplo, 1 es pesado en binario, ya que su representación binaria es simple 1
, sin embargo, 4 no es pesado en binario, como lo es su representación binaria 100
. En caso de empate (por ejemplo 2, con una representación binaria de 10
), el número no se considera pesado en binario.
Dado un entero positivo como entrada, genera un valor verdadero si es pesado en binario, y un valor falso si no lo es.
Casos de prueba
Formato: input -> binary -> output
1 -> 1 -> True
2 -> 10 -> False
4 -> 100 -> False
5 -> 101 -> True
60 -> 111100 -> True
316 -> 100111100 -> True
632 -> 1001111000 -> False
2147483647 -> 1111111111111111111111111111111 -> True
2147483648 -> 10000000000000000000000000000000 -> False
Puntuación
Este es el código de golf, por lo que gana menos bytes en cada idioma
code-golf
number
decision-problem
binary
Skidsdev
fuente
fuente
Respuestas:
Código de máquina x86,
1514 bytesEsta es una función que utiliza la convención de llamadas __fastcall de Microsoft (primer y único parámetro en ecx, valor de retorno en eax, callee puede clobber edx), aunque puede modificarse trivialmente para otras convenciones de llamadas que pasan argumentos en los registros.
Devuelve 255 como verdadero y 0 como falsey.
Utiliza el código de operación no documentado (pero ampliamente compatible)
salc
.Desmontaje a continuación:
Pruébalo en línea!
Gracias a Peter Cordes por sugerir reemplazarlo
lzcnt
conbsr
.fuente
popcnt
antes de desplazarme hacia abajo para buscar respuestas, pero no había pensadolzcnt
en tratar solo con los dígitos significativos según lo requerido por la pregunta.bsr
lugar delzcnt
(akarep bsr
)? Tendría que usar ensub
lugar delea
ya que le da 32-lzcnt. (O deja el dst sin modificar para src = 0, en todo el hardware Intel y AMD existente. AMD incluso documenta este comportamiento, pero Intel dice que no está definido ... De todos modos, OP dijo positivo , lo que descarta0
).popcnt
ybsr
, pero tenía 17 bytes. Estaba pensando que era bastante bueno en comparación con la primera respuesta que vi , pero este ingeniosolea
truco le quita los pantalones. También miré en compararbsf
ypopcnt
. Pero no veo de ninguna manera que se pueda superar esta solución, incluso teniendo en cuenta el 1 byte que podría guardar soltando elrep
prefijo.salc
no es equivalente asetc al
: este último se estableceal
en 1 si CF se establece, no en 255.salc
essbb al, al
, pero obtienes un ahorro de 1 byte para codificarlo. Por cierto, está documentado por AMD, y es ampliamente compatible con Intel, y la mnemotecnia incluso proviene del mapa de código de operación P6 de Intel. Así que este es bastante seguro de usar. Además, ¡una buena mejora aquí para pensar en usar esa instrucción! Esto es básicamente lo que hizo mi borrador original, excepto (1) que había usado código x86-64, porinc
lo que el doble de codificación, y (2) no había pensadosalc
, así que estaba haciendo el mismo trabajo en un camino más largo Lástima que solo pueda votar una vez.Jalea , 5 bytes
Produce resultados no vacíos (verdad) o resultados vacíos (falsos).
Pruébalo en línea!
Cómo funciona
fuente
Bo-S
, pero no pude encontrar un átomo de 1 byte que convertiría positivo / no positivo en verdadero / falso ...Æṃ
no existía en ese entonces.Python 2 , 35 bytes
Pruébalo en línea!
Antigua respuesta, 38 bytes
Salidas
0
como falsas y /-2
o-1
verdaderasPruébalo en línea!
fuente
bin
causa problemas con esta solución?max
funciona. En caso de empate, max devolverá el primer valor en el iterable que tiene el valor máximo. Este código utiliza ese hecho para asegurarse de que se devuelve 1 en caso de empate, lo que en realidad significa que hay más unos que ceros, ya que se agregó un cero adicionalbin
. En realidad, sería incorrecto si se escribiera de esta manera si no fuera por el cero extra.cmp
retornos0
cuando ambos son igualesOctava , 18 bytes
TIO no funciona ya que la caja de herramientas de comunicaciones no está incluida. Se puede probar en Octave-Online .
Cómo funciona esto:
de2bi
convierte un número decimal en un vector numérico binario, no una cadena como lodec2bin
hace.mode
devuelve el dígito más frecuente en el vector. El valor predeterminado es el más bajo en caso de empate.fuente
JavaScript (ES6),
3634 bytesfuente
f=(n,x=0)=>n?f(n>>>1,x+=n%2-.5):x>0
por 35 bytes.n>>1
lugar den>>>1
guardar un byte ya que la entrada nunca es negativa.n/2|0
no es mejor: /MATL , 3 bytes
Pruébalo en línea!
Realmente no conozco MATL, solo noté que
mode
podría funcionar en la respuesta Octave de alephalpha y pensé que había algo equivalente en MATL.fuente
Mathematica, 22 bytes
Guardado un byte gracias a @MartinEnder y @JungHwanMin .
fuente
@@
.#>#2&@@#~DigitCount~2&
Brachylog , 6 bytes
Pruébalo en línea!
Explicación
Como
ḃ
nunca unificará su salida con una lista de dígitos con ceros a la izquierda, sabemos que las ocurrencias de1
siempre serán las primeras y las de0
siempre serán las segundasọ
.fuente
Python 3 ,
44(gracias @ c-mcavoy) 40 bytesPruébalo en línea!
fuente
C (gcc) ,
51484140 bytesPruébalo en línea!
fuente
unsigned
n>>=1
an/=2
. También creo que puedes usar en~n
lugar den^-1
, lo que también debería permitirte cambiar&&
a&
n
, y no importa acerca de cambiar&&
a&
, no creo que eso funcionaría. Pero cambiarlo a*
parece funcionar&&
fue solo para manejar el caso sin firmar, pero como solo necesito manejar enteros positivos, puedo eliminarlo todo junto. Sin embargo, un buen comentario sobre/=
ser más bajo>>=
, ¡Gracias!n&1?++i:--1
ai+=n%2*2-1
. También puedes deshacerte de él>0
diciendo que producirás cero para pesado y distinto de cero para no pesadoR ,
545351 bytes-1 byte gracias a Max Lawnboy
lee de stdin; devuelve
TRUE
para números pesados binarios.d
es el número de dígitos binarios;sum(n%/%2^(0:d)%%2
calcula la suma de dígitos (es decir, número de unidades).Pruébalo en línea!
fuente
log2(n)
lugar delog(n,2)
guardar 1 byteCódigo de máquina x86_64,
232221 bytesDesmontado:
¡Gracias @Ruslan, @PeterCordes por el
-1
byte!Pruébalo en línea!
fuente
8d 1f
lugar de89 fb
?add eax, 2
+dec eax
, pero sus comentarios sugieren que desee de la subastaebx
, noeax
.jnz Next
/add
/dec
(7 bytes) conlea -1(%rax, %rbx, 2), %eax
(4 bytes) para hacereax += 2*ebx - 1
(como en la otra respuesta de código máquina x86 ). Luego, fuera del bucleneg %eax
(2 bytes) antes de desplazar el bit de signo hacia abajo. Ahorro neto de 1 byte. Otest %eax,%eax
/setge %al
también funcionaría, si su valor de retorno es unbool
oint8_t
.lea -1(%rax,rbx,2)
pero sololea -1(%eax,%eax,2)
y haber perdido bytes de esta manera ... De todos modos, ambos tenían razón, puedo guardar un byte como este. ¡Muchas gracias (a cambio lo cambiarélea
por unmov
tiempo)!Perl 6 ,
3230 bytesPruébalo
Pruébalo
Expandido:
fuente
Sabio ,
4039 bytesPruébalo en línea!
Explicación
fuente
Haskell,
4134Si
n
es extraño, tome un-1
si es par, tome un1
. Agregue una llamada recursiva conn/2
y pare sin = 0
. Si el resultado es menor que0
el número es binario pesado.Pruébalo en línea!
Editar: @ Ørjan Johansen encontró algunos accesos directos y guardó 7 bytes. ¡Gracias!
fuente
mod n 2
puede ser juston
, y es un byte más corto sin un acumulador. Pruébalo en línea!Retina ,
3734 bytesPruébalo en línea! El enlace incluye casos de prueba más pequeños (los más grandes probablemente se quedarían sin memoria). Editar: Guardado 3 bytes gracias a @MartinEnder. Explicación: La primera etapa se convierte de decimal a unario, y las siguientes dos etapas se convierten de unario a binario (esto es casi directamente de la página aritmética unaria en la wiki de Retina, excepto que estoy usando en
@
lugar de0
). La tercera etapa busca pares de caracteres diferentes, que podrían ser uno@1
o otro1@
, y los elimina hasta que no quede ninguno. La última etapa luego verifica los 1s restantes.fuente
${1}
puede ser$+
. O podría usar en!
lugar de0
y luego acortar01|10
a.\b.
.$+
hace lo correcto cuando el patrón contiene un|
? Me pregunto si podría haber usado eso antes ...$+
es súper estúpido y simplemente usa el grupo con el mayor número, ya sea que se haya usado o no. Solo es útil para jugar al golf cuando tienes más de nueve grupos o en una situación como la de aquí, y no sé por qué lo usaría en una expresión regular de producción.R , 43 bytes
Pruébalo en línea!
fuente
intToBits
Kotlin , 50 bytes
Lambda de tipo implícito
(Int) -> Boolean
. Versión 1.1 y superior solo debido al uso deInt.toString(radix: Int)
.Desafortunadamente, el tiempo de ejecución Kotlin de TIO parece ser 1.0.x, así que aquí hay un perro triste en lugar de un enlace TIO:
fuente
Pyth,
97 bytesPruébalo aquí
-2 gracias a FryAmTheEggman .
fuente
>ysJjQ2lJ
.B
!)R,
3937 bytesEsta es una combinación de los métodos utilizados por @MickyT y @Giuseppe, ahorrando otros pocos bytes.
sum(intToBits(x) > 0)
cuenta la cantidad de1
bits y2+log2(x)/2
es la mitad de la cantidad total de bits cuando se redondea hacia abajo. No tenemos que redondear hacia abajo debido al comportamiento cuando los dos valores son iguales.fuente
C # (.NET Core) ,
62, 49 bytesSin LINQ
EDITAR: dana con un golf de -13 bytes que cambia el tiempo a un recursivo y devuelve un bool en lugar de un entero.
Pruébalo en línea!
fuente
Regex (ECMAScript),
857371 bytesPruébalo en línea!
explicación por Deadcode
La versión anterior de 73 bytes se explica a continuación.
^((?=(x*?)\2(\2{4})+$)\2|(?=(x*?)(\4\4xx)*$)(\4|\5(x*)\7\7(?=\4\7$)\B))+$
Debido a las limitaciones de la expresión regular ECMAScript, una táctica efectiva es a menudo transformar el paso número uno a la vez mientras se mantiene invariable la propiedad requerida en cada paso. Por ejemplo, para probar un cuadrado perfecto o una potencia de 2, reduzca el número en tamaño mientras mantiene un cuadrado o una potencia de 2 (respectivamente) en cada paso.
Esto es lo que hace esta solución en cada paso:
1
1
1
10
01
01
Cuando estos pasos repetidos no pueden ir más allá, el resultado final será una cadena contigua de
1
bits, que es pesada, e indica que el número original también era pesado, o una potencia de 2, lo que indica que el número original no era pesado.Y, por supuesto, aunque estos pasos se describen anteriormente en términos de manipulaciones tipográficas en la representación binaria del número, en realidad se implementan como aritmética unaria.
fuente
\5
posteriores están desactivadas por una). He estudiado esto y lo he explicado y comentado en mi respuesta (porque StackExchange no permite respuestas de varias líneas).Regex (ECMAScript), 183 bytes
Este fue otro problema interesante para resolver con la expresión regular de ECMA. La forma "obvia" de manejar esto es contar el número de
1
bits y compararlo con el número total de bits. Pero no puede contar directamente las cosas en la expresión regular ECMAScript: la falta de referencias persistentes significa que solo se puede modificar un número en un bucle y en cada paso solo se puede disminuir.Este algoritmo unario funciona de la siguiente manera:
1
bit más significativo a la posición menos significativa donde haya un0
bit. Cada uno de estos pasos es una resta. Al final del ciclo, el número restante (como se representaría en binario) es una cadena de1
s sin0
s. Estas operaciones se realizan realmente en unario; es solo conceptualmente que se están haciendo en binario.1
s" con la raíz cuadrada obtenida anteriormente. Si la raíz cuadrada tuvo que redondearse hacia abajo, use una versión duplicada. Esto asegura que la "cadena binaria de1
s" debe tener más de la mitad de dígitos binarios que N para que haya una coincidencia final.Para obtener la raíz cuadrada, se usa una variante del algoritmo de multiplicación brevemente descrito en mi publicación de expresiones regulares de números Rocco . Para identificar el
0
bit menos significativo , se utiliza el algoritmo de división brevemente descrito en mi publicación de expresiones regulares de números factoriales . Estos son spoilers . Así que no sigas leyendo si no quieres que se te estropee un poco de magia regex unaria avanzada . Si desea intentar descubrir esta magia usted mismo, le recomiendo comenzar resolviendo algunos problemas en la lista de problemas recomendados etiquetados consecutivamente con spoilers en esta publicación anterior , e intentando encontrar las ideas matemáticas de forma independiente.Sin más preámbulos, la expresión regular:
^(?=.*?(?!(x(xx)+)\1*$)(x)*?(x(x*))(?=(\4*)\5+$)\4*$\6)(?=(((?=(x(x+)(?=\10$))*(x*))(?!.*$\11)(?=(x*)(?=(x\12)*$)(?=\11+$)\11\12+$)(?=.*?(?!(x(xx)+)\14*$)\13(x*))\16)*))\7\4(.*$\3|\4)
Pruébalo en línea!
fuente
Jalea , 6 bytes
Pruébalo en línea!
fuente
Bo-S
puede usarse para calcular el "peso" binario de la entrada, desafortunadamente la forma más corta de usar que parece serBo-S>0
...Ḷ
funciona bien: PJ , 12 bytes
J ejecuta verbos de derecha a izquierda, así que comencemos por el final y avancemos hacia el principio.
Explicación
fuente
(#<2*+/)@#:
debería guardar 1 a menos que me falte algo.Julia, 22 bytes
fuente
Octava , 26 bytes
Pruébalo en línea!
fuente
mode(dec2bin(a)-48)
PHP , 44 bytes
Pruébalo en línea!
PHP , 48 bytes
Pruébalo en línea!
fuente
Python 2 , 44 bytes
Pruébalo en línea!
Respuesta anterior, 47 bytes
Esto es simplemente un puerto de la respuesta C de @ cleblanc . Es más largo que otras respuestas de Python, pero pensé que valía la pena publicarlo, ya que es un método completamente diferente para encontrar la respuesta.
Pruébalo en línea!
fuente
C #, 82 bytes
fuente
n=>{var s=Convert.ToString(n,2);return s.Count(c=>c=='1')>s.Length/2;}
Convert
e incluir completamenteusing System.Linq;
(escrito más corto comonamespace System.Linq{}
). Una buena idea no se reduce lo suficiente como para garantizar el ahorro en este caso.