Reverso e quadrado

19

Neste desafio, você calculará números de uma sequência curiosa.

Sua entrada é um número inteiro decimal não negativo único. Inverta os bits nesse número inteiro e, em seguida, quadrado o número para obter a saída necessária.

Ao reverter os bits, você não deve usar nenhum zeros à esquerda na entrada. Por exemplo:

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

As primeiras 25 entradas / saídas desta sequência:

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

Sua solução deve funcionar para números inteiros de tamanho arbitrário. Se o seu idioma não possui um método interno conveniente para usá-los, implemente sua resposta como se tivesse. Você será dispensado se sua resposta quebrar para números grandes. No entanto, não use truques / limites que funcionem apenas para um domínio limitado (como uma tabela de pesquisa).


Sua pontuação é o número de bytes do código fonte.

Bônus de -50% se você nunca converter o número de / para o binário. Isso não se limita aos componentes internos; se você percorrer o número pouco a pouco (alternando ou mascarando ou qualquer outro método), ele também contará como conversão. Não sei se isso é realmente possível, mas incentiva a identificação de um padrão na sequência.

Menor pontuação ganha.

orlp
fonte
6
Tão perto
Conor O'Brien
11
Se o código chama um método que resulta em uma sequência de caracteres que representa os bits, isso é elegível para o bônus?
Brad Gilbert b2gills
2
@ BradGilbertb2gills No.
orlp
Presumo que o uso da matemática para extrair os bits também conta como conversão binária?
lirtosiast
2
Relevante e relevante
Mego 29/11

Respostas:

5

Par , 5 bytes

✶Σ⌐Σ²

Isso é quadrado binário-reverso-binário.

Lynn
fonte
Eu conto 12
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Esse contador de bytes assume UTF-8. Acredito que Mauris está usando alguma codificação que não é UTF-8 para contar seus bytes, mas ele não especificou essa codificação.
orlp 4/12/15
Par usa sua própria codificação estranha. Sua representação canônica é um determinado subconjunto de <256 caracteres Unicode. Não tenho certeza se ele tem um nome; Eu deveria esperar @Ypnypn entrar na conversa.
Lynn
Ah eu vejo. @orlp
Conor O'Brien
Possivelmente tem seu próprio SBCS?
HyperNeutrino 01/04
19

Mathematica, 42 21 bytes

Agradecimentos a alephalpha por reduzir pela metade a pontuação.

#~IntegerReverse~2^2&

A verdadeira razão pela qual fiz isso no Mathematica foi porque eu queria ver uma trama ... com certeza parece engraçado:

insira a descrição da imagem aqui

Martin Ender
fonte
11
Mas eu gosto do placar! XD
Conor O'Brien
11
por que esta resposta tem mais votos do que a resposta com menos bytes? o_O
Seadrus 29/11
27
@Seadrus Você sabe o que eles dizem. Uma imagem vale 7 bytes.
Martin Ender
5
então sua pontuação é 42 + 7 = 49 bytes: P
Seadrus 29/11
3
Desculpe, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender
8

Minkolang 0.14 , 43 bytes

Agradecemos a Mego por inspirar isso.

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

Teste o código aqui e verifique todos os casos de teste aqui .

Explicação

Isso usa essa relação de recorrência:

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

Se nfor a entrada, a(n)será o número resultante após a sequência binária ter sido invertida. 0 e 1 são óbvios. Para a(2n) = a(n), considere que x0(onde xestá qualquer sequência de dígitos binários) é invertido 0x, que é o mesmo que x. Pois a(2n+1), o raciocínio é um pouco mais complicado. x1invertido é 1x, o que é igual x + 2^kpara alguns k. Este ké um a mais que o número de dígitos x, que é floor(log_2(n))+1. A fórmula completa segue, exceto que foi modificada um pouco. Isto é o que eu realmente código:

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

Enquanto Mego e eu trabalhamos no chat floor(n/2) = (n - n%2)/2,. Assim log_2(floor(n/2))+1 = log_2(n - n%2),. Além disso, a multiplicação por (n%2)reduz as partes ímpares e pares em uma expressão.

Finalmente, sem mais delongas, aqui está o 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
fonte
11
Eu acho que a recorrência é apenas uma reformulação da iteração sobre os bits individuais.
Martin Ender
3
Receio que isso não conte. Sempre que vir 2ne 2n+1em uma relação de recorrência, você deve pensar imediatamente nela como loop sobre bits.
orlp
11
@orlp: Bem, isso é uma chatice. Estou meio convencido agora que seu bônus é impossível.
El'endia Starman 30/11/2015
@ El'endiaStarman Eu quase consegui, eu acho.
Conor O'Brien
8

Japt , 29 28 11 7 bytes

(Você pode salvar o programa como um arquivo codificado em IEC_8859-1 com 7 bytes e carregá-lo no intérprete .)

