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
1
bit, 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
n
es 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
192
como ejemplo. Su forma binaria es11000000
, y necesitamos convertirla a11010101
.Notamos que necesitamos agregar
10101
al 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//3
donde//
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//3
por las razones anteriores.De todos modos,
4^3
y2×4^3
sería el bit menos significativo, que obtenemos porn&-n
:Notamos que el complemento de
n
es00111111
. Si agregamos uno, se convierte01000000
, y solo se superpone conn=11000000
el dígito menos significativo. Tenga en cuenta que "complementar y agregar uno" es solo una negación.fuente
lambda n:(n&-n)//3+n
funciona 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
0
s y1
s con una longitud menor que eso, y agregarlo a la entrada.Entonces,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
La fórmula explícita para
n
ésimo número con alterna1
s y0
s se dio en A000975 en OEIS. Podemos usar eln
nú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~2
es(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÷3
se 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
double
cuando un entero se desborda) de todos modos y no hay entradas de 64 bits o sin signo.fuente
which.max(n):1-1
a!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
$n
como un número. Inmediatamenteconvert
eso a la base binaria2
y lo almacenamos en$a
. A continuación tenemos una construcción if / else. La cláusula if comprueba si aregex
Match
contra 1 o más0
s al final de la cadena ('0+$'
) tieneindex
una ubicación mayor que0
(es decir, el inicio de la cadena binaria). Si es así, tenemos algo con lo que trabajar,else
solo mostramos el número.En el interior
if
, cortamos losx
primeros 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 una0
o1
a emitir en su lugar, utilizando$i++%2
para elegir. Esto nos da el010101...
patrón en lugar de0
s al final. Luego-join
volvemos a formar una cadena y la$c
volvemos a convertir en unaInt32
base2
.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*2
Pari / 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