交替涂抹


12

介绍

此挑战要求您将整数二进制表示形式的尾随零设置为010101…,这最好用一个示例进行说明:

给定整数400,第一步是将其转换为二进制:

110010000

如我们所见,第五位是最低有效1位,因此从此处开始,我们将低位零替换为0101

110010101

最后,我们将其转换回十进制: 405

挑战

给定正整数返回/输出,上述定义过程的相应结果值。

规则

  • 此序列仅针对具有至少一位的整数定义1,因此输入将始终≥1
  • 您可以将输入作为字符串,而不是数字列表(十进制)
  • 您不必处理无效的输入

测试用例

以下是一些带有中间步骤的测试用例(您不必打印/返回这些用例):

In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298

我们可以假设一个32位整数吗?
Arnauld

@Arnauld:当然!
ბიმო

9
一些打高尔夫球的想法:如果n将输入除以2是最大幂,那么答案(input) + ceil((2^n - 2)/3)
就很

Answers:


12

Python 3,20个字节

lambda n:(n&-n)//3+n

在线尝试!

说明

192作为一个例子。其二进制格式为11000000,我们需要将其转换为11010101

我们注意到,我们需要添加10101数字。这是一个几何级数(4^0 + 4^1 + 4^2),其封闭形式为(4^3-1)/(4-1)。这与4^3//3其中//表示整数除法的位置相同。

如果是101010,则仍然是几何级数(2×4^0 + 2×4^1 + 2×4^2),这是2×4^3//3由于上述原因。

不管怎么说,4^32×4^3也只是最低显著位,这是我们通过获得n&-n

我们注意到的补码n00111111。如果我们加一个,它将变为01000000,并且仅与n=11000000最低有效数字重叠。注意,“补加一”仅是求反。


6
@Xcoder先生出色的体育精神
Leaky Nun

1
可能lambda n:(n&-n)//3+n也可以吗?通过了所有示例测试用例,但是根据我的直觉,它应该无效,对吗?
Xcoder先生17年

@ Mr.Xcoder确实有效。
Leaky Nun

1
为什么不使用Python 2保存一个字节?TIO
FlipTack

4
@FlipTack我讨厌python 2
Leaky Nun

8

果冻,5个字节

&N:3+

在线尝试!

这次是Leaky Nun的进攻方式(至少我帮他打了一下:P)

果冻,7个字节

^N+4:6ạ

在线尝试!

Martin Ender的间接帮助下,使用JungHwan Min的出色方法


丹尼斯贴,然后将其删除,一个非常类似的5个字节的解决方案只是你所做的修改之后。有点像&N:3|。恭喜!你在果冻中击败了丹尼斯!(但不是很失望)
wizzwizz4

@ wizzwizz4除了建议Leaky的方法进行一次小型高尔夫然后进行移植外,我确实没有做太多事情。但是:-)
Xcoder先生17年

这是我见过的第一个纯ASCII的果冻答案。
MD XF

6

Wolfram语言(Mathematica)36 28 26 24字节

@MartinEnder得-8个字节,@ Mr.Xcoder得-2个字节

#+⌊(#~BitAnd~-#)/3⌋&

在线尝试!

我们只需要在输入中找到尾随零的数量,并找到0s和1s 交替且长度小于1的数字,然后将其添加到输入中即可。

所以, 400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405

在OEIS上的A000975中给出了s和s n交替1的th数的显式公式。我们可以使用th号,因为没有两个不同的数字可以具有相同的二进制长度并且具有交替的数字。0n


1
2^#~IntegerExponent~2(BitXor[#,#-1]+1)/2
Martin Ender

@MartinEnder哇!然后我可以合并分数以减少更多字节
JungHwan Min

1
24字节。您可以#+⌊(#~BitAnd~-#)/3⌋&改用。
Xcoder先生17年

@ Mr.Xcoder编辑:)
JungHwan Min

5

J19 18字节

