这是最近挑战的一个版本,这个数字是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。