Problema:
Encuentre el número de ceros a la izquierda en un entero con signo de 64 bits
Reglas:
- La entrada no se puede tratar como una cadena; puede ser cualquier cosa donde las operaciones matemáticas y bit a bit conducen el algoritmo
- La salida se debe validar con la representación de número entero con signo de 64 bits del número, independientemente del idioma
- Se aplican las reglas de golf del código predeterminado
- El código más corto en bytes gana
Casos de prueba:
Estas pruebas suponen números enteros con signo de complemento a dos. Si su idioma / solución carece o utiliza una representación diferente de enteros con signo, por favor llame y proporcione casos de prueba adicionales que puedan ser relevantes. He incluido algunos casos de prueba que abordan la precisión doble, pero no dude en sugerir cualquier otro que deba enumerarse.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
lugar de0
?Respuestas:
lenguaje de máquina x86_64 en Linux, 6 bytes
Requiere un procesador Haswell o K10 o superior con
lzcnt
instrucciones.Pruébalo en línea!
fuente
Hexagonía ,
7870 bytesPruébalo en línea!
¿No es este desafío demasiado trivial para un lenguaje práctico? ;)
longitud lateral 6. No puedo colocarlo en un hexágono de longitud lateral 5.
Explicación
fuente
Python , 31 bytes
Pruébalo en línea!
El expresson es el bit a bit
&
de dos partes:El
67-len(bin(-n))
da la respuesta correcta para entradas no negativas. Toma la longitud del bit y resta de 67, que es 3 más que 64 para compensar el-0b
prefijo. La negación es un truco para ajustar paran==0
usar que negarla no produce una-
señal al frente.El
& ~n>>64
hace que la respuesta sea0
negativan
. Cuandon<0
,~n>>64
es igual a 0 (en enteros de 64 bits), por lo tanto, da como resultado0
. Cuandon>=0
, se~n>>64
evalúa-1
y hacer&-1
no tiene efecto.Python 2 , 36 bytes
Pruébalo en línea!
Alternativa aritmética.
fuente
Java 8,
3226 bytes.Long::numberOfLeadingZeros
Construido FTW.
-6 bytes gracias a Kevin Cruijssen
Pruébalo en línea!
fuente
numberOfLeadingZeros
... Puedes jugar golf a 28 bytes por cierto:n->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
es aún más corto (26 bytes).C (gcc) , 14 bytes
Funciona bien en tio
C (gcc) ,
3529 bytesPruébalo en línea!
Que Dennis por 6 bytes
Banderas del compilador C (gcc) , 29 bytes por David Foerster
Pruébalo en línea!
fuente
__builtin_clzl
con el que puedo pensar .long
es de 32 bits (incluido Windows x64), necesita__builtin_clzll
(sin firmar, largo, largo). godbolt.org/z/MACCKf . (A diferencia de los intrínsecos de Intel, las funciones integradas de GNU C son compatibles independientemente de que la operación sea factible con una instrucción de máquina. En x86 de 32 bits, clzll se compila en una rama o cmov para hacerlzcnt(low half)+32
olzcnt(high half)
. Obsr
silzcnt
no está disponible.__builtin_clz(l)(l)
es un comportamiento indefinido para cero: "Si x es 0, el resultado es indefinido".Perl 6 ,
35 2826 bytes-2 bytes gracias a nwellnhof
Pruébalo en línea!
Bloque de código anónimo que toma un número y devuelve un número. Esto convierte el número en una cadena binaria y cuenta los ceros a la izquierda. Funciona para números negativos porque el primer carácter es un
-
eg-00000101
, por lo que no hay ceros a la izquierda.Explicación:
fuente
JavaScript (Node.js) , 25 bytes
Toma la entrada como un literal BigInt.
Pruébalo en línea!
fuente
n=>n<1?0:n.toString(2)-64
mismo?n=>n<1?0:n.toString(2).length-64
, pero eso no funcionaría de todos modos. Esto sería , creo..toString()
enfoque funcione, pero aún necesitamos un literal BigInt como entrada. De lo contrario, solo tenemos 52 bits de mantisa, lo que genera resultados no válidos cuando se pierde precisión .Python 3 , 34 bytes
Pruébalo en línea!
fuente
J , 18 bytes
Pruébalo en línea!
J , 19 bytes
Pruébalo en línea!
Explicación:
fuente
1#.[:*/\1-_64{.#:
(17) está cerca pero no funciona para números negativos :(Perl 6 , 18 bytes
-2 bytes gracias a Jo King
Pruébalo en línea!
fuente
Ruby , 22 bytes
Pruébalo en línea!
fuente
05AB1E ,
109 bytesI / O son ambos enteros
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Haskell , 56 bytes
Gracias xnor por detectar un error!
Podría asignar bastante memoria, ¡ pruébelo en línea!
Tal vez quieras probarlo con una constante más pequeña: ¡ Prueba 8 bits!
Explicación
mapM(pure[0,1])[1..64]
mapM(pure[1,0])[1..64]
sum.fst.span(>0)
fuente
Powershell, 51 bytes
Script de prueba:
Salida:
fuente
Java 8, 38 bytes
Entrada como
long
(entero de 64 bits), salida comoint
(entero de 32 bits).Puerto de respuesta de @ l4m2 C (gcc) .
Pruébalo en línea.
Explicación:
EDITAR: puede tener 26 bytes utilizando el valor incorporado
Long::numberOfLeadingZeros
como se muestra en la respuesta Java 8 de @lukeg .fuente
APL + WIN, 34 bytes
Explicación:
fuente
C # (compilador interactivo de Visual C #) , 42 bytes
Pruébalo en línea!
C # (compilador interactivo de Visual C #) , 31 bytes
Incluso más corto, basado en la respuesta C (gcc) de @ l4m2. Nunca supe que podría declarar funciones como esa, ¡gracias @Dana!
Pruébalo en línea!
fuente
Jalea ,
109 bytes-1 gracias a un buen truco de Erik the Outgolfer (ahora no es negativo simplemente
AƑ
)Un enlace monádico que acepta un número entero (dentro del rango) que produce un número entero.
Pruébalo en línea! O vea el conjunto de pruebas .
El 10 fue
ḤBL65_ɓ>-×
Aquí hay otra solución de 10 bytes, que me gusta ya que dice que es "BOSS" ...
Test-suite aquí
...
BoṠS63r0¤i
,BoṠS63ŻṚ¤i
oBoṠS64ḶṚ¤i
también funcionaría.Otro 10 byter (de Dennis) es
æ»64ḶṚ¤Äċ0
(nuevamenteæ»63r0¤Äċ0
yæ»63ŻṚ¤Äċ0
también funcionará)fuente
Ƒ
rápido, ¡muy buen trabajo!AƑ
por bastante tiempo. ¡Ten en cuenta que no se vectoriza! ;-) En realidad es "aplanar y luego verificar si todos los elementos son no negativos".Perl 5 , 37 bytes
Pruébalo en línea!
O esto 46 bytes si la "cadena" no está permitida: sub z
fuente
s/length$&/$+[0]/
(-3 bytes);)sub
palabra clave de las respuestas que contienen funciones de Perl 5.sub
en respuestas para otros idiomas, perl6, powershell y más.sub{}
hacer un sub (¿anónimo?), Lo que explica por qué se omite de las respuestas de Perl6. Estoy de acuerdo con @nwellnhof en que no se le debe permitir eliminarsub
. (cuando todavía estaba activo, como hace un año más o menos, esa era la regla)$+[0]
.Swift (en una plataforma de 64 bits), 41 bytes
Declara un cierre llamado
f
que acepta y devuelve unInt
. Esta solución solo funciona correctamente en plataformas de 64 bits, dondeInt
setypealias
editaInt64
. (En una plataforma de 32 bits,Int64
se puede usar explícitamente para el tipo de parámetro de cierre, agregando 2 bytes).En Swift, incluso el tipo entero fundamental es un objeto ordinario declarado en la biblioteca estándar. Esto significa que
Int
puede tener métodos y propiedades, comoleadingZeroBitCount
(que se requiere en todos los tipos que se ajustan alFixedWidthInteger
protocolo de la biblioteca estándar ).fuente
Haskell , 24 bytes
Pruébalo en línea!
Esto es básicamente lo mismo que la solución Java de Kevin Cruijssen, pero la encontré de forma independiente.
El argumento debe tener tipo
Int
para una compilación de 64 bits, oInt64
para cualquier cosa.Explicación
Si el argumento es negativo, el resultado es inmediatamente 0. De lo contrario, nos desplazamos a la izquierda, rellenando con unos , hasta llegar a un número negativo. Ese relleno nos permite evitar un caso especial para 0.
Solo como referencia, esta es la forma obvia / eficiente:
34 bytes
fuente
Limpio , 103 bytes
Utiliza el mismo "incorporado" que la respuesta del techo.
Pruébalo en línea!
Limpio , 58 bytes
Pruébalo en línea!
fuente
Stax , 10 bytes
Ejecutar y depurarlo
Es un puerto de la solución 05AB1E de Kevin.
fuente
Perl 5
-p
, 42 bytesPruébalo en línea!
Más largo que una solución basada en cadenas de bits, pero una solución basada en matemáticas decente.
fuente
int
llamada que debería resolver el problema.APL (NARS), 15 caracteres, 30 bytes
prueba para algunos números para ver cómo usar:
fuente
Óxido, 18 bytes
Pruébalo en línea!
fuente
K (ngn / k) , 6 bytes
Pruébalo en línea!
2\
codificar el argumento en binario#
longitud64-
restar de 64fuente
# = length
... parece basado en cadenas2\
da una lista de enteros y#
encuentra su longitud. Aquí no hay condiciones.PHP,
5046 bytesEjecutar como tubería
-R
o probarlo en línea ,<?=$argn<0?0:0|64-log($argn+1,2);
tiene problemas de redondeo; Así que tomé el camino largo.fuente
Wolfram Language (Mathematica) , 41 bytes
La fórmula para los números positivos es justa
63-Floor@Log2@#&
. Las reglas de reemplazo se usan para los casos especiales de entrada cero y negativa.La entrada no necesita ser un entero con signo de 64 bits. Esto efectivamente tomará el piso de la entrada para convertirlo en un número entero. Si ingresa un número fuera de los límites normales para un entero de 64 bits, le indicará que devuelva un número negativo que indica cuántos bits más se necesitarían para almacenar este entero.
Pruébalo en línea!
La solución de @ LegionMammal978 es bastante más corta con 28 bytes. La entrada debe ser un número entero. Según la documentación: "
BitLength[n]
es efectivamente una versión eficiente deFloor[Log[2,n]]+1
". Maneja automáticamente el caso de informe correcto de cero en0
lugar de-∞
.Wolfram Language (Mathematica) , 28 bytes
Pruébalo en línea!
fuente
Boole[#>=0](64-BitLength@#)&
es un poco más corto a 28 bytes. Utiliza el mismo concepto básico que el tuyo, pero se aplicaBitLength
yBoole
.bitNumber - math.ceil (math.log (número) / math.log (2))
por ejemplo, NÚMERO de 64 bits: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63
fuente