抢劫


12

介绍

经过漫长的战斗,您在一场谜语竞赛中击败了狮身人面像。狮身人面像对您的技巧印象深刻,希望为您提供与您的机灵相称的奖励,并将一条神奇的羊皮纸条分成八个盒子,每个盒子中都包含一个数字,以实现它们的存在。

狮身人面像说:“减少羊皮纸,使盒子重叠,这些盒子将通过加法或乘法合并。当剩下一个盒子时,它的价值将是用金币作为奖励。”

任务

您必须编写一个程序或函数,该程序或函数将一个列表/数组/八个自然数作为输入,并返回/打印通过一系列“折痕”操作可获得的最大奖励。

机械学

“折痕”操作是在某些单元格上执行的,操作者为+*作为操作者。使用运算符将​​列表的前n个单元格折叠起来并与其目标单元格合并。合并操作中未消耗的任何单元均保持不变。

这是使用n = 3个单元格进行折痕的示例:

在此处输入图片说明

使用任何一种加法,将导致以下结果:

在此处输入图片说明

或乘法,将导致以下结果:

在此处输入图片说明

注意:为简单起见,不允许使用少于1个单元格的折痕,也不允许具有大于或等于列表长度的单元格的折痕。但是,列表的单元格数量可以增加一半以上。

可以将8个单元格的列表加5,从而产生一个新的长度为5的列表: [0,1,2,3,4,5,6,7]使用+操作员会给5个单元格增加一个[9,9,9,1,0]

计分

标准代码高尔夫规则-产生正确输出且获胜字节数最少的代码。

奖励:如果您的代码还返回/打印了导致最大奖励的折痕操作序列,请将分数乘以0.8。输出示例如下:

crease 5 +
crease 2 *
crease 2 +
crease 1 *

例子

使用以下输入和结果测试您的代码,格式为input - maximum reward

[0, 1, 2, 3, 4, 5, 6, 7] - 7560
[0, 9, 0, 3, 2, 6, 1, 5] - 1944
[0, 1, 0, 3, 0, 2, 0, 4] - 36
[6, 0, 9, 1, 9, 0, 7, 3] - 11907
[0, 5, 2, 0, 1, 3, 8, 8] - 2560

“评分”标题下的示例输出无效。在折痕5和2之后,仅剩3个单元格,因此折痕3毫无意义。
Hand-E-Food

好点子。我会改变它。
光气

Answers:


2

Pyth,31个字节

Le+bSyMsm,sMJ.T,_<bd>bdm*FkJtUb

这定义了一个函数,y该函数计算折痕值。

示范。

这使用了回溯性方法,将每个可能的后继者的得分最大化。

递归的基本情况是通过将输入与可能的后继对象的排序值连接在一起,然后获取结果列表的末尾来实现的。如果输入中只有一个元素,则没有后继元素,因此列表的末尾是输入中的一个元素。


很难想象这会被打败。也许CJam有机会吗?
光气

2

C#,275个 272字节

它只是一个遍历每个分支并返回最佳分数的递归函数。

为了清楚起见缩进:

using M=System.Math;
int F(int[]n){
    int b=0,g,h,i=0,j,k,l=n.Length;
    if(l<2)
        return n[0];
    for(;++i<l;){
        int[]m=new int[k=M.Max(i,l-i)],o=new int[k];
        for(j=0;j<k;j++){
            m[j]=((g=i-j-1)<0?0:n[g])+((h=i+j)<l?n[h]:0);
            o[j]=h<l&g>=0?n[g]*n[h]:m[j];
        }
        b=M.Max(b,M.Max(F(m),F(o)));
    }
    return b;
}
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.