Introducción
Este desafío requiere que establezca los ceros finales de una representación binaria entera 010101…, esto se explica mejor con un ejemplo:
Dado el entero 400, el primer paso es convertirlo a binario:
110010000
Como podemos ver, el quinto bit es el bit menos significativo 1, por lo que a partir de ahí reemplazamos los ceros inferiores por 0101:
110010101
Finalmente convertimos eso a decimal: 405
Desafío
Dado un retorno / salida entero positivo, el valor resultante correspondiente del proceso definido anteriormente.
Reglas
- Esta secuencia solo se define para enteros con al menos un
1bit, por lo que la entrada siempre será ≥ 1 - En su lugar, puede tomar la entrada como una cadena, lista de dígitos (decimal)
- No tiene que manejar entradas inválidas
Casos de prueba
Aquí hay más casos de prueba con los pasos intermedios (no es necesario imprimirlos / devolverlos):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298

nes la potencia máxima de 2 que divide la entrada, entonces la respuesta es simplemente(input) + ceil((2^n - 2)/3)Respuestas:
Python 3 , 20 bytes
Pruébalo en línea!
Explicación
Toma
192como ejemplo. Su forma binaria es11000000, y necesitamos convertirla a11010101.Notamos que necesitamos agregar
10101al número. Esta es una serie geométrica (4^0 + 4^1 + 4^2), que tiene una forma cerrada como(4^3-1)/(4-1). Esto es lo mismo que4^3//3donde//denota división entera.Si lo fuera
101010, entonces todavía sería una serie geométrica (2×4^0 + 2×4^1 + 2×4^2), que es2×4^3//3por las razones anteriores.De todos modos,
4^3y2×4^3sería el bit menos significativo, que obtenemos porn&-n:Notamos que el complemento de
nes00111111. Si agregamos uno, se convierte01000000, y solo se superpone conn=11000000el dígito menos significativo. Tenga en cuenta que "complementar y agregar uno" es solo una negación.fuente
lambda n:(n&-n)//3+nfunciona también? Pasa todos los casos de prueba de muestra , pero según mi intuición no debería ser válido, ¿verdad?Jalea , 5 bytes
Pruébalo en línea!
Esta vez, un enfoque de puerto de Leaky Nun (al menos lo ayudé a jugar golf un poco: P)
Jalea , 7 bytes
Pruébalo en línea!
Utiliza el fantástico enfoque de JungHwan Min , con la ayuda indirecta de Martin Ender .
fuente
&N:3|. Felicidades; venciste a Dennis en gelatina! (Pero no del todo fuera de juego.)Wolfram Language (Mathematica) ,
36282624 bytes-8 bytes gracias a @MartinEnder y -2 bytes gracias a @ Mr.Xcoder
Pruébalo en línea!
Solo necesitamos encontrar el número de ceros finales en la entrada, y encontrar el número alternando
0s y1s con una longitud menor que eso, y agregarlo a la entrada.Entonces,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405La fórmula explícita para
nésimo número con alterna1s y0s se dio en A000975 en OEIS. Podemos usar elnnúmero th ya que no hay dos números diferentes que puedan tener la misma longitud en binario y tengan dígitos alternos.fuente
2^#~IntegerExponent~2es(BitXor[#,#-1]+1)/2#+⌊(#~BitAnd~-#)/3⌋&en su lugar.J ,
1918 bytesPruébalo en línea!
Explicacion rapida
Esta es una respuesta antigua, pero es muy similar en naturaleza a la actual, solo cuenta los ceros finales de manera diferente. Vea los comentarios para un enlace que explica cómo funciona.
Otras respuestas:
Respuesta anterior (19 bytes).
Más largo de lo que debería ser porque
\va de derecha a izquierda.fuente
+(2|-.i.@#.-.)&.#:#.~cuenta el número de verdades finales , así que lo que necesitamos es#.~ -. #:contar el número de ceros finalesJulia 0.6 , 12 bytes
Pruébalo en línea!
fuente
((!n=(n|n))&-n)/3, o!n=(((n|n)&(-n))/3), etc.|es como+y&es como*. Por lo tanto,n|n&-n÷3se analiza comon | ((n&-n) ÷3).JavaScript (ES6),
4039 bytesToma la entrada como un entero de 32 bits.
Casos de prueba
Mostrar fragmento de código
fuente
05AB1E ,
1385 bytesAhorré 5 bytes gracias a la fórmula ordenada del Sr. Xcoder y JungHwan Min. Ahorré
otros 3 gracias al Sr. Xcoder
Pruébalo en línea!
Explicación
fuente
(<bitwise and here>3÷+debería funcionar para ~ 5 bytes.R ,
7158 bytesgracias a NofP por -6 bytes
Pruébalo en línea!
Asume que la entrada es un entero de 32 bits. R solo tiene enteros de 32 bits firmados (conversión a
doublecuando un entero se desborda) de todos modos y no hay entradas de 64 bits o sin signo.fuente
which.max(n):1-1a!cumsum(n)para obtener una solución de 65 bytesbrainfuck , 120 bytes
¡Pruébelo en línea!
Comienza con el valor en la celda actual y termina en la celda con el valor de salida. Obviamente, no funcionará en números superiores a 255, ya que ese es el límite de la celda para un ataque mental típico, pero funcionará si asume un tamaño de celda infinito.
fuente
PowerShell , 168 bytes
Pruébalo en línea!
Ay. La conversión a / desde binario y el corte de matriz no son realmente los puntos fuertes de PowerShell.
Toma la entrada
$ncomo un número. Inmediatamenteconverteso a la base binaria2y lo almacenamos en$a. A continuación tenemos una construcción if / else. La cláusula if comprueba si aregexMatchcontra 1 o más0s al final de la cadena ('0+$') tieneindexuna ubicación mayor que0(es decir, el inicio de la cadena binaria). Si es así, tenemos algo con lo que trabajar,elsesolo mostramos el número.En el interior
if, cortamos losxprimeros dígitos y concatenamos+los que tienen los dígitos restantes. Sin embargo, para los dígitos restantes, se bucle a través de ellos y seleccionar una0o1a emitir en su lugar, utilizando$i++%2para elegir. Esto nos da el010101...patrón en lugar de0s al final. Luego-joinvolvemos a formar una cadena y la$cvolvemos a convertir en unaInt32base2.En cualquier situación, el número se deja en la tubería y la salida es implícita.
fuente
APL + WIN, 43 bytes
Solicita entrada de pantalla
fuente
PowerShell ,
4136 bytesPruébalo en línea! o Verificar todos los casos de prueba
Port of Leaky Nun's Python answer .
Guardado 5 bytes gracias a Leaky Nun
fuente
PHP , 47 bytes
Pruébalo en línea!
Realmente solo otro puerto de la solución de @Leaky Nun
fuente
Perl 5 , 54 bytes
Pruébalo en línea!
fuente
Python 3 , 56 bytes
Pruébalo en línea!
Todavía no estoy contento con esto, pero realmente no quería usar la fórmula ... -2 gracias a Rod . -1 gracias a Jonathan Frech .
fuente
eval(...)en lugar deint(...,2)podría guardar un byte.Rubí , 15 bytes
Otro puerto de aproximación de Leaky Nun.
Pruébalo en línea!
fuente
Óxido , 18 bytes
Un enfoque de puerto de Leaky Nun
Pruébalo en línea!
fuente
AWK , 24 bytes
Un puerto de respuesta Mathmatica de JungHwan Min
Pruébalo en línea!
fuente
JavaScript ES6, 13 bytes
fuente
C, 56 bytes
Pruébalo en línea!
C (gcc), 50 bytes
Pruébalo en línea!
5148 bytes usando la solución de Arnauld :¡Gracias a @ l4m2 por guardar tres bytes!
Pruébalo en línea!
43 con gcc:
Pruébalo en línea!
fuente
0xAAAAAAAA=>-1u/3*2Pari / GP , 19 bytes
Un puerto del acercamiento de Nun Leaky.
Pruébalo en línea!
fuente
Jalea , 13 bytes
Pruébalo en línea!
Explicación
Tome 24 como entrada de ejemplo.
fuente