Зміна за Лут


12

Вступ

Після тривалого бою вам вдалося перемогти Сфінкса в конкурсі загадок. Сфінкс, вражений вашою майстерністю, хоче дати вам нагороду, пропорційну вашій кмітливості, і створює на світ смужку магічного пергаменту, розділену на вісім ящиків, кожна з яких містить цифру.

"Створіть пергамент, - каже Сфінкс, - таким чином, що коробки перекриваються, і ці скриньки будуть зливатися або шляхом додавання, або множення. Коли одна скринька залишиться, її значення буде вашою винагородою в золотих монетах".

Завдання

Ви повинні написати програму або функцію, яка приймає як вхід список / масив / незалежно від восьми натуральних чисел, і повертає / друкує максимально можливу нагороду, яку можна отримати за допомогою серії операцій "збільшення".

Механіка

Операція 'crease' виконується на деякій кількості комірок, +або *з оператором, або як. Перші n комірок списку складені поперек та об'єднані з осередками призначення за допомогою оператора. Будь-які комірки, які не споживаються в процесі злиття, залишаються незмінними.

Ось приклад згортання з використанням n = 3 комірок:

введіть тут опис зображення

використовуючи будь-яке додавання, що призведе до цього:

введіть тут опис зображення

або множення, що призведе до цього:

введіть тут опис зображення

Примітка. Для простоти зміщення з меншою кількістю клітинок заборонено, як і зміщення з кількістю клітинок, більшим або рівним довжині списку. Однак список можна збільшити на більш ніж половину його кількості комірок.

Список з 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 елемент, наступників немає, і тому кінець списку є одним елементом вхідних даних.


Важко уявити, що це побиття. Можливо, у 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.