+(2|-.i.@#.-.)&.#:

在线尝试!

快速说明

这是一个古老的答案,但实际上与当前答案非常相似,只是尾随零的计数方式不同。请参阅注释以获取解释其工作原理的链接。

+(2|i.@i.&1@|.)&.#:
                 #:  Convert to binary list
       i.&1@|.       Index of last 1 from right
            |.         Reverse
       i.&1            Index of first 1
    i.               Range [0, index of last 1 from right)
  2|                 That range mod 2
               &.    Convert back to decimal number
+                    Add to the input

其他答案:

先前的答案(19个字节)。

+(2|i.@i.&1@|.)&.#:

比它应该的更长,因为它\从右到左移动。

+(2|#*-.#.-.)\&.(|.@#:)

1
18字节+(2|-.i.@#.-.)&.#:
英里

@miles介意解释那里的基本转换是怎么回事?我猜这与零有关,但我不确定。
cole

#.~ 计算尾随真相的数量,所以我们需要#.~ -. #:计算尾随零的数量
英里

@miles啊!那非常非常聪明。
cole

4

朱莉娅0.6,12字节

!n=n|n&-n÷3

在线尝试!


这看起来是一种有效的方法,您能否解释运算符的优先级?举例来说,我不能告诉无论是评估为((!n=(n|n))&-n)/3,或!n=(((n|n)&(-n))/3)
MD XF

在Julia中,按位运算符的优先级与算术对|等运算符的优先级相同,因此like +&like *。因此,n|n&-n÷3被解析为n | ((n&-n) ÷3)
丹尼斯

3

JavaScript(ES6),40 39字节

将输入作为32位整数。

n=>n|((n&=-n)&(m=0xAAAAAAAA)?m:m/2)&--n

测试用例


2

05AB1E13 8 5字节

Xcoder先生JungHwan Min的简洁公式
节省了5个字节Xcoder先生又节省了3个字节

(&3÷+

在线尝试!

说明

(      # negate input
 &     # AND with input
  3÷   # integer divide by 3
    +  # add to input

1
也许值得一提的是,移植数学答案给你8个字节
Xcoder先生

@ Mr.Xcoder:哦,这是一个很好的公式。
Emigna

1
05ab1e是否按位与?如果是这样,(<bitwise and here>3÷+应该工作约5个字节。
Xcoder先生17年

2

R71 58字节

感谢-6个字节的NofP

function(n){n=n%/%(x=2^(0:31))%%2
n[!cumsum(n)]=1:0
n%*%x}

在线尝试!

假设输入是一个32位整数。double无论如何,R仅具有符号的32位整数(当整数溢出时广播),并且没有64位或无符号的整数。


您可以将转换which.max(n):1-1!cumsum(n)以获得65字节的解决方案
NofP

@NofP谢谢!好主意啊。
朱塞佩

2

brainfuck,120个字节

>+<[[>-]++>[[>]>]<[>+>]<[<]>-]>[-<+>[-<[<]<]>]>[>]<[>+<[->+<]<[->+<]<]>>[<]+>[-[-<[->+<<+>]>[-<+>]]<[->++<]<[->+<]>>>]<<

在线试用!

以当前单元格中的值开始,以输出值结束于单元格上。显然不适用于255以上的数字,因为这是典型的Brainfuck的细胞限制,但是如果您假设无限的细胞大小,则可以使用。


1

PowerShell,168字节

param($n)$a=($c=[convert])::ToString($n,2);if(($x=[regex]::Match($a,'0+$').index)-gt0){$c::ToInt32(-join($a[0..($x-1)]+($a[$x..$a.length]|%{(0,1)[$i++%2]})),2)}else{$n}

在线尝试!

哎哟。二进制切片和数组切片之间的转换并不是PowerShell的强项。

将输入$n作为数字。我们立即将convert其以二进制为基础2并将其存储到中$a。接下来,我们有一个if / else构造。if子句测试字符串()末尾的a相regex Match对于1或更多0s 的位置是否大于(即,二进制字符串的开头)。如果是这样,我们可以处理一些事情,我们只输出数字。'0+$'index0else

在中if,我们将x第一个数字切成薄片,然后+将其余的数字与它们进行数组连接。但是,对于其余数字,我们将在它们之间循环,然后使用选择来选择a 01要输出的内容$i++%2。这将为我们提供010101...模式,而不是最后的0s。然后-join,我们将其重新组合成一个字符串,然后将其$c反转为Int32from 2

无论哪种情况,数字都留在管道上,并且输出是隐式的。


1

APL + WIN,43个字节

p←+/^\⌽~n←((⌊1+2⍟n)⍴2)⊤n←⎕⋄2⊥((-p)↓n),p⍴0 1

提示输入屏幕









1

JavaScript ES6,13个字节

n=>(n&-n)/3|n

f = 
n=>(n&-n)/3|n
;
console.log (f(8));
console.log (f(243));
console.log (f(1048576));
console.log (f(33554432));




0

果冻,13个字节

BŒgṪµ2Ḷṁ×CḄ+³

在线尝试!

说明

以24为例输入。

BŒgṪµ2Ḷṁ×CḄ+³
B                Binary representation of the input → 11000
 Œg              Group runs of equal length → [[1,1],[0,0,0]]
   Ṫ             Tail → [0,0,0]
    µ            New monadic link
     2Ḷ          [0,1] constant
       ṁ         Mold [0,1] to the shape of [0,0,0] → [0,1,0]
        ×        Multiply [0,1,0] by...
         C       1-[0,0,0]. If last bit(s) of the original input are 1 this will add nothing to the original input
          Ḅ      Convert to decimal from binary → 2
           +³    Add this with the original input → 26
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.