拆分,翻转和重组整数


16

背景

在数学上众所周知,整数可以与成对的整数一一对应。这样做有许多可能的方式,而且这种挑战,您将实现其中一个它的逆运算。

任务

您的输入是一个正整数n > 0。已知存在唯一的非负整数,a, b ≥ 0例如。您的输出是正整数的“翻转版本” 。n == 2a * (2*b + 1)n2b * (2*a + 1)

您可以假定输入和输出适合您语言的标准无符号整数数据类型。

规则和计分

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

它们以格式给出in <-> out,因为要实现的功能是它自己的反函数:如果将输出反馈给它,则应该获得原始输入。

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

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。为了确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,可以将旧分数保留在标题中,方法是将它们打掉。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes



@feersum哦,我不知道。真是巧合
Zgarb

Answers:


11

果冻17 16 15 字节

BUi1µ2*³:2*×Ḥ’$

在线尝试!

怎么运行的

BUi1µ2*³:2*×Ḥ’$    Main link. Input: n

B                  Convert n to base 2.
 U                 Reverse the array of binary digits.
  i1               Get the first index (1-based) of 1.
                   This yields a + 1.
    µ              Begin a new, monadic chain. Argument: a + 1
     2*            Compute 2 ** (a+1).
       ³:          Divide n (input) by 2 ** (a+1).
                   : performs integer division, so this yields b.
         2*        Compute 2 ** b.
              $    Combine the two preceding atoms.
            Ḥ      Double; yield 2a + 2.
             ’     Decrement to yield 2a + 1.
           ×       Fork; multiply the results to the left and to the right.

等一下,您是否正在Jelly中实施运算符以适合该问题?在那种情况下,LOL
Alexander Torstling

我不是。发布此挑战后,对Jelly 的唯一承诺是对文档进行更新,并且此答案中使用的所有操作员都已实施了至少一个月。随时进行验证
丹尼斯

不用担心,我对规则或任何事物都不熟悉,我只是觉得高尔夫发明了自己的语言真是太酷了!
亚历山大·托斯特林

2
还有很多。查看PPCG用户创建哪些编程语言?
丹尼斯

10

Pyth,16 15字节

*hyJ/PQ2^2.>QhJ

1字节感谢丹尼斯

测试套件

说明:

*hyJ/PQ2^2.>QhJ
                    Implicit: Q = eval(input())
     PQ             Take the prime factorization of Q.
    /  2            Count how many 2s appear. This is a.
   J                Save it to J.
  y                 Double.
 h                  +1.
          .>QhJ     Shift Q right by J + 1, giving b.
        ^2          Compute 2 ** b.
*                   Multiply the above together, and print implicitly.

7

MATL,22字节

Yft2=XK~)pq2/2w^Ks2*Q*

在线尝试!

说明

Yf      % factor
t       % duplicate
2=      % compare to 2 (yields a logical array)
XK      % save a copy of that to variable K
~)      % keep only values != 2 in the factors array
p       % multiply that factors
q2/     % product - 1 / 2
2w^     % 2^x

K       % load variable K (the logical array)
s       % sum (yields the number of 2s)
2*Q     % count * 2 + 1

*       % multiply both values

非常好!您可以使用Q1+(这是最近引入的),并q1-。这也节省了一个空间(您可以用H任何方式保存)。看到这里
Luis Mendo

@LuisMendo谢谢。不知道该功能。
Rainer P.

5
用MATL击败Luis做得很好!
Stewie Griffin

6

Python 2,39个字节

lambda n:2*len(bin(n&-n))-5<<n/2/(n&-n)

n & -n给出2的最大幂除n。之所以有效,是因为在二进制补码算法中-n == ~n + 1。如果nķ尾随零,同时其补将导致它有ķ尾随的。然后加1会将所有尾随的1更改为零,并将2 ^ k位从0更改为1。因此以1 -n结尾,后跟k 0(与一样n),而n在所有较高位置都有相反的位。


您能否简要解释一下n&-n工作原理?我知道这个技巧在做什么,但不是怎么做:(
Erwan

n&-n返回除以2的最高幂n
尼尔

我解释了@Erwan n & -n
feersum

我已经在Anarchy golf上获得了相应的程序n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100,但是最好的解决方案落后了两个字符。
xnor

@xnor提示:59字节的解决方案(至少是我的)不适用于的所有值n
feersum

6

MATL,25 26字节

:qt2w^w!2*Q*G=2#f2*q2bq^*

这使用该语言/编译器的当前版本(10.2.1)

在线尝试!

说明

基于蛮力,非常简单。尝试ab的所有组合,选择适当的一个并进行所需的计算。

:q          % implicit input "n". Generate row vector [0,1,...,n-1], say "x"
t2w^        % duplicate and compute 2^x element-wise
w!2*Q       % swap, transpose to column vector, compute 2*x+1
*           % compute all combinations of products. Gives 2D array
G=2#f       % find indices where that array equals n
2*q2bq^*    % apply operation to flipped values

1
哈哈!:-P用您自己的语言殴打...第一次吗?
Stewie Griffin

@StewieGriffin是的!一个不错的里程碑:-)
路易斯·门多

5

朱莉娅,41个字节

n->2^(n>>(a=get(factor(n),2,0)+1))*(2a-1)

这是一个接受整数并返回整数的匿名函数。要调用它,请将其分配给变量。

我们将a的素数分解定义为1 + 2的指数n。由于factor回报Dict,我们可以使用get为0的默认值,以防因式分解不含2.我们右位移位n通过a,并需要2至这个权力。我们将其乘以2a-1得到结果。


4

Perl 5,40个字节

38个字节加2 -p

$i++,$_/=2until$_%2;$_=2*$i+1<<$_/2-.5

-p将STDIN读入变量$_

$i++,$_/=2until$_%2递增$i(从0开始)并减半$_直到$_非零模2。之后,$_是原始数的奇数因子,$i是2的指数。

$_=2*$i+1<<$_/2-.5—的右侧=仅是所求数字的公式:{1大于2的指数的两倍}乘以{2到{奇数因子减一半}的幂}。但是,“次数{2到…的力量}”被打高尔夫球为“向左移位……”。并将该右侧分配给$_

-p打印$_



2

的JavaScript ES6,36个 33字节

n=>63-2*Math.clz32(b=n&-n)<<n/b/2

我的理解是,这Math.clz32将比摆弄短toString(2).length

编辑:由于@ user81655,节省了3个字节。


真好 您还可以通过设置n&-n一个变量来节省一些字节:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
user81655

@ user81655谢谢;我只希望可以使用n&=-n,但是我又需要n...
Neil

1

PARI / GP,38个字节

f(n)=k=valuation(n,2);(2*k+1)<<(n>>k\2)

请注意,>>\具有相同的优先级,并且是从左到右计算的,因此最后一部分可以是n>>k\2而不是(n>>k)\2。非高尔夫版本将使k词法与my

f(n)=
{
  my(k=valuation(n,2));
  (2*k+1) << ((n>>k)\2);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.