Descripción de la tarea
Dado un número entero, intercambie sus bits menos significativos (2k – 1) -th y 2k -th para todos los enteros k> 0 . Esta es la secuencia A057300 en el OEIS.
(Se supone que el número tiene "ceros infinitos infinitos". En la práctica, esto simplemente significa anteponer un solo 0 bit a números de longitud impar).
Este es el código de golf , por lo que gana el código más corto (en bytes).
Casos de prueba
0 -> 0
1 -> 2
9 -> 6
85 -> 170
220 -> 236
1827 -> 2835
47525 -> 30298
unsigned char array_of_bytes[1024]
trabajar de la manera que espera (es decir, ser un campo de bits con 1024 *CHAR_BIT
entradas). SinCHAR_BIT
embargo, me imagino que la mayoría de las respuestas que admiten entradas de longitud arbitraria suponen que es pareja, ya que el desplazamiento de bits entre bytes es engorroso. Por lo tanto, podría poner un requisito para admitirk
hasta un tamaño constante, como 256 o algo que sea razonable para AES, y los idiomas sin tipos enteros de 256 bits tendrían que usar bucles. Eso podría hacer que valga la pena considerar los vectores SIMD para una respuesta asm x86: PRespuestas:
Jalea ,
1097 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Python 2, 26 bytes
¡Trucos de bits!
Say
n
tiene forma...ghfedcba
en binario. Entonces, podemos dividirlo en partes iguales comoEntonces, el resultado de cambio de bit
s
se puede expresar comos=2*o+e
.Preferimos calcular solo uno de
e
yo
, así que expresamoso=n-2*e
y sustituimosEntonces, ahora queda por expresar
e
en términos den
. El númeroM=4**n/3
tiene forma...10101010101
en binario, que sirve como una máscara para los dígitos impares. El exponenten
asegura queM
es lo suficientemente largo. Tomando el bit a bitand
den/2
y este valor dae
como se desea.En cambio, podemos expresar
e
en términos deo
e=(n-o)/2
, que das=(n+o*3)/2
, que ahorra un byte gracias a una optimización de xsot.fuente
n
. Sin embargo, prefiero la convención de nomenclatura "impar" frente a "par". El LSB es el bit 0, que es par (aunque sea el primer bit). En la programación SIMD, donde los shuffles a menudo seleccionan elementos con un índice, los índices cuentan desde 0, por lo que es normal considerar el elemento bajo como un elemento par. por ejemplo[ 3 2 1 0 ]
lambda n:n+(n&4**n/3)*3>>1
f(x){return x+((x&~0U/3)*3)>>1;}
devuelve 1 para la entrada 2 .calc
(también conocido como apcalc), no en realidad C. Pensé que estaría bien ya que no necesitaba truncar a 32 bits, o el complemento de dos. No creía que la expresión se viera bien, así que estaba dispuesto a creer mis pruebas equivocadas. Pero de todos modos, necesito una mejor REPL para desarrollar bithacks. ¿Alguna sugerencia? (idealmente línea de comandos de Linux, comobc -l
ocalc
, pero en realidad exponiendoint32_t
/uint32_t
o algo, no precisión extendida.)Función C, 38
Bit-twiddling:
Ideona
O por diversión:
C función recursiva, 43
Según la fórmula OEIS ,
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
o
Ideona
fuente
CJam,
161413 bytesPruébalo aquí.
Explicación
fuente
Pyth, 9 bytes
Pruébalo en el compilador Pyth .
Cómo funciona
fuente
JavaScript (ES6),
3230 bytesSolo funciona hasta 1073741823 debido a las limitaciones de los enteros de JavaScript.
3836 bytes funciona hasta 4294967295:Editar: Guardado 2 bytes gracias a @ user81655.
51 bytes funciona hasta 4503599627370495:
fuente
n<<1
sern*2
?n/2
! No sé por qué no pensé en eso antes.>>>
... ¿qué es eso?>>>
pero hace un cambio sin firmar.>>>0
básicamente se convierte en un entero sin signo de 32 bits.Función ASM x86: 14 bytes de código de máquina
Versión uint64_t: 24 bytes
x86-64 Convención de llamada SysV (
x
inedi
), pero este mismo código de máquina también funcionará en modo de 32 bits. (Dondelea
se decodificará comolea eax, [edi + eax*2]
, lo que da resultados idénticos ).0x4f - 0x40
= 14 bytesEste es el resultado del compilador al usar la excelente idea de máscara única de xnor de la manera opuesta. (Y terminología opuesta: el bit bajo es el bit 0, que es par, no impar).
No encontré ninguna mejora sobre lo que hace el compilador. Podría haberlo escrito como
mov eax, 0x555...
/and eax, edi
, pero esa es la misma longitud.La misma función para los enteros de 64 bits toma 24 bytes (vea el enlace godbolt). No veo ninguna forma más corta que 10 bytes
movabs rax, 0x55...
para generar la máscara en un registro. (Ladiv
instrucción de x86 es torpe, por lo que la división sin signo de todos por 3 no ayuda).Se me ocurrió un bucle para generar la máscara en rax, pero son 10 bytes (exactamente la misma longitud que el
mov imm64
).Si supiéramos que ninguno de los bytes existentes
rax
tiene un conjunto de bits bajo, podríamos omitir elxor
, y esto sería de 8 bytes de longitud.Una versión anterior de esta respuesta tenía un bucle de 10 bytes usando el
loop
insn, pero tenía el peor tiempo de ejecución de0xFFFFFFFFFFFFFF08
iteraciones, porque solo configurécl
.fuente
Oasis , 17 bytes (no competitivos)
Pruébalo en línea!
Oasis es un lenguaje diseñado por Adnan especializado en secuencias.
Actualmente, este lenguaje puede hacer recursividad y forma cerrada.
Usamos esta fórmula:
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
Especificar el caso base es simple:
3120
al final simplemente significa esoa(0)=0, a(1)=2, a(2)=1, a(3)=3
.fuente
MATL , 10 bytes
Pruébalo en línea!
Versión modificada para generar los primeros términos de la secuencia ( OEIS A057300 ).
Explicación
fuente
zsh, 28 bytes
Toma la entrada como un argumento de línea de comando, sale en STDOUT.
No es compatible con Bash porque usa la sintaxis de conversión de base específica de zsh.
fuente
Retina, 70 bytes
Banco de pruebas. (Ligeramente modificado.)
Bueno, solo por diversión: 7 bytes
Toma base-4 como entrada y salidas como base-4.
Pruébalo en línea!
fuente
05AB1E, 8 bytes
¡Gracias a @Adnan por -5 bytes!
Utiliza la codificación CP-1252.
¡Pruébelo en línea!
Explicación:
fuente
1 2‚2 1‚
con12Â
de 8 bytes.4в2‰íJJC
C,
323029 bytesAlgoritmo copiado del comentario de xsot sobre la respuesta de Python de xnor . En lugar de enmascarar en ambos sentidos, enmascarar en un sentido y combinar.
Esto se compila al mismo asm que la última versión que probé , y funciona (para x hasta
0x3FFFFFFF
y para x por encima de eso, siempre que el bit 30 no esté configurado, ver más abajo). En el código de máquina, tiene la misma longitud que mi respuesta asm existente.La versión anterior siempre borra la parte alta del resultado . La mejor versión segura es de 32 bytes:
La versión de Python no tiene este problema, porque python usa tipos enteros de precisión arbitraria cuando es necesario , en lugar de truncar a un límite superior fijo.
fuente
>>
tenía tan poca precedencia. No juego con la frecuencia suficiente para recordar exactamente cuáles son las reglas, ya que las advertencias del compilador que sugieren que los padres en casos peligrosos me salvan en código real. : PJavascript (ES6),
113109bytesGuardado 4 bytes gracias a Upgoat
Cómo funciona
fuente
+('0b"+binary_string_here)
lugar de `parseInt (..., 2)J, 20 bytes
Uso
Donde
>>
es STDIN y<<
es STDOUT.Sin golf
Tres tenedores
Nota al margen
En el intérprete oficial,
^:_1
puede ser reemplazado porinv
, guardando 1 byte.Sin embargo, ninguno de los intérpretes en línea implementa esto.
fuente
C #, 44 bytes
Basado en la implementación de C
int f(int n)=>n>3?4*f(n/4)+f(n%4):n%2*2+n/2;
Pruébelo aquí: C # pad
fuente
INTERCAL , 60 bytes
Pruébalo en línea!
Funciona para enteros de 16 bits, con E / S realizada en el formato más natural para INTERCAL: la entrada es una serie de dígitos decimales enunciados en uno de varios idiomas naturales o construidos, y la salida está en "números romanos descifrados".
Este es uno de esos desafíos raros en los que los operadores binarios de INTERCAL pueden usarse de manera intuitiva, ya que de lo que se trata es de reposicionar bits. Select (
~
) toma los bits de su primer argumento correspondiente a unos en su segundo argumento y los rellena a la derecha con ceros, y mingle ($
) intercala los bits de sus argumentos de modo que los bits del primer argumento sean más significativos. Entonces, la solución directa es seleccionar los bits alternos menos significativos (.1~#21845
), seleccionar los bits alternos más significativos (.1~#43690
), y los vuelve a unir en el orden opuesto. Afortunadamente para el recuento de bytes, aunque los operadores de INTERCAL no tienen una prioridad definida (ya que el objetivo del lenguaje es no tener precedentes), resulta que C-INTERCAL en TIO no requiere mucha agrupación para esta expresión en particular, ya que solo cuesta un byte desde'.
se pueden abreviar!
.Con soporte para enteros de 32 bits:
INTERCAL , 67 bytes
Pruébalo en línea!
INTERCAL no permite literales de 32 bits, lo que en realidad hace que esto sea un poco más fácil de leer, ya que significa que las constantes mágicas para seleccionar bits alternos deben construirse mezclando dos literales de 16 bits, donde uno es todos ceros y el otro todos unos (En realidad, incluso si hubiera literales de 32 bits, esto aún sería más corto.
#0$#65535
Está a dos bytes de distancia#1431655765
, y lo mismo ocurre con el otro.) Esto comunica todo el proceso de forma poco natural para INTERCAL.Un enfoque alternativo con el uso torpe de la sobrecarga de operandos :
INTERCAL , 71 bytes
Pruébalo en línea!
Esto elimina la selección por completo declarando que
:1
se.2
mezcla con.3
, configurando:1
la entrada y luego emitiendo.3
con.2
. Como:1
se sobrecargó como.2$.3
,DO :1 <- :2
asigna valores a.2
y de.3
tal forma que:1
adquiere el valor de:2
, lo que da como resultado que.2
contenga los bits alternos más significativos:2
y.3
los bits alternos menos significativos. Esta sería la más corta de las dos soluciones de 32 bits en cuatro bytes siPLEASE WRITE IN :1
pudiera reemplazarsePLEASE WRITE IN :2 DO :1 <- :2
por sobrecargada:1
, peroCALCULATING
Resulta necesario para utilizar la sobrecarga. También siento que podría haber una forma más corta de llevar a cabo la sobrecarga en sí que comenzar el programaDO:1<-:1/.2$.3
, pero como esto es INTERCAL, también siento que no puede haberlo.fuente
Mathematica, 44 bytes
El mismo enfoque que mi respuesta CJam: convertir a base-4, intercambiar 1s y 2s, convertir de nuevo. También utiliza el truco de alephalpha para reemplazar
FromDigits
con unaFold
operación para guardar un byte.fuente
En realidad, 16 bytes
Pruébalo en línea!
Explicación:
fuente
J, 22 bytes
Enfoque alternativo basado en la manipulación de la matriz en lugar del truco base 4.
Uso
Explicación
fuente
REXX, 88 bytes
fuente