如果在其二进制表示形式的任何两个连续1之间至少存在K 0,则正整数N为K-稀疏。
因此,数字1010101为1稀疏,而101101不是。
您的任务是找到给定输入数字的下一个1稀疏数字。例如,如果输入为12(0b1100
),则输出应为16(0b10000
),如果输入为18(0b10010
),则输出应为20(0b10100
)。
最小的程序或函数(以字节为单位)获胜!不允许出现标准漏洞。
如果在其二进制表示形式的任何两个连续1之间至少存在K 0,则正整数N为K-稀疏。
因此,数字1010101为1稀疏,而101101不是。
您的任务是找到给定输入数字的下一个1稀疏数字。例如,如果输入为12(0b1100
),则输出应为16(0b10000
),如果输入为18(0b10010
),则输出应为20(0b10100
)。
最小的程序或函数(以字节为单位)获胜!不允许出现标准漏洞。
Answers:
x & (x*2) != 0
算法我对Pyth的第一次尝试:
f!.&TyThQ
implicit: Q = input()
f hQ find the first integer T >= Q + 1,
that satisfies the condition:
!.&TyT T & (T * 2) is 0
DigitalTrauma节省了3个字节。
l~{)___+&}g
l~ "Read and eval input.";
{ }g "Do while...";
)_ "Increment and duplicate (call this x).";
__+ "Get two more copies and add them to get x and 2x on the stack.";
& "Take their bitwise AND. This is non-zero is as long as x's base-2
representation contains '11'.";
这样就将最后一个数字留在堆栈上,并在程序末尾自动打印。
f!}`11.BThQ
在线尝试:Pyth编译器/执行器。
implicit: Q = input()
f hQ find the first integer T >= Q + 1,
that satisfies the condition:
!}`11.BT "11" is not in the binary representation of T
"11"
变成来保存字符`11
。
感谢MartinBüttner,节省了11个字节。
#+1//.i_/;BitAnd[i,2i]>0:>i+1&
一元动词。固定要遵守规则。
(+1 1+./@E.#:)^:_@>:
首先,这是带空格的动词,然后少打一点:
(+ 1 1 +./@E. #:)^:_@>:
[: (] + [: +./ 1 1 E. #:)^:_ >:
读:
] The argument
+ plus
[: +./ the or-reduction of
1 1 E. the 1 1 interval membership in
#: the base-2 representation of the argument,
[: ( )^:_ that to the power limit of
>: the incremented argument
自变量加上自变量的以
1 1
2为基数的表示形式的间隔成员数的或减,即应用于递增自变量的幂限制。
我基本上计算是否1 1
在输入的base-2表示形式中发生。如果是这样,我将增加输入。这被置于功率限制之下,这意味着将应用它,直到结果不再更改为止。
{⍵+∨/2∧/⍵⊤⍨⍵⍴2}⍣=
。
没有正则表达式,没有字符串,递归:
R=(n,x=3)=>x%4>2?R(++n,n):x?R(n,x>>1):n
迭代版本:
F=n=>{for(x=3;x%4>2?x=++n:x>>=1;);return n}
这非常简单,只需使用右移找到11的序列即可。找到后,跳到下一个数字。递归版本直接来自迭代版本。
不打高尔夫球,更明显。对于高尔夫来说,最棘手的部分是合并内圈和外圈(开始时必须将x初始化为3)
F = n=>{
do {
++n; // next number
for(x = n; x != 0; x >>= 1) {
// loop to find 11 in any position
if ((x & 3) == 3) { // least 2 bits == 11
break;
}
}
} while (x != 0) // if 11 was found,early exit from inner loop and x != 0
return n
}
%4>2
看起来像是数论的法术,请您解释一下|| 提供链接?
f=input()+1
while f&2*f:f+=1
print f
将逻辑x & 2*x == 0
用于1稀疏数。
感谢@Nick和@CarpetPython。
感谢MartinBüttner保存9个字节,Pietu1998保存4个字节!
function n(a){for(a++;/11/.test(a.toString(2));a++);return a;}
工作原理:只要当前数字不是1稀疏,它就会运行一个for
循环a + 1
,如果是,则循环被中断并返回当前数字。要检查数字是否为1稀疏,将其转换为二进制并检查其是否不包含11
。
未投放的代码:
function nextOneSparseNumber(num) {
for (num++; /11/.test(num.toString(2)); num++);
return num;
}
n->(while contains(bin(n+=1),"11")end;n)
这将创建一个匿名函数,该函数接受单个整数作为输入并返回下一个最高的1稀疏整数。要调用它,请给它起一个名字,例如f=n->...
do f(12)
。
取消+说明:
function f(n)
# While the string representation of n+1 in binary contains "11",
# increment n. Once it doesn't, we've got the answer!
while contains(bin(n += 1), "11")
end
return(n)
end
例子:
julia> f(12)
16
julia> f(16)
20
一如既往地欢迎提出建议和/或问题!
1+:>: 4%:3(?v~~
;n~^?-1:,2-%2<
用法:
>python fish.py onesparse.fish -v 12
16
为-v
标志添加了3个字节。
在这里尝试:http : //repl.it/gpu/2
以lambda形式表示(感谢xnor打高尔夫球):
f=lambda x:1+x&x/2and f(x+1)or-~x
事实证明,标准函数语法一次比lambda短!
def f(x):x+=1;return x*(x&x*2<1)or f(x)
f=lambda x:1+x&x/2and f(x+1)or-~x
。事实证明,您可以右移而不是左移,可以使用x/2
代替,(x+1)/2
因为差异始终为的零位x+1
。规范虽然要求一个程序。
‘&Ḥ¬Ɗ1#
接受单个非负整数的完整程序,它打印一个正整数(作为单子链接,它将产生一个包含单个正整数的列表)。
从开始v=n+1
并递增,加倍v
以将每个位向上移动一位并按位与v
,然后执行逻辑非测试是否v
为1稀疏,直到找到一个这样的数字。
‘&Ḥ¬Ɗ1# - Main Link: n e.g. 12
‘ - increment 13
1# - 1-find (start with that as v and increment until 1 match is found) using:
Ɗ - last three links as a dyad:
Ḥ - double v
& - (v) bit-wise AND (with that)
¬ - logical NOT (0->1 else 1)
- implicit print (a single item list prints as just the item would)