inspirado en Cuenta atrás desde el infinito
Dado un número entero no negativo N
, genera el número de repeticiones de los siguientes pasos que se requieren para llegar a 0:
- Convertir
N
a binario (4812390 -> 10010010110111001100110
) - Voltear cada bit (
10010010110111001100110 -> 01101101001000110011001
) - Recortar ceros a la izquierda (
01101101001000110011001 -> 1101101001000110011001
) - Convertir de nuevo a decimal (
1101101001000110011001 -> 3576217
)
Reglas
- La entrada y la salida pueden estar en cualquier formato coherente y sin ambigüedades
- La entrada estará dentro del rango entero representable nativo para su idioma (si su idioma admite enteros arbitrariamente grandes, no hay límite)
Casos de prueba
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Esta secuencia es A005811 en el OEIS.
~(~a) == a
Respuestas:
Jalea ,
64 bytesPruébalo en línea! o verificar todos los casos de prueba .
Antecedentes
Sea n un número entero no negativo.
Los pasos 2 y 3 del proceso descrito en la especificación se pueden indicar alternativamente como eliminar todos los 1 principales y alternar los bits restantes.
Esto significa que eliminaremos exactamente un grupo de dígitos binarios adyacentes e iguales en cada iteración, por lo que la longitud de la cuenta regresiva binaria de n es solo el número de estos grupos en la representación binaria de n . Para los propósitos de este desafío, piense que 0 no tiene dígitos.
Para n = 8675309 , el proceso tiene el siguiente aspecto en binario.
En lugar de contar estos grupos (que fallarían para el caso límite 0 ), hacemos lo siguiente.
n y n: 2 tienen las siguientes representaciones binarias.
Tenga en cuenta que la representación binaria de n: 2 es simplemente n 's, desplazada un bit a la izquierda.
Si hacemos XOR n y n: 2 , obtendremos un 1 (MSB) y un 1 adicional por cada par de dígitos adyacentes diferentes. El número de grupos es, por lo tanto, igual al número de bits establecidos en n ⊻ n: 2 .
Cómo funciona
fuente
Python 2, 30 bytes
Pruébalo en Ideone .
Antecedentes
Sea n un número entero no negativo.
Los pasos 2 y 3 del proceso descrito en la especificación se pueden indicar alternativamente como eliminar todos los 1 principales y alternar los bits restantes.
Esto significa que eliminaremos exactamente un grupo de dígitos binarios adyacentes e iguales en cada iteración, por lo que la longitud de la cuenta regresiva binaria de n es solo el número de estos grupos en la representación binaria de n . Para los propósitos de este desafío, piense que 0 no tiene dígitos.
Para n = 8675309 , el proceso tiene el siguiente aspecto en binario.
En lugar de contar estos grupos (que fallarían para el caso límite 0 ), hacemos lo siguiente.
n y n: 2 tienen las siguientes representaciones binarias.
Tenga en cuenta que la representación binaria de n: 2 es simplemente n 's, desplazada un bit a la izquierda.
Si hacemos XOR n y n: 2 , obtendremos un 1 (MSB) y un 1 adicional por cada par de dígitos adyacentes diferentes. El número de grupos es, por lo tanto, igual al número de bits establecidos en n ⊻ n: 2 .
fuente
Python 2, 29 bytes
Cuenta el número de alternancias entre 0 y 1 en la expansión binaria, contando el 1 inicial como una alternancia. Para ello, verifica si los dos últimos dígitos binarios son diferentes, y luego vuelve al número con el último dígito eliminado. Los dos últimos dígitos son diferentes exactamente si
n%4
es 1 o 2, lo que se puede verificar como-n%4/2
.fuente
JavaScript (ES6), 26 bytes
Funciona contando las transiciones entre 0 y 1. Solo funciona hasta 31 bits. 29 bytes para admitir 53 bits:
fuente
Haskell, 34 bytes
fuente
05AB1E ,
75 bytesGuardado 2 bytes gracias a Dennis .
Sin el caso de borde de 0 esto podría ser 3 bytes
bÔg
.Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
CJam , 14 bytes
Pruébalo en línea!
Básicamente un golpe de mi respuesta a la otra pregunta.
fuente
Java 7
112 108 100 9073 bytesIdea básica
fuente
j=j/2
se puede acortar aj/=2
. Aparte de eso, una gran respuesta!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 bytes ). Sin embargo, todavía dejaría su respuesta actual, ya que es más original y los puertos de otros usuarios son completamente opuestos al original. :)J, 14 bytes
Cuenta el número de ejecuciones en los dígitos binarios de n con el caso especial que devuelve 0 para n = 0.
Uso
Explicación
fuente
CJam ,
1110 bytes¡Gracias a @Dennis por guardar un byte!
Pruébalo en línea!
Explicación
fuente
e&
(AND lógico) guarda un byte encima\g*
.Raqueta 349 bytes
Sin golf:
Pruebas:
Salida:
fuente
tl
yib
en nombres de 1 byte.MATL , 7 bytes
Pruébalo en línea!
Explicación
fuente
Vim,
6259 bytes-3 bytes gracias a DJMcMayhem
Aquí está la salida xxd con los caracteres no imprimibles intactos:
Pruébalo en línea!
Explicación
fuente
:s/^0*
es un byte más corto que:s/^0\+
, y mientras está en el registro "eval", puede hacerlopr<S-tab>'%b',<C-r>")
para autocompletar. (Ahorra 4 bytes):s/^0*
porque coincide con una línea vacía, y necesito que falle para vaciar una línea vacía para escapar de la macro recursiva.Rubí, 26 bytes
Inspirado por la respuesta de Python de xnor.
fuente
PHP, 64 bytes
basado en mi solución de cuenta regresiva
imprime tiempos de
1
caracteresk
, dondek
es el número de iteraciones.+4 bytes para salida entera: (salida vacía para
0
)fuente
JavaScript (ES6), 44
Función recursiva
Limitado a entero positivo javascript, 31 bits:
Gestión de números de doble precisión de hasta 53 bits significativos - 59 bytes:
De otra manera: usando el sorprendente algoritmo de @Dennis, función no recursiva que administra hasta 53 bits, 43 bytes:
fuente
PHP, 51 bytes
Utiliza una expresión regular para contar el número de ejecuciones de 1 o 0. Desafortunadamente, esto necesita un caso especial para la entrada
0
que requiere 3 bytes adicionales (y da un aviso).fuente
o
para evitar el aviso. b) Puede guardar 3 bytes con la-F
bandera y en$argn
lugar de$argv[1]
. c)/1+|0+/
debería ser suficiente para la expresión regular.Java 7, 71 bytes
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Sé que esto es superado por la
split
solución de Geobits (que eventualmente se publicará), pero aún así fue divertido escribirfuente
Octava, 47 bytes
Según la entrada de OEIS, el valor que estamos buscando como solución a este desafío también es igual al número de
1
s en el código Gray para el entero dado.Wikipedia me dice que el código Gray se puede calcular como x ^ (x >> 1), por lo que en la función anterior calculo el código Gray como tal, lo convierto en una cadena binaria y cuento cuántos dígitos de esa cadena son
1
.fuente
Java 7, 64 bytes
Sé que esto podría ser superado por un puerto de una de las mejores respuestas, pero se me ocurrió en el chat, y no puedo no publicar después del empuje dijo algo al respecto :)
fuente
C, 76 bytes
Funciona para todos los casos de prueba (por mucho que no quiera incluir la palabra sin firmar o el último caso de prueba) ...
fuente
Bash, 57 bytes
Paquetes: Core Utilibilidades, grep, sed, vim (para
xxd
)Suponga que el número se da en formato binario. Cualquier longitud es aceptable :)
fuente
Perl 5 , 31 + 1 (
p
) = 32 bytesPruébalo en línea!
Usando el método de @ Dennis.
fuente
Tcl , 119 bytes
Pruébalo en línea!
Todavía no me gusta mucho para mi gusto
fuente