Tantangannya adalah untuk menemukan jumlah maksimum yang bisa Anda dapatkan dari daftar bilangan bulat menggunakan operator aritmatika dasar (penambahan, substraksi, perkalian, negasiasi unary)
Memasukkan
Daftar bilangan bulat
Keluaran
Hasil maksimal menggunakan setiap bilangan bulat dalam intput.
Urutan input tidak masalah, hasilnya harus sama.
Anda tidak perlu menampilkan operasi penuh, hanya hasilnya.
Contohnya
Input : 3 0 1
Output : 4 (3 + 1 + 0)
Input : 3 1 1 2 2
Output : 27 ((2+1)*(2+1)*3))
Input : -1 5 0 6
Output : 36 (6 * (5 - (-1)) +0)
Input : -10 -10 -10
Output : 1000 -((-10) * (-10) * (-10))
Input : 1 1 1 1 1
Output : 6 ((1+1+1)*(1+1))
Aturan
Kode terpendek menang
Berlaku "celah" standar
Anda hanya dapat menggunakan + * - operator (penambahan, perkalian, substraksi, negasiasi unary)
Kode harus berfungsi selama hasilnya dapat disimpan pada Integer 32 bit.
Setiap perilaku overflow terserah Anda.
Saya harap ini cukup jelas, ini adalah saran tantangan Code Golf pertama saya.
code-golf
math
arithmetic
CNicolas
sumber
sumber
Jawaban:
C - 224 byte - Waktu berjalan O (n)
Sangat lucu melihat hanya solusi waktu eksponensial untuk masalah waktu linear, tetapi saya kira itu adalah cara logis untuk melanjutkan karena tidak ada poin bonus untuk benar-benar memiliki algoritma, yang merupakan anagram logaritma.
Setelah mengonversi angka negatif ke angka positif dan nol, jelas kami lebih tertarik pada perkalian. Kami ingin memaksimalkan logaritma angka terakhir.
log (a + b) <log (a) + log (b) kecuali ketika a = 1 atau b = 1, jadi itu adalah satu-satunya kasus di mana kami tertarik untuk menambahkan sesuatu bersama-sama. Secara umum lebih baik menambahkan 1 ke angka yang lebih kecil, karena hal itu menyebabkan peningkatan logaritma yang lebih besar, yaitu peningkatan persentase yang lebih besar, daripada menambahkan 1 ke angka yang besar. Ada empat skenario yang mungkin, yang dipesan paling tidak disukai, untuk memanfaatkannya:
Program ini melacak jumlah yang, jumlah dua, dan jumlah minimum lebih besar dari 2, dan mencatat daftar cara yang paling tidak disukai untuk menggunakan yang. Akhirnya, itu mengalikan semua angka yang tersisa.
sumber
Haskell, 126 karakter
ini hanya brute-forcing, dengan pengecualian mengabaikan tanda input dan mengabaikan pengurangan dan negasi unary.
kode ini sangat lambat. kode menghitung f secara rekursi pada setiap urutan input empat kali (kecuali untuk [] dan input itu sendiri) . tapi hei, ini kode golf.
sumber
SWI-Prolog - 250
Oh nak, aku menghabiskan terlalu lama untuk ini.
Dipanggil dari baris perintah (mis.):
(Tanpa alasan tertentu, saya merasa luar biasa karena fungsi golf saya menyebut "pot tomat.")
Versi tidak disatukan:
Penjelasan:
ignore
atau\+
) untuk membiarkan predikat keseluruhan kembalitrue
dan melanjutkan.is
dan kemudian tulis.sumber
Scala, 134
Tidak dikoleksi & berkomentar:
Pendekatan yang sedikit berbeda, dari menyadari bahwa jawaban terbesar selalu dapat dinyatakan sebagai produk penjumlahan.
Begitu dekat, tetapi sekelompok kebodohan perpustakaan (permutasi mengembalikan Iterator bukannya Seq, inferensi tipe mengerikan pada urutan kosong, Array.update kembali Unit) lakukan saya.
sumber
Python 278 (O (n!))
Penjelasan
sumber
Haskell -
295 290 265 246 203 189182 byteAkhirnya berhasil! Juga sekarang ini adalah kekuatan kasar daripada solusi dinamis.
Terima kasih kepada proudhaskeller untuk beberapa tips bermain golf.
Ini mungkin bukan solusi yang sepenuhnya golf karena saya benar-benar payah dalam bermain golf, tetapi ini adalah yang terbaik yang bisa saya lakukan (dan itu terlihat rumit, jadi saya dapat hal itu untuk saya):
Kasus uji baru:
Penjelasan solusi:
The
main
Fungsi hanya mendapat masukan dan berjalang
dengan itu.g
mengambil input dan mengembalikan maksimal semua kemungkinan kombinasi jumlah dan daftar pesanan.#
adalah fungsi yang menghitung jumlah dalam daftar seperti ini:sumber
;
jika memungkinkan? itu tidak mengubah jumlah byte tetapi membantu keterbacaan dengan sangat luar biasad n=[0,2,1]!!n
ataud n=mod(3-n)3
. 3) membuato
dang
mengambil panjang daftar alih-alih mengambil daftar itu sendiri, karena mereka hanya bergantung pada panjangnya (jelas ini hanya berdiri selama mereka tidak digarisbawahi). 4) gantiotherwise
dengan0<1
. 5) membuat definisi terakhir dari r ber$o x:y
. 6) hapusa@
dan ganti denganx:y
. semoga sukses dengan bermain golf Anda!GolfScript (52 karakter)
Demo online
Analisis feersum cukup bagus tetapi bisa diambil lebih jauh jika tujuannya adalah bermain golf daripada efisiensi. Dalam pseudo-code:
sumber