Биговка для добычи

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
Хорошая точка зрения. Я изменю это.
фосген

Ответы:

2

Pyth, 31 байт

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

Это определяет функцию, yкоторая вычисляет значение складки.

Демонстрация.

При этом используется рекурсивный метод, в котором берется максимальное количество баллов каждого возможного преемника.

Базовый случай рекурсии реализуется путем объединения входных данных с отсортированными значениями возможных преемников, а затем с окончанием списка результатов. Если на входе есть только 1 элемент, преемников нет, и поэтому конец списка является единственным элементом на входе.

isaacg
источник
Трудно представить, что это будет побеждено. Может быть, у 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;
}
Hand-E-Food
источник