{0、3、2、5、0、3、5、1、4、6、2、4}的最短表达式


24

给定的整数列表{0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}。对于那些感兴趣的人,这些数字将用于工作日计算。

工作日= (m[n] + d + y + y>>2 + y/400 - y/100) % 7;m[n]我要搜索的表达式d-月中的某天y- year - (month <= 2)

构造由算术,逻辑和按位运算符组成的表达式,该表达式将输出正整数n整数,m以便m % 7等于列表中的第n个数字。

不允许使用分支,三元运算符,表查找和指针。

得分:
1- | & ^ ~ >> <<运营商
1.1- + - < > <= >= == != ! && ||运营商
1.2- *运营商
1.4- / %运营商

以最低分数获胜的答案。

我个人发现:

(41*n)>>4+((n+61)>>4)<<2得分6.4。我认为很难找到这样提供的表达方式。


我猜也不允许数组解引用(和亲属)?
John Dvorak 2014年

哦,是的,当然,我已经编辑了问题。
Somnium

6
某些动机将大大改善这个问题。这些数字从哪里来?
彼得·泰勒

table lookups有趣的措辞,我想...
ɐɔıʇǝɥʇuʎs

4
为什么不计算分数的%7?也许还有另一种不使用%的解决方案。零为正,为负,或者为零
Thomas Weller 2014年

Answers:


34

2 2.2

我喜欢任意精度的算术。

0x4126030156610>>(n<<2)

或者,如果您不喜欢十六进制,

1146104239711760>>(n<<2)

测试:

print([(0x4126030156610>>(n<<2))%7 for n in range(1,13)])
[0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]

您是否可以4*n改为使用查找表,并通过将其写为保存0.2点n<<2
xnor

@xnor绝对!只是要从八进制切换到十六进制。就像秒
isaacg 2014年

凉。我非常相信,没有什么能做得更好,因为它只需要使用一个操作,它们似乎都具有太多的mod结构7。我最好的整数整数除法候选人const/nn=4和产生矛盾n=8
xnor

@xnor另一个靠近一个是const%n可能满足除N = 1,2和3的一切
isaacg

我要去做同样的事情,但你打我吧......
ɐɔıʇǝɥʇuʎs

32

2.0

(127004 >> i) ^ 60233

或(得分2.2):

(i * 3246) ^ 130159

所有发现都用蛮力:-)


由于此分数与isaacg的答案得分相同,但不使用64位整数,因此我选择此作为可接受的答案。谢谢你的答案!
2014年

8
@ user2992539虽然此答案使用32位整数很好,但您没有在挑战中指定此标准,这使得isaacg的答案非常有效。因此,两个答案并列,我认为接受一个得到此分数的答案是公平的。(不过,对超级Chafouin表示敬意,+ 1!)
Martin Ender

@ m.buettner我必须同意你的观点。下次,我将更加谨慎地描述和选择答案。
2014年

为了让其他人学习,您能否详细说明一下如何进行蛮力计算?
Thomas Weller 2014年

@Thomas我刚刚做了一个双for循环,测试了公式的所有值p,q (p >> i) ^ q,然后去喝咖啡,然后在1000万下读取结果。
Arnaud 2014年

8

35.3

我怀疑这可能是创建列表效率最低的方法:

1.7801122128869781e+003 * n - 
1.7215267321373362e+003 * n ^ 2 + 
8.3107487075415247e+002 * n ^ 3 - 
2.0576746235987866e+002 * n ^ 4 + 
1.7702949291688071e+001 * n ^ 5 + 
3.7551387326116981e+000 * n ^ 6 - 
1.3296432299817251e+000 * n ^ 7 + 
1.8138635864087030e-001 * n ^ 8 - 
1.3366764519057219e-002 * n ^ 9 + 
5.2402527302299116e-004 * n ^ 10 - 
8.5946393615396631e-006 * n ^ 11 -
7.0418841304671321e+002

我只是计算了多项式回归。我很想看看还有什么其他可怕的方法可以尝试。

值得注意的是,如果将结果四舍五入,我可以节省3.3点。在这一点上,我认为这并不重要。


5

3.2

零基解决方案:

7 & (37383146136 >> (i*3))

一种基于的解决方案:

7 & (299065169088 >> (i*3))

最初,我认为该%7操作也应计为%一个昂贵的操作,因此我尝试在没有此操作的情况下解决该问题。

我得出了这样的3.2结果:

// Construction of the number
// Use 3 bits per entry and shift to correct place
long c = 0;
int[] nums = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
for (int i = nums.Length - 1; i >= 0; i--)
{
    c <<= 3;
    c += nums[i];
}
// c = 37383146136

// Actual challenge
for (int i = 0; i < 13; i++)
{
    Console.Write("{0} ",7 & 37383146136 >> i*3);
}

我会对使用这种方法(没有%)的优化感兴趣。谢谢。


这很酷,也许有一天会对我有帮助)您如何看待,也许我应该为整个公式最小化创建单独的问题?
2014年

1
怎么(0426415305230 >> (i*3)) & 7样 您可以按相反的顺序查看输出数字。
CJ丹尼斯2014年

@CJDennis:我认为C#中没有八进制数。
Thomas Weller 2014年

我以为只是C?我看不到其他对C#的引用。
CJ丹尼斯

0

巨蟒(3)

既然这些问题中有很多,我决定开发一个程序以3个(或2个)标记自动解决它们。这是此挑战的结果:

G:\Users\Synthetica\Anaconda\python.exe "C:/Users/Synthetica/PycharmProjects/PCCG/Atomic golfer.py"
Input sequence: 0 3 2 5 0 3 5 1 4 6 2 4
f = lambda n: (72997619651120 >> (n << 2)) & 15
f = lambda n: (0x426415305230L >> (n << 2)) & 15
f = lambda n: (0b10000100110010000010101001100000101001000110000 >> (n << 2)) & 15

Process finished with exit code 0

证明有效的方法:

f = lambda n: (72997619651120 >> (n << 2)) & 15

for i in range(12):
   print i, f(i)

0 0
1 3
2 2
3 5
4 0
5 3
6 5
7 1
8 4
9 6
10 2
11 4

您的求解器如何考虑操作数的成本?
Thomas Weller 2014年

@ThomasW。不会,它将始终使用向右移位,可能还会向左移位(如果值不是1位)和一个&
ɐɔıʇǝɥʇuʎs
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.