Reverso y cuadrado

19

En este desafío, calcularás números a partir de una secuencia curiosa.

Su entrada es un número entero decimal no negativo. Invierta los bits en este entero y luego cuadre el número para obtener la salida requerida.

Al invertir los bits, no debe usar ningún cero a la izquierda en la entrada. Por ejemplo:

26 (base 10) = 11010 (base 2) -> 01011 (base 2) = 11 -> 11*11 = 121

Las primeras 25 entradas / salidas de esta secuencia:

0: 0
1: 1
2: 1
3: 9
4: 1
5: 25
6: 9
7: 49
8: 1
9: 81
10: 25
11: 169
12: 9
13: 121
14: 49
15: 225
16: 1
17: 289
18: 81
19: 625
20: 25
21: 441
22: 169
23: 841
24: 9

Su solución debería funcionar para enteros de tamaño arbitrario. Si su idioma no tiene un método incorporado conveniente para usarlos, implemente su respuesta como si lo tuviera. Luego se le excusa si su respuesta se rompe para grandes números. Sin embargo, no use trucos / límites que solo funcionen para un dominio limitado (como una tabla de búsqueda).


Su puntaje es el número de bytes del código fuente.

-50% de bonificación si nunca convierte el número a / desde binario. Esto no se limita a las funciones integradas, si realiza un bucle sobre el número bit a bit (ya sea cambiando o enmascarando o cualquier otro método), también contará como conversión. No sé si esto es realmente posible, pero da un incentivo para detectar un patrón en la secuencia.

El puntaje más pequeño gana.

orlp
fuente
66
Tan cerca
Conor O'Brien
1
Si el código llama a un método que resulta en una cadena de caracteres que representa los bits, ¿es elegible para la bonificación?
Brad Gilbert b2gills
2
@ BradGilbertb2gills No.
orlp
¿Supongo que usar las matemáticas para extraer los bits también cuenta como conversión binaria?
lirtosiast
2
Relevante y relevante
Mego

Respuestas:

5

Par 5 bytes

✶Σ⌐Σ²

Eso es read-binary-reverse-binary-square.

Lynn
fuente
Cuento 12
Conor O'Brien el
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ese contador de bytes asume UTF-8. Creo que Mauris está utilizando una codificación que no es UTF-8 para contar sus bytes, pero no especificó esta codificación.
orlp
Par usa su propia codificación extraña. Su representación canónica es un cierto subconjunto de <256 caracteres Unicode. No estoy seguro si tiene un nombre; Debería esperar a que @Ypnypn intervenga.
Lynn
Oh ya veo. @orlp
Conor O'Brien
Posiblemente tiene su propio SBCS?
HyperNeutrino 01 de
19

Mathematica, 42 21 bytes

Gracias a alephalpha por reducir a la mitad el puntaje.

#~IntegerReverse~2^2&

La razón real por la que hice esto en Mathematica fue porque quería ver una trama ... seguro que se ve divertido:

ingrese la descripción de la imagen aquí

Martin Ender
fuente
11
Pero me gusta la puntuación! XD
Conor O'Brien
1
¿Por qué esta respuesta tiene más votos que la respuesta con menos bytes? o_O
Seadrus
27
@ Seadrus Ya sabes lo que dicen. Una imagen vale 7 bytes.
Martin Ender
55
entonces su puntaje es 42 + 7 = 49 bytes: P
Seadrus
3
Lo siento, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender
8

Minkolang 0.14 , 43 bytes

Gracias a Mego por inspirar esto.

