Vincar por pilhagem

12

Introdução

Após uma longa batalha, você conseguiu derrotar uma Esfinge em um concurso de enigmas. A Esfinge, impressionada com sua habilidade, deseja lhe dar uma recompensa proporcional à sua esperteza e evoca uma tira de pergaminho mágico dividida em oito caixas, cada uma contendo um numeral.

"Enrugue o pergaminho", diz a Esfinge, "de modo que as caixas se sobreponham, e essas caixas se fundirão por adição ou multiplicação. Quando uma caixa permanecer, seu valor será sua recompensa em moedas de ouro".

Tarefa

Você deve escrever um programa ou função que tenha como entrada uma lista / matriz / qualquer um dos oito números naturais e retorne / imprima a recompensa máxima possível obtida por meio de uma série de operações de 'vinco'.

Mecânica

A operação 'vinco' é realizada em algum número de células e com +ou *como operador. As primeiras n células da lista são dobradas e mescladas com as células de destino usando o operador. Quaisquer células que não são consumidas na operação de mesclagem são deixadas sem modificação.

Aqui está um exemplo de vincagem usando n = 3 células:

insira a descrição da imagem aqui

usando qualquer adição, o que resultaria nisso:

insira a descrição da imagem aqui

ou multiplicação, o que resultaria nisso:

insira a descrição da imagem aqui

Nota: Por simplicidade, vincar com menos de 1 célula não é permitido, assim como vincar com um número de células maior ou igual ao comprimento da lista. No entanto, uma lista pode dobrar em mais da metade da contagem de células.

Uma lista de 8 células pode ser dobrada por 5, resultando em uma nova lista de comprimento 5: [0,1,2,3,4,5,6,7]dobrada por 5 células usando o +operador [9,9,9,1,0].

Pontuação

Regras padrão de código de golfe - o código que produz a saída correta e possui o menor número de bytes ganha.

Bônus: Se o seu código também retorna / imprime a sequência de operações de dobra que leva à recompensa máxima, multiplique sua pontuação por 0,8. A saída de exemplo pode parecer com:

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

Exemplos

Teste seu código usando essas entradas e resultados, na 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
fosgênio
fonte
O exemplo de saída no cabeçalho "Pontuação" é inválido. Depois de vincar 5 e 2, restam apenas 3 células; portanto, vincar 3 não faz sentido.
Hand-E-Food
Bom ponto. Eu vou mudar isso.
phosgene

Respostas:

2

Pitão, 31 bytes

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

Isso define uma função y, que calcula o valor do vinco.

Demonstração.

Isso usa o método recusivo, obtendo o máximo da pontuação de todos os sucessores possíveis.

O caso base da recursão é implementado concatenando a entrada para os valores classificados dos possíveis sucessores e, em seguida, finalizando a lista resultante. Se houver apenas 1 elemento na entrada, não haverá sucessores e, portanto, o final da lista é o único elemento na entrada.

isaacg
fonte
É difícil imaginar isso sendo espancado. Talvez CJam tenha uma chance?
Fosgene
2

C #, 275 272 bytes

É simplesmente uma função recursiva que percorre todos os ramos e retorna a melhor pontuação.

Recuado para maior clareza:

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;
}
Mão-E-Comida
fonte