这是最近挑战的一个版本,这个数字是2的整数次幂吗?具有一系列不同的标准,这些标准旨在突出问题的有趣性质并使挑战更加艰巨。我在这里考虑了一下。
托比在链接的问题中很好地说明了这一挑战:
有很多聪明的方法可以确定整数是否为2的精确幂。这不再是一个有趣的问题,因此让我们确定给定的整数是否为-2的精确幂。例如:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
规则:
- 整数是64位带符号的二进制补码。这是您可以使用的唯一数据类型。
- 您只能使用以下操作。这些都算作一项操作。
n << k
,n >> k
:左/右移位n
通过k
比特。符号位右移扩展。n >>> k
:右移,但不扩展符号位。0移入。a & b
,a | b
,a ^ b
:按位AND,OR,XOR。a + b
,a - b
,a * b
:加,减,乘。~b
:按位反转。-b
:补码取反。a / b
,a % b
:除(整数商,四舍五入为0)并取模。- 负数的模使用C99中指定的规则:
(a/b) * b + a%b
相等a
。所以5 % -3
是2
和-5 % 3
是-2
: 5 / 3
是1
,5 % 3
是2
,因为1 * 3 + 2 = 5。-5 / 3
是-1
,-5 % 3
是-2
,为-1 * 3 + -2 = -5。5 / -3
是-1
,5 % -3
是2
,如-1 * -3 + 2 = 5。-5 / -3
是1
,-5 % -3
是-2
,为1 * -3 + -2 = -5。- 请注意,Python的下位
//
除法运算符不满足这里的除法的“朝0取整”属性,Python的%
运算符也不满足要求。
- 负数的模使用C99中指定的规则:
- 分配不算作一项操作。与C中一样,赋值的结果是赋值后的左侧值:
a = (b = a + 5)
设置b
为a + 5
,然后设置a
为b
,并计为一次操作。 - 复合分配可以用作
a += b
均值a = a + b
并算作一项操作。
- 您可以使用整数常量,它们不算作任何东西。
- 指定操作顺序的括号是可以接受的。
- 您可以声明函数。函数声明可以采用任何方便的样式,但是请注意,64位整数是唯一有效的数据类型。函数声明不算作操作,但函数调用算作一个。另外,要明确一点:函数可以包含多个
return
语句,并且可以return
从任何点开始执行。在return
本身并不能算作一个操作。 - 您可以免费声明变量。
- 您可以使用
while
循环,但不能使用if
或for
。while
条件中使用的运算符计入您的分数。while
只要条件的计算结果为非零值,循环就会执行(在具有此概念的语言中,“真” 0为无效结果)。由于早期的回报是允许的,你被允许使用break
,以及 - 允许上溢/下溢,并且不会进行值钳位。可以将其视为操作实际上已正确发生,然后被截断为64位。
得分/获胜标准:
如果输入是-2的幂,则您的代码所产生的值必须为非零,否则为零。
这是atomic-code-golf。您的分数是代码中定义的操作总数(如上定义),而不是运行时执行的操作总数。如下代码:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
包含5个操作:函数中的两个和三个函数调用。
无论如何显示结果,使用语言中方便的方式,无论最终将结果存储在变量中,从函数返回结果还是其他方式都无所谓。
获胜者的职位应证明是正确的(如有必要,可提供临时证明或正式证明),并且得分最低,如上所述。
奖励非常困难模式挑战!
为了有机会赢得任何绝对的胜利,除了可能在聚会上打动人们,请在不使用while
循环的情况下提交答案!如果提交了足够多的这些,我什至可以考虑将获胜小组分为两类(有循环和无循环)。
注意:如果您想提供仅支持32位整数的语言的解决方案,可以这样做,只要您有充分的理由证明它对于64位整数仍然是正确的,就可以解释。
另外:如果某些特定于语言的功能没有逃避规则,但对于强迫您的语言按照上述规则行事,则是免费的。例如(做作),我将允许在循环中使用自由不等于0的比较,while
将其应用于整个条件时,作为具有“真实” 0的语言的解决方法。不允许尝试利用这些类型的事物进行明确的尝试 -例如,上述规则集中不存在“真实的” 0或“未定义的”值的概念,因此可能不依赖它们。
m ^= s
它仍然令人印象深刻,我认为完全可以进行替代以进一步改进它。
while
与break
,但不是if
?if (x) { ... }
等价于while (x) { ... break; }
。
break
而早期的回报是令人遗憾的部分),这是一个漫长的故事,也是在未来挑战规则中吸取的教训。总是有“奖金”版本!:)
if
和for
被禁止?int x=condition; while (x) { ... x=0; }
是免费的,只需更多代码。与c样式相同for
。