n1{d1`,2$3*&$z2zd2%-2l$Md1%-;z2%*z2:{+}2;N.

Pruebe el código aquí y verifique todos los casos de prueba aquí .

Explicación

Esto usa esta relación de recurrencia:

a(0) = 0
a(1) = 1
a(2n) = a(n)
a(2n+1) = a(n) + 2^(floor(log_2(n))+1)

Si nes la entrada, entonces a(n)es el número resultante después de que se haya invertido su secuencia binaria. 0 y 1 son obvios. Para a(2n) = a(n), considere que x0(donde xestá cualquier secuencia de dígitos binarios) invertido es 0x, que es lo mismo que x. Porque a(2n+1)el razonamiento es un poco más complicado. x1volteado es 1x, que es igual a x + 2^kpara algunos k. Este kes uno más que el número de dígitos x, que es floor(log_2(n))+1. La fórmula completa sigue, excepto que se modificó un poco. Esto es lo que realmente codifico:

a(0) = 0
a(1) = 1
a(n) = a(n//2) + (n%2) * 2^(floor(log_2(n - n%2)))

Como Mego y yo trabajamos en el chat, floor(n/2) = (n - n%2)/2. Por lo tanto, log_2(floor(n/2))+1 = log_2(n - n%2). Además, multiplicar por (n%2)colapsa las partes pares e impares en una sola expresión.

Finalmente, sin más preámbulos, aquí está el código, explicado.

n                                              Take number from input
 1{                                            Start recursion that takes only one element
   d1`,                                        1 if top of stack 0 or 1, 0 otherwise
       2$3*                                    26
           &                                   Jump if top of stack is not zero
            $z                                 Store top of stack in register (z)

               zd2%-                           n - n%2
                    2l$M                       log_2(n - n%2)
                        d1%-                   floor(log_2(n - n%2))
              2             ;                  2^floor(log_2(n - n%2))
                             z2%               n%2
                                *              Multiply
                                 z2:           n//2
                                    {          Recurse
                                     +         Add
                                      }        Return
                                       2;N.    Square it, output as number, and stop.
El'endia Starman
fuente
1
Creo que la recurrencia es solo una reformulación de iterar sobre los bits individuales.
Martin Ender
3
Me temo que esto no cuenta. Cada vez que vea 2ny 2n+1en una relación de recurrencia, debe pensar de inmediato como un bucle sobre bits.
orlp
1
@orlp: Bueno, eso es un fastidio. Ahora estoy un poco convencido de que tu bono es imposible.
El'endia Starman
@ El'endiaStarman Casi lo tengo, creo.
Conor O'Brien
8

Japt , 29 28 11 7 bytes

(Puede guardar el programa como un archivo con codificación IEC_8859-1 de 7 bytes y luego subirlo al intérprete ).

Japt es JavaScript acortado hecho por ETHproductions .

¢w n2 ²

Pruébalo en línea!

Explicación:

  1. ¢es acceso directo a Us2, que compila a U.s(2). Ues input (implícito), .s(2)llamado por un número, invoca .toString(2)(se convierte en binario, analiza como cadena).

  2. wcompila a .w(), que invierte la cadena ( .split('').reverse().join('')).

  3. n2funciona como parseInt(<number>,2), es decir, convierte binario a decimal.

  4. ²invoca Math.pow(<number>,2), es decir, cuadra el número.

nicael
fuente
1
Hay una función de cadena para numerar n, por lo que podría hacerlo Us2 a w a n2 p2. Buen trabajo sin embargo!
ETHproductions
1
Además, wfunciona igual en las cadenas que en las matrices, por lo que no necesita las dos as :)
ETHproductions
1
Una última cosa: Us2 = ¢, y p2= ², reduciéndolo a 7 bytes:¢w n2 ²
ETHproductions
3
El intérprete en línea ahora acepta archivos codificados IEC_8859-1. (Aunque no estoy seguro de cómo hacer UTF-8 y UTF-16 también ...)
ETHproductions
2
@ETHproductions - ahora puedo hacer +1 en esto :)
Digital Trauma
5

Python, 32 bytes

lambda x:int(bin(x)[:1:-1],2)**2

Pruébalo en línea.

El código es bastante sencillo: bin(6)por ejemplo, da 0b110, la representación binaria de 6. [:1:-1]invierte la cadena y la elimina 0b. intconvierte la cadena a un entero desde binario y la **2cuadra.

NinjaOsoMono
fuente
5

Jolf , 7 bytes

Solo ejecútalo. La entrada en la página no funciona.

^C_Bj22

Explicación

^C_Bj22
    j   numeric input
   B    convert to binary (str)
  _     reverse
 C   2  parse as binary integer to base 10
^     2 square
        implicit output

