Arrugando para botín

12

Introducción

Después de una larga batalla, has logrado derrotar a una esfinge en un concurso de acertijos. La Esfinge, impresionado con tu habilidad, desea darte una recompensa acorde con tu inteligencia, y evoca una tira de pergamino mágico dividido en ocho cajas, cada una con un número.

"Arruga el pergamino", dice la Esfinge, "de modo que las cajas se superpongan, y esas cajas se fusionarán mediante la suma o la multiplicación. Cuando quede una caja, su valor será tu recompensa en monedas de oro".

Tarea

Debe escribir un programa o función que tome como entrada una lista / matriz / cualquiera de los ocho números naturales, y devuelva / imprima la recompensa máxima posible que se puede obtener a través de una serie de operaciones de 'pliegue'.

Mecánica

La operación de 'pliegue' se realiza en cierto número de celdas, y con +o *como operador. Las primeras n celdas de la lista se pliegan y se fusionan con sus celdas de destino utilizando el operador. Las celdas que no se consuman en la operación de fusión no se modifican.

Aquí hay un ejemplo de plegado usando n = 3 celdas:

ingrese la descripción de la imagen aquí

usando cualquiera de las adiciones, lo que resultaría en esto:

ingrese la descripción de la imagen aquí

o multiplicación, lo que resultaría en esto:

ingrese la descripción de la imagen aquí

Nota: Para simplificar, no se permite el pliegue con menos de 1 celda, al igual que el pliegue con un número de celdas mayor o igual a la longitud de la lista. Sin embargo, una lista puede ser aumentada por más de la mitad de su recuento celular.

Una lista de 8 celdas se puede doblar por 5, dando como resultado una nueva lista de longitud 5: se [0,1,2,3,4,5,6,7]doblaría por 5 celdas usando el +operador [9,9,9,1,0].

Puntuación

Reglas de golf de código estándar: el código que produce la salida correcta y tiene el menor número de bytes gana.

Bonificación: si su código también devuelve / imprime la secuencia de operaciones de pliegue que conduce a la recompensa máxima, multiplique su puntaje por 0.8. El resultado de ejemplo podría verse así:

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

Ejemplos

Pruebe su código utilizando estas entradas y resultados, en forma de 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
fosgeno
fuente
El resultado de ejemplo bajo el encabezado "Puntuación" no es válido. Después de arrugar 5 y 2 solo quedan 3 celdas, por lo que no tiene sentido arrugar 3.
Hand-E-Food
Buen punto. Lo cambiaré
phosgene

Respuestas:

2

Pyth, 31 bytes

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

Esto define una función, yque calcula el valor del pliegue.

Demostración.

Esto usa el método recusivo, tomando el máximo de la puntuación de cada posible sucesor.

El caso base de la recursividad se implementa mediante la concatenación de la entrada a los valores ordenados de los posibles sucesores, y luego tomando el final de la lista resultante. Si solo hay 1 elemento en la entrada, no hay sucesores y, por lo tanto, el final de la lista es el único elemento en la entrada.

isaacg
fuente
Es difícil imaginar que esto sea golpeado. Tal vez CJam tiene una oportunidad?
phosgene
2

C #, 275 272 bytes

Es simplemente una función recursiva que atraviesa cada rama y devuelve la mejor puntuación.

Sangrado por claridad:

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
fuente