Japt é um JavaScript abreviado da ETHproductions .

¢w n2 ²

Experimente online!

Explicação:

  1. ¢é um atalho para Us2, que é compilado para U.s(2). Ué input (implícito), .s(2)chamado por um número, invoca .toString(2)(converte em binário, analisa como string).

  2. wcompila para .w(), que reverte a string ( .split('').reverse().join('')).

  3. n2funciona como parseInt(<number>,2), ou seja, converte binário em decimal.

  4. ²invoca Math.pow(<number>,2), ou seja, esquadrinha o número.

nicael
fonte
11
Há uma função de string paraNumerar n, para que você possa fazer Us2 a w a n2 p2. Bom trabalho!
ETHproductions
11
Além disso, wfunciona da mesma maneira em cadeias de caracteres e em matrizes, para que você não precise dos dois as :) #
224 ETHproductions
11
Uma última coisa: Us2 = ¢e p2= ², diminuindo para 7 bytes:¢w n2 ²
ETHproductions
3
O intérprete online agora aceita arquivos codificados IEC_8859-1. (Embora eu não tenho certeza de como fazê-UTF-8 e UTF-16, bem como ...)
ETHproductions
2
@ETHproductions - agora eu posso marcar com +1 isso :)
Digital Trauma
5

Python, 32 bytes

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

Experimente online.

O código é bem direto: bin(6)por exemplo, fornece 0b110a representação binária de 6. [:1:-1]inverte a string e remove 0b. intconverte a string em um número inteiro de binário e a **2coloca ao quadrado.

NinjaBearMonkey
fonte
5

Jolf , 7 bytes

Apenas corra. A entrada na página não funciona.

^C_Bj22

Explicação

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

Eu adicionei o Qcomando, que faz isso 6 bytes:QC_Bj2

Conor O'Brien
fonte
4
Riscado 7 ainda parece um 7.
um spaghetto
2
@quartata Não é tão ruim quanto um riscado 4.
orlp
4

Sério , 8 7 bytes

2;,¡R¿ª

Desafios como esses são perfeitos para a sério :)

Experimente online

Explicação:

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
fonte
Bom trabalho combinando Jolf!
Conor O'Brien
+1 para que seu intérprete aceite a codificação CP437 (ou pelo menos a representação hexadecimal da mesma)
Digital Trauma
4

J, 10 9 bytes

2^~|.&.#:

Este é um verbo tácito e monádico. Experimente online!

Graças a @randomra por jogar fora um byte!

Como 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
fonte
O link não funciona, recebo um erro 404 em uma página do google que diz "O URL solicitado /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html não foi encontrado neste servidor. Isso é tudo o que sabemos".
Bijan
2

CJam, 10 bytes

ri2bW%2b_*

Experimente online

Reto Koradi
fonte
2

JavaScript, 64 63 56 53 bytes

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

Eu percebo que sou muito longa, mas ei, eu posso fazer isso: P

Demo

nicael
fonte
em vez de parseInt(você pode fazer+("0b"+
Downgoat
@Downgoat hm, não parece dar resultados corretos.
Nicael
[...n.toString(2)]e.join``
Conor O'Brien
11
Mesmo mais curto w / ES7 (49 bytes): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Não funciona em qualquer navegador ainda
Downgoat
11
@ CᴏɴᴏʀO'Bʀɪᴇɴ Obrigado, isto economiza alguns bytes.
Nicael 29/11/15
2

Perl 6 , 21 bytes

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

Exemplo 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
fonte
2

PHP, 45 bytes

echo pow(bindec(strrev(decbin($argv[1]))),2);
Indefinido
fonte
2

Shell, 25

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

Entrada / saída via STDIN / STDOUT:

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

Pitão - 9 bytes

Conversões diretas. Na verdade, eu atribuí 2 a um var, o que é bem estranho.

^i_jQK2KK

Conjunto de Teste .

Maltysen
fonte
1

Pitão, 9 bytes

^i_.BQ2 2

Esta é uma resposta baseada em pyth muito simples, semelhante à Python

TanMath
fonte
1

, 12 caracteres / 21 bytes

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

Try it here (Firefox only).

Resposta não competitiva, 9 caracteres / 18 bytes

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).

Mama Fun Roll
fonte
11
Através deste contador de bytes, fornece 15 bytes (usa outra codificação).
Nicael
Classifico usando UTF-8 (até conseguir que a codificação Mines funcione).
Mama Fun Roll
O ... nome do idioma ... são caixas?
corsiKa
É ESMin em duplo golpe. Os caracteres Unicode não são totalmente suportados.
Mama Fun Roll
1

Ruby, 35 bytes

->(x){x.to_s(2).reverse.to_i(2)**2}
Harsh Gupta
fonte
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
fonte