Berkerut untuk Loot

12

pengantar

Setelah pertempuran panjang, Anda telah berhasil mengalahkan Sphinx dalam kontes teka-teki. Sphinx, terkesan dengan keahlian Anda, ingin memberi Anda hadiah yang sepadan dengan kepintaran Anda, dan memunculkan selembar perkamen ajaib yang terbagi menjadi delapan kotak, masing-masing berisi angka.

"Perkuat perkamen," kata Sphinx, "sehingga kotak-kotak itu tumpang tindih, dan kotak-kotak itu akan bergabung baik melalui penambahan atau perkalian. Ketika satu kotak tersisa, nilainya akan menjadi hadiahmu dalam koin emas."

Tugas

Anda harus menulis sebuah program atau fungsi yang mengambil input daftar / array / apa pun dari delapan bilangan alami, dan mengembalikan / mencetak hadiah maksimum yang mungkin diperoleh melalui serangkaian operasi 'lipatan'.

Mekanika

Operasi 'lipatan' dilakukan pada sejumlah sel, dan dengan salah satu +atau *sebagai operator. Sel n pertama dari daftar dilipat dan digabung dengan sel tujuan menggunakan operator. Setiap sel yang tidak dikonsumsi dalam operasi gabungan dibiarkan tidak dimodifikasi.

Berikut adalah contoh pengerutan menggunakan n = 3 sel:

masukkan deskripsi gambar di sini

menggunakan salah satu tambahan, yang akan menghasilkan ini:

masukkan deskripsi gambar di sini

atau multiplikasi, yang akan menghasilkan ini:

masukkan deskripsi gambar di sini

Catatan: Untuk kesederhanaan, pengerutan dengan kurang dari 1 sel tidak diizinkan, seperti halnya pengerutan dengan jumlah sel lebih besar dari atau sama dengan panjang daftar. Namun, suatu daftar dapat dengan bertambah lebih dari setengah jumlah selnya.

Daftar 8 sel dapat dikerutkan dengan 5, menghasilkan daftar panjang baru 5: [0,1,2,3,4,5,6,7]dikerutkan oleh 5 sel menggunakan +operator akan memberikan [9,9,9,1,0].

Mencetak gol

Aturan golf kode standar - kode yang menghasilkan output yang benar dan memiliki jumlah byte paling sedikit yang menang.

Bonus: Jika kode Anda juga mengembalikan / mencetak urutan operasi lipatan yang mengarah ke hadiah maksimal, kalikan skor Anda dengan 0,8. Contoh output mungkin terlihat seperti:

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

Contohnya

Uji kode Anda menggunakan input dan hasil ini, dalam bentuk 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
fosgen
sumber
Output contoh di bawah tajuk "Penilaian" tidak valid. Setelah kusut 5 dan 2 hanya ada 3 sel yang tersisa, jadi kusut 3 tidak masuk akal.
Hand-E-Food
Poin yang bagus. Saya akan mengubahnya.
phosgene

Jawaban:

2

Pyth, 31 byte

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

Ini mendefinisikan fungsi y,, yang menghitung nilai lipatan.

Demonstrasi.

Ini menggunakan metode recusive, mengambil skor maksimum dari setiap penerus yang mungkin.

Kasus dasar rekursi diimplementasikan dengan menggabungkan input ke nilai yang diurutkan dari calon penerus, dan kemudian mengambil akhir dari daftar yang dihasilkan. Jika hanya ada 1 elemen dalam input, tidak ada penggantinya, dan oleh karena itu akhir daftar adalah satu elemen dalam input.

isaacg
sumber
Sulit membayangkan ini dipukuli. Mungkin CJam punya peluang?
phosgene
2

C #, 275 272 byte

Ini hanyalah fungsi rekursif yang melintasi setiap cabang dan mengembalikan skor terbaik.

Diindentasi untuk kejelasan:

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;
}
Makanan Tangan
sumber