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:
menggunakan salah satu tambahan, yang akan menghasilkan ini:
atau multiplikasi, yang akan menghasilkan ini:
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
Jawaban:
Pyth, 31 byte
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.
sumber
C #,
275272 byteIni hanyalah fungsi rekursif yang melintasi setiap cabang dan mengembalikan skor terbaik.
Diindentasi untuk kejelasan:
sumber