fundo
É bem conhecido na matemática que números inteiros podem ser colocados em uma correspondência individual com pares de números inteiros. Existem muitas maneiras possíveis de fazer isso e, neste desafio, você implementará uma delas e sua operação inversa.
A tarefa
Sua entrada é um número inteiro positivo n > 0
. Sabe-se que existem números inteiros não negativos únicos, a, b ≥ 0
tais que . Sua saída é a "versão invertida" do número inteiro positivo .n == 2a * (2*b + 1)
n
2b * (2*a + 1)
Você pode assumir que a entrada e a saída se encaixam no tipo de dados inteiro não assinado padrão do seu idioma.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
Elas são fornecidas no formato in <-> out
, já que a função a ser implementada é sua própria inversa: se você devolver a saída a ela, deverá obter a entrada original.
1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma. Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você deseja incluir vários números no seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
fonte
Respostas:
Geléia ,
171615 bytesExperimente online!
Como funciona
fonte
Pitão,
1615 bytes1 byte graças a Dennis
Suíte de teste
Explicação:
fonte
MATL , 22 bytes
Experimente online!
Explicação
fonte
Q
para1+
(isto foi introduzido recentemente) eq
para1-
. Isso também economiza um espaço (com o qual você pode economizar deH
qualquer maneira). Veja aquiPython 2, 39 bytes
n & -n
dá a maior potência de 2 que dividen
. Funciona porque na aritmética do complemento de dois-n == ~n + 1
,. Sen
tem k zeros à direita, tendo o seu complemento fará com que ele tem k queridos fuga. A adição de 1 mudará todos os valores finais para zeros e alterará o bit 2 ^ k de 0 para 1. Portanto,-n
termina com 1 seguido de k 0 (exatamente comon
), mantendo o bit oposton
em todos os lugares mais altos.fonte
n&-n
funciona? i ver o que este truque fazer, mas não como :(n&-n
retorna a potência mais alta de 2 que dividen
.n & -n
.n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100
, mas há dois caracteres por trás da melhor solução.n
.MATL , 25
26bytesIsso usa a versão atual (10.2.1) do idioma / compilador.
Experimente online!
Explicação
Bem simples, com base na força bruta. Tenta todas as combinações de a e b , seleciona a apropriada e faz o cálculo necessário.
fonte
Julia, 41 bytes
Esta é uma função anônima que aceita um número inteiro e retorna um número inteiro. Para chamá-lo, atribua-o a uma variável.
Definimos
a
como 1 + o expoente de 2 na fatoração primária den
. Comofactor
retorna aDict
, podemos usarget
com o valor padrão 0, caso a fatoração principal não contenha 2. Mudamos corretamente o bitn
dea
, e ter 2 a este poder. Nós multiplicamos isso por2a-1
para obter o resultado.fonte
Perl 5, 40 bytes
38 bytes mais 2 para
-p
-p
lê o STDIN na variável$_
.$i++,$_/=2until$_%2
incrementos$i
(que começa em 0) e diminui pela metade$_
até o$_
mod 2 diferente de zero. Depois disso,$_
é o fator ímpar do número original e$i
é o expoente de 2.$_=2*$i+1<<$_/2-.5
- O lado direito do=
é apenas a fórmula para o número procurado: {1 mais que o dobro do expoente de 2} vezes {2 à potência de {metade do fator ímpar menos menos a metade}}. Mas "times {2 to the power of ...}" é jogado como "pouco deslocado para a esquerda por ...". E esse lado direito está atribuído$_
.E
-p
imprime$_
.fonte
C, 49 bytes
fonte
JavaScript ES6,
3633 bytesMeu entendimento é que
Math.clz32
será mais curto do que brincartoString(2).length
.Editar: salvou 3 bytes graças a @ user81655.
fonte
n&-n
para uma variável:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
n&=-n
, mas eu precison
de novo ...PARI / GP , 38 bytes
Observe que
>>
e\
têm a mesma precedência e são computados da esquerda para a direita, para que a última parte possa sern>>k\2
melhor que(n>>k)\2
. A versão não-gasta tornariak
lexical commy
:fonte