计算n%12


27

计算无符号32位整数的n12

规则:

  • 必须适用于n0到23之间的所有数字。其他数字是可选的。
  • 必须只使用任何运营商+-*~&^|或者<<>>作为在32位的uint通常定义。
  • 可以使用任意数量的常量单位。
  • 不得使用任何形式的指针,包括数组或任何if语句,包括编译到if语句的内容(例如三元运算符或“大于”运算符)。

得分:

  • 运算符+ -和按位运算符~ & ^ | << >>(NOT,AND,XOR,OR,位移)的得分为1*得分为2
  • 最低总分获胜。

6
您可能想为非C / Java语言的用户定义运算符。我了解+-*加,减,乘;~&^|是按位NOT,AND,XOR,OR;并且<< >>是移位。
级圣河

@steveverrill-谢谢。这确实是意图。
nbubis

我可以使用for i in x:y:z, .dostuff吗?
2014年

是否可以将变量设置为等于在表达式中使用的值?
xnor

4
大多数编译器都会n % 12像黑客所喜欢的那样优化乘法和转换,所以这很简单,只需输出汇编即可,请参见
phuclv 2014年

Answers:


29

4

(语言无关)

n-((48&(11-n))>>2)

!转到4。

11-n 仅当n> = 12时,才能确保所有高阶位都被置1。

48&(11-n) ==如果n> 11,则为48,否则为0

(48&(11-n))>>2 ==如果n> 11,则12,否则0

n-((48&(11-n))>>2) 就是答案


1
Aww吓坏了,您击败了我这种方法!我离发布只有片刻路程n - (((11 - n) & 0xC0000000) >> 28)。做得好,我认为不可能少于四个。
Runer112 2014年

1
@ Runner112是的,我希望有人在发布它时能击败我。不过,在为自己找到它方面做得很好
isaacg 2014年

1
很棒:) 4确实是一项成就。
nbubis 2014年

11

4

具有查找表(查找i ^ (i % 12))的解决方案:

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

这是具有4个操作的另一个解决方案:

i - ((0xffff >> (i - 12)) & 12)

假定位移的计数操作数隐式取为mod 32,即x >> -1与相同x >> 31

5

使用查找表的另一种方法:

i - (16773120 >> i & 1) * 12

7

重击– 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

例如

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
这是无效的,因为它使用了指针。
curiousdannii 2014年

@curiousdannii您指的是什么指针?在stdinstdout流?当然,在内部,它们是指针,但是我们也可以取消Java的资格,因为Java在Integer内部将类用于很多事情。
科尔·约翰逊

$()是否实际上等效于指针?
curiousdannii 2014年

@curiousdannii-AWK文档说它们是内置变量。

5

C,小尾数-2

这可能是作弊,但我认为它满足规则。

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

它是如何工作的?
nbubis

1
Sorta作弊,因为您使用= 0 而不是& 0x0,所以应该算作另外2次操作。但是为创造力+1 :)
nbubis

4

PHP-得分0

我不知道在我之前怎么可能没人来做这件事!!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
真好 我认为可能存在问题,因为不允许使用数组。真的很好。
AJMansfield 2014年

@AJMansfield一个人可能会争论说它没有数组而是字符串(是的,在低级字符串是字节数组)。:)
seequ 2014年

1
@seequ人们还可以争辩说,因为它的使用RAM这个无效的(是的,在低级别,内存在技术上是一个索引数组)_(ツ)_ /¯
斯坦乱弹

2

C,得分5

最多可工作23个,不保证超过此数量。

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4对于n> = 12返回4。将其加到n,您将得到最低有效4位的正确答案,然后截断其他位。


做得好!!现在让我们看看,如果有人能得到4 ..
nbubis

2

任何语言:5

不会赢,而是因为有趣而参与,也许是因为比其他人更容易理解:

n - ((n+20)>>5)*12

这相当于

n - (n>11)*12

这是等效的,因为当您将20加到12时,您得到32,因此第5位变为1。这仅在n> 1时出现,因为32是第5位变为1的最小数字。

还请注意,您可以轻松地将其扩展到更大的范围

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

直到35


1

Python 2.x-4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

=操作员吗?

在这种情况下,得分为6。

j-12*(j*357913942>>32)

BTW @steveverrill的解决方案也可以直接在Python中使用。

适用于范围0 .. 23

发生什么了 ?乘以357913942,再除以2 ^ 32(或右移32)


我喜欢您使用函数仅一次乘法的方式。但是恕我直言,您只是将乘法重命名为函数m(,),对我而言,这意味着您使用了两次。
Pinna_be 2014年

取决于规则的解释方式,但是您有个正确的认识
Willem

1

C-6

(n - (((n * 0xAAAB) >> 19)) * 12 )

这应该是问题的一部分,或者只是另一个答案。我建议后者。
Jwosty 2014年

@Jwosty-改变了。
nbubis

0

眼镜蛇-2(或3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

可能会有点违反规则,但是我已经提出要求并被允许使用它。

它也适用于任何数字。


0

科纳 -5

可能无效,因为我不确定是否允许发言者运算符,但是我有两个*零号:

mod:{x-(_0.08333*x)*12}

应该适用于任何整数。


我不确定下限运算,但是我可以肯定地确定,第一个乘法运算对32位整数以外的东西进行运算。
Runer112

@ Runer112:OP表示输入必须为32位,并且运算符的定义与通常使用32位uint相同;它没有说明代码中的非整数值。
Kyle Kanos 2014年

除非我有误解,否则0.08333 * x看起来不像32位uint所定义的乘法,因为0.08333不是32位uint。
Runer112

1
“可以使用任意数量的常量单位。” -即不能使用任意浮点数。
nbubis 2014年

1
@nbubis:该行实际上并没有限制浮动。
Kyle Kanos 2014年
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.