Un entero es pesado en binario si su representación binaria contiene más 1s que 0s 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
lzcntconbsr.fuente
popcntantes de desplazarme hacia abajo para buscar respuestas, pero no había pensadolzcnten tratar solo con los dígitos significativos según lo requerido por la pregunta.bsrlugar delzcnt(akarep bsr)? Tendría que usar ensublugar deleaya 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).popcntybsr, pero tenía 17 bytes. Estaba pensando que era bastante bueno en comparación con la primera respuesta que vi , pero este ingeniosoleatruco le quita los pantalones. También miré en compararbsfypopcnt. 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 elrepprefijo.salcno es equivalente asetc al: este último se establecealen 1 si CF se establece, no en 255.salcessbb 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, porinclo 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
0como falsas y /-2o-1verdaderasPruébalo en línea!
fuente
bincausa problemas con esta solución?maxfunciona. 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.cmpretornos0cuando 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:
de2biconvierte un número decimal en un vector numérico binario, no una cadena como lodec2binhace.modedevuelve 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>0por 35 bytes.n>>1lugar den>>>1guardar un byte ya que la entrada nunca es negativa.n/2|0no es mejor: /MATL , 3 bytes
Pruébalo en línea!
Realmente no conozco MATL, solo noté que
modepodrí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 de1siempre serán las primeras y las de0siempre 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
unsignedn>>=1an/=2. También creo que puedes usar en~nlugar 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:--1ai+=n%2*2-1. También puedes deshacerte de él>0diciendo 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
TRUEpara números pesados binarios.des el número de dígitos binarios;sum(n%/%2^(0:d)%%2calcula 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
-1byte!Pruébalo en línea!
fuente
8d 1flugar 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 %altambién funcionaría, si su valor de retorno es unbooloint8_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éleapor unmovtiempo)!Perl 6 ,
3230 bytesPruébalo
Pruébalo
Expandido:
fuente
Sabio ,
4039 bytesPruébalo en línea!
Explicación
fuente
Haskell,
4134Si
nes extraño, tome un-1si es par, tome un1. Agregue una llamada recursiva conn/2y pare sin = 0. Si el resultado es menor que0el 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 2puede 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@1o 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 de0y luego acortar01|10a.\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
intToBitsKotlin , 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 de1bits y2+log2(x)/2es 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:
111100101Cuando estos pasos repetidos no pueden ir más allá, el resultado final será una cadena contigua de
1bits, 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
\5posteriores 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
1bits 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:
1bit más significativo a la posición menos significativa donde haya un0bit. 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 de1s sin0s. Estas operaciones se realizan realmente en unario; es solo conceptualmente que se están haciendo en binario.1s" 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 de1s" 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
0bit 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-Spuede 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;}Converte 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.