Agregué el Qcomando, que hace que estos 6 bytes:QC_Bj2

Conor O'Brien
fuente
44
Tachado 7 todavía parece un 7.
un spaghetto
2
@quartata No es tan malo como un tachado 4.
orlp
4

En serio , 8 7 bytes

2;,¡R¿ª

Desafíos como estos son perfectos para En serio :)

Pruébalo en línea

Explicación:

2;,¡    get a string representing the (decimal) input in binary, with a 2 on the bottom of the stack
R      reverse the string
¿    convert binary string to decimal int (using that extra 2 from earlier)
ª      square it
Mego
fuente
Buen trabajo a juego con Jolf!
Conor O'Brien
+1 por hacer que su intérprete acepte la codificación CP437 (o al menos la representación hexadecimal)
Trauma digital
4

J, 10 9 bytes

2^~|.&.#:

Este es un verbo tácito y monádico. Pruébalo en línea!

¡Gracias a @randomra por jugar golf en 1 byte!

Cómo funciona

2^~|.&.#:  Right argument: y

       #:  Convert y to binary.
   |.      Reverse the digits.
     &.    Dual; apply the inverse of #:, i.e., convert back to integer.
 ^~        Apply power (^) with reversed argument order (~)...
2          to 2 and the previous result.
Dennis
fuente
El enlace no funciona, aparece un error 404 en una página de Google que dice "La URL solicitada /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html no se encontró en este servidor. Eso es todo lo que sabemos".
Bijan
2

JavaScript, 64 63 56 53 bytes

n=>parseInt([...n.toString(2)].reverse().join``,2)**2

Me doy cuenta de que soy extra largo, pero bueno, puedo hacerlo: P

Manifestación

nicael
fuente
en lugar de lo parseInt(que puedes hacer+("0b"+
Downgoat
@Downgoat hm, no parece dar resultados correctos.
nicael
[...n.toString(2)]y.join``
Conor O'Brien el
1
Incluso más corta w / ES7 (49 bytes): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Todavía no funciona en ningún navegador
Downgoat
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Gracias, esto ahorra algunos bytes.
nicael
2

Perl 6 , 21 bytes

{:2(.base(2).flip)²}

Ejemplo de uso:

say {:2(.base(2).flip)²}(26); # 121

say (0..24).map: {:2(.base(2).flip)²};
# (0 1 1 9 1 25 9 49 1 81 25 169 9 121 49 225 1 289 81 625 25 441 169 841 9)

my &code = {:2(.base(2).flip)²};
say code 3; # 9

say chars code 10¹⁰⁰; # 140
Brad Gilbert b2gills
fuente
2

PHP, 45 bytes

echo pow(bindec(strrev(decbin($argv[1]))),2);
indefinido
fuente
2

Shell, 25

dc -e2o?p|rev|dc -e2i?d*p

Entrada / salida a través de STDIN / STDOUT:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 
Trauma digital
fuente
1

Pyth - 9 bytes

Conversiones directas. De hecho, asigné 2 a una var, que es bastante raro.

^i_jQK2KK

Test Suite .

Maltysen
fuente
1

Pyth, 9 bytes

^i_.BQ2 2

Esta es una respuesta muy simple basada en Pyth similar a la de Python

TanMath
fuente
1

𝔼𝕊𝕄𝕚𝕟, 12 caracteres / 21 bytes

⦅`ᶀ`+ᴙ(ïß2)²

Try it here (Firefox only).

Respuesta no competitiva, 9 caracteres / 18 bytes

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).

Mama Fun Roll
fuente
1
A través de este contador de bytes, da 15 bytes (usa otra codificación).
nicael
Califico usando UTF-8 (hasta que pueda lograr que la codificación de Minas funcione)
Mama Fun Roll
El ... nombre del idioma ... es cajas?
corsiKa
Es ESMin en doble cara. Los caracteres Unicode no son totalmente compatibles.
Mama Fun Roll
1

Ruby, 35 bytes

->(x){x.to_s(2).reverse.to_i(2)**2}
Harup Gupta
fuente
1

TI-Basic (TI-84 Plus CE), 42 bytes

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
pizzapants184
fuente