Cordonatura per bottino


12

introduzione

Dopo una lunga battaglia, sei riuscito a sconfiggere una Sfinge in una gara di enigmi. La Sfinge, colpita dalla tua abilità, desidera darti una ricompensa commisurata alla tua intelligenza e evoca in realtà una striscia di pergamena magica divisa in otto scatole, ognuna contenente un numero.

"Piega la pergamena", dice la Sfinge, "in modo tale che le scatole si sovrappongano, e quelle scatole si uniranno per addizione o moltiplicazione. Quando una casella rimane, il suo valore sarà la tua ricompensa in monete d'oro."

Compito

È necessario scrivere un programma o una funzione che accetta come input un elenco / matrice / qualunque degli otto numeri naturali e restituisce / stampa la massima ricompensa possibile ottenibile attraverso una serie di operazioni di "piega".

Meccanica

L'operazione 'piega' viene eseguita su un numero di celle e con +o *come operatore. Le prime n celle dell'elenco vengono ripiegate e unite con le loro celle di destinazione utilizzando l'operatore. Tutte le celle che non vengono utilizzate nell'operazione di unione vengono lasciate non modificate.

Ecco un esempio di cordonatura utilizzando n = 3 celle:

inserisci qui la descrizione dell'immagine

usando entrambe le aggiunte, ciò comporterebbe questo:

inserisci qui la descrizione dell'immagine

o moltiplicazione, che si tradurrebbe in questo:

inserisci qui la descrizione dell'immagine

Nota: per semplicità, la cordonatura con meno di 1 cella non è consentita, così come la cordonatura con un numero di celle maggiore o uguale alla lunghezza dell'elenco. Tuttavia, un elenco può essere creato da oltre la metà del numero di celle.

Un elenco di 8 celle può essere creato per 5, risultando in un nuovo elenco di lunghezza 5: [0,1,2,3,4,5,6,7]creato da 5 celle usando l' +operatore darebbe [9,9,9,1,0].

punteggio

Regole del golf del codice standard: il codice che produce l'output corretto e ha il minor numero di byte vince.

Bonus: se il tuo codice restituisce / stampa anche la sequenza delle operazioni di piega che porta alla ricompensa massima, moltiplica il tuo punteggio per 0,8. L'output di esempio potrebbe apparire come:

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

Esempi

Metti alla prova il tuo codice utilizzando questi input e risultati, sotto forma di 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

L'output di esempio sotto l'intestazione "Punteggio" non è valido. Dopo aver piegato 5 e 2 sono rimaste solo 3 celle, quindi la piega 3 non ha senso.
Hand-E-Food,

Buon punto. Lo cambierò.
fosgene,

Risposte:


2

Pyth, 31 byte

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

Questo definisce una funzione, yche calcola il valore di piega.

Dimostrazione.

Questo utilizza il metodo recusivo, prendendo il massimo del punteggio di ogni possibile successore.

Il caso base della ricorsione viene implementato concatenando l'input ai valori ordinati dei possibili successori e prendendo quindi la fine dell'elenco risultante. Se c'è solo 1 elemento nell'input, non ci sono successori, e quindi la fine della lista è l'unico elemento nell'input.


È difficile immaginare che questo venga battuto. Forse CJam ha una possibilità?
fosgene,

2

C #, 275 272 byte

È semplicemente una funzione ricorsiva che attraversa ogni ramo e restituisce il punteggio migliore.

Rientrato per chiarezza:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.