Desafío
Dado un número entero en formato de complemento a dos de 32 bits , devuelve el índice del segundo dígito cero menos significativo en la representación binaria, donde un índice de 0
representa el bit menos significativo y un índice de 31
representa el bit más significativo.
Si no hay un segundo cero, puede devolver 0, cualquier número negativo, cualquier valor falso o informar un error de una manera que tenga sentido en su idioma.
Puede usar la indexación 1 si lo prefiere, pero los casos de prueba a continuación utilizarán la indexación 0.
Puede usar enteros sin signo si lo prefiere; si lo hace, debe manejar enteros en el rango [0, 2^32)
. Si usa enteros con signo, debe manejar enteros en el rango [-2^31, 2^31)
. Los casos de prueba aquí usarán enteros con signo, pero tenga en cuenta que -x
(con signo) es 2^32 - x
(sin signo).
Casos de prueba
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> Ninguno -2 (0b11..10) -> Ninguno -4 (0b11..00) -> 1 -5 (0b11..1011) -> Ninguno -9 (0b11..10111) -> Ninguno 2 ^ 31-2 (0b0111..1110) -> 31
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
[0, 2^32)
.0b...
como entrada?2^32-1
porque no se suponía que regresara33
.Respuestas:
Python 2 , 45 bytes
Pruébalo en línea!
Utiliza indexación 0, números sin signo y arroja un error en ningún segundo cero.
Simplemente crea una lista de índices de bits no establecidos, de menor a mayor, y devuelve la segunda entrada.
fuente
JavaScript (ES6), 34 bytes
Devuelve un índice basado en 0, o
-1
si no se encuentra un segundo cero.Casos de prueba
Mostrar fragmento de código
Expresión alternativa
Versión recursiva, 42 bytes.
Devuelve un índice basado en 0, o
false
si no se encuentra un segundo cero.¿Cómo?
Casos de prueba
Mostrar fragmento de código
Versión alternativa sugerida por Neil, 41 bytes
Devuelve un índice basado en 0 o arroja un error de recursión demasiado alto si no se encuentra un segundo cero.
fuente
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Jalea , 7 bytes
Pruébalo en línea!
Emite algo que no está en el rango [1,31] si no hay el segundo cero. Esto incluye
32
33
y(-inf+nanj)
. Supongo que tiene sentido.Se calcula
log(((x|(x+1))+1)&~x)/log(2)
.fuente
-inf+nanj
No pensé que eso pudiera existir(-inf+nanj)
una entrada2147483647
que tenga una representación binaria de 31 1s, por lo tanto, no hay un segundo cero en notación con signo de 32 bits (es por eso que es mucho más corto que el mío y las respuestas de Erik).(-inf+nanj)
?Java, ...
194191186Bytes-159 Bytes para usar nombres de variables más pequeños y eliminar espacios en blanco
-25 Bytes, después de tomar variables aún más cortas y gracias a los consejos de @KevinCruijssen
-18 Bytes, más espacios en blanco, nombre de la función
-3 Bytes, gracias a @KevinCruijssen, acortando si la condición
-5 Bytes , Gracias a @Arnold Palmer, @KevinCruijssen, acortando el ciclo
Sin golf
fuente
static
se pueden quitar;if(n<0||n>o){return 0;}
puede serif(n<0|n>o)return 0;
(en|
lugar de||
y sin paréntesis);bs
,bsa
etc. pueden ser caracteres individuales (nunca use nombres de variables / métodos de varios bytes en code-golf); Se pueden combinarint
s, como esto:int o=2^32-2,c=0,i=x.length,l=i-1;
. Y hay algunas cosas más para el golf. Los consejos para jugar golf en Java y los consejos para jugar golf en todos los idiomas pueden ser interesantes de leer. Nuevamente bienvenido, y disfrute su estadía! :)if(c[i]=='0'){j++;}
todavía se puede jugar aif(c[i]==48)j++;
-3 bytes :) EDITAR: O mejor aún:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
puede serfor(;j<2&i>0;j+=c[i--]==48?1:0);
de -8 bytes.for(;j<2&i>0;j+=c[--i]==48?1:0);
debería funcionar. El error proviene dei
ser la longitud de la cadena, por lo que inicialmente está tratando de indexar más allá de los límites de la matriz. Si hace un decremento previo (como se muestra en el fragmento actualizado), la primera vez que lo use accederác[c.length-1]
como en su código original.Java (OpenJDK 8) ,
4438 bytesPruébalo en línea!
Devuelve 0 si no existe un segundo bit cero.
fuente
Código de máquina IA-32,
1413 bytesHexdump:
Lista de desmontaje:
Recibe entrada en
ecx
; la salida está adentroal
. Devuelve 0 por error.En primer lugar, invierte la entrada, por lo que puede usar las instrucciones de escaneo de bits para buscar los bits establecidos. Busca el bit de configuración menos significativo, lo restablece, busca el bit de configuración menos significativo nuevamente y devuelve el resultado.
Si la instrucción de escaneo de bits no encuentra ningún bit establecido, la documentación de Intel dice que la salida no está definida. Sin embargo, en la práctica, todos los procesadores dejan el registro de destino sin cambios en este caso (como señaló Cody Gray, la documentación de AMD describe este comportamiento como obligatorio).
Entonces, hay los siguientes casos:
not
y sigue siendo 0btr
y permanece 0 despuésbsf
bsf
fuente
SALC
+DEC
es extremadamente inteligente, puede eliminar un byte simplemente usando lo que esté enECX
la segundaBSF
instrucción. Lo único que requiere es un byteXCHG
para obtener el resultadoEAX
y poder devolverlo. En otras palabras,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
como registro de entrada, debemos decirle a GCC que use la convención de llamada de llamada rápida.Dyalog APL, 20 bytes
Utiliza indexación 1, tira
INDEX ERROR
en caso de que no haya segundo cero.¿Cómo?
⍵⊤⍨
- codificar⍵
como un32⍴2
- cadena binaria de longitud 32⌽
- marcha atrás~
- negar (0 → 1, 1 → 0)(⍳32)/⍨
- comprimir con el rango 1-32 (dejando índices de ceros)2⊃
- elige el segundo elementofuente
⍸
)Jalea , 13 bytes
Pruébalo en línea!
Utiliza la indexación 1, obtiene un entero sin signo como entrada. Devoluciones
0
por no encontradas.fuente
33
la entrada4294967295
(2^32-1
el equivalente sin signo de 32 bits de-1
)Jalea , 12 bytes
Un enlace monádico, que toma un número entero, usa la opción sin signo y devuelve el resultado indexado 1 (devuelve 0 cuando no existe ninguno).
Pruébalo en línea!
o
Trata eso
¿Cómo?
1)
2)
fuente
Código de máquina x86_64,
3432 bytesNo estoy seguro de si este es el enfoque correcto, una gran cantidad de bytes (resulta que no lo es ):
Pruébalo en línea!
Gracias @CodyGray por
-2
bytes.fuente
BSF
,BSR
,POPCNT
,BT
, etc. Anatolyg ha presentado una solución a lo largo de estas líneas . Todavía no he determinado si se puede vencer. :-por ecx, -1
. Eso es 3 bytes, 1 byte más corto que XOR + NEG. Este no es un buen truco cuando no juegas al golf porque introduce una dependencia de lectura falsa en el registro de destino, pero allí solo usaríasmov ecx, -1
y gastarías los 5 bytes.8o , 149 bytes
Código comentado
Uso y salida
fuente
R , 66 bytes
lee de stdin; regresa
0
sin segundo cero y el lugar de lo contrario.Pruébalo en línea!
fuente