快递号码
早在60年代,法国人就发明了电视游戏节目“ Des Chiffres et des Lettres”(数字和字母)。节目的“数字”部分的目标是,使用一些半随机选择的数字,尽可能接近某个3位目标数字。参赛者可以使用以下运算符:
- 串联(1和2为12)
- 加法(1 + 2是3)
- 减法(5-3 = 2)
- 除(8/2 = 4); 仅当结果为自然数时才允许除法
- 乘法(2 * 3 = 6)
- 括号,以覆盖运算的常规优先级:2 *(3 + 4)= 14
每个给定的号码只能使用一次或根本不能使用。
例如,目标数字728可以与以下数字精确匹配:6、10、25、75、5和50,其表达式如下:
75 * 10 - ( ( 6 + 5 ) * ( 50 / 25 ) ) = 750 - ( 11 * 2 ) = 750 - 22 = 728
在此代码挑战中,您将获得查找尽可能接近特定目标数字的表达式的任务。由于我们生活在21世纪,因此与60年代相比,我们将引入更大的目标数和可使用的数字。
规则
- 允许的运算符:串联,+,-,/,*,(和)
- 串联运算符没有符号。只是连接数字。
- 没有“反向串联”。69是69,不能分为6和9。
- 目标数字是一个正整数,最多18个数字。
- 至少有两个数字可以使用,最多99个数字。这些数字也是正整数,最多18位。
- 有可能(实际上相当有可能)目标数字无法用数字和运算符表示。目标是尽可能接近。
- 该程序应在合理的时间(在现代台式机上几分钟)内完成。
- 有标准漏洞。
- 您的程序可能没有针对此难题的“评分”部分中的测试集进行优化。如果我怀疑有人违反此规则,我保留更改测试集的权利。
- 这不是代码高尔夫。
输入值
输入包含一个数字数组,可以用任何方便的方式对其进行格式化。第一个数字是目标数字。其余数字是您应该用来形成目标数字的数字。
输出量
输出要求是:
- 它应该是一个包含以下内容的字符串:
- 输入号码的任何子集(目标号码除外)
- 任意数量的运营商
- 我希望输出是没有空格的单行,但是如果您必须的话,可以根据需要添加空格和换行符。它们将在控制程序中被忽略。
- 输出应为有效的数学表达式。
例子
为了便于阅读,所有这些示例均具有精确的解决方案,并且每个输入数字仅使用一次。
输入: 1515483, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
输出:111*111*(111+11+1)
输入: 153135, 1, 2, 3, 4, 5, 6, 7, 8, 9
输出:123*(456+789)
输入:8888888888, 9, 9, 9, 99, 99, 99, 999, 999, 999, 9999, 9999, 9999, 99999, 99999, 99999, 1
输出:9*99*999*9999-9999999-999999-99999-99999-99999-9999-999-9-1
输入: 207901, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
输出:1+2*(3+4)*(5+6)*(7+8)*90
输入:34943, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
输出:1+2*(3+4*(5+6*(7+8*90)))
但有效的输出是:34957-6-8
计分
程序的惩罚分数是下面测试集的表达式的相对误差的总和。
例如,如果目标值为125,而表达式给出120,则您的罚分是abs(1-120/125)= 0,04。
最低的程序得分(最低的总相对误差)获得。如果两个程序均等完成,则第一个提交将获胜。
最后,测试集(8个案例):
14142, 10, 11, 12, 13, 14, 15
48077691, 6, 9, 66, 69, 666, 669, 696, 699, 966, 969, 996, 999
333723173, 3, 3, 3, 33, 333, 3333, 33333, 333333, 3333333, 33333333, 333333333
589637567, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
8067171096, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199
78649377055, 0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110, 132, 156, 182, 210, 240, 272, 306, 342, 380, 420, 462, 506, 552, 600, 650, 702, 756, 812, 870, 930, 992
792787123866, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169
2423473942768, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 2000000, 5000000, 10000000, 20000000, 50000000
以前的类似难题
创建了这个难题并将其发布到沙盒之后,我在之前的两个难题中注意到了类似(但不相同!)的地方:here(无解决方案)和here。这个难题有所不同,因为它引入了连接运算符,我不寻求并精确匹配,而且我希望看到无需蛮力就能接近解决方案的策略。我认为这很有挑战性。