Di Kanada, sen tidak lagi diedarkan. Pembayaran tunai dibulatkan ke 5 sen terdekat.
Uang dapat dihemat dengan memisahkan pembelian. Sebagai contoh, dua item $ 1,02 berharga $ 2,04 yang membulatkan hingga $ 2,05, tetapi ketika membeli item dalam pembelian terpisah, masing-masing putaran harga menjadi $ 1,00 dengan total $ 2,00. Namun, ketika membeli dua item masing-masing dengan $ 1,03, lebih baik membelinya dalam satu pembelian.
Cara lain untuk menghemat uang adalah menggunakan kartu kredit ketika pembulatan tidak menguntungkan, karena pembayaran kredit tidak dibulatkan. Jika kita menginginkan dua item $ 1,04, total harga akan mencapai $ 2,10 terlepas dari bagaimana kita membagi pembelian. Karena itu, kita harus membayar barang-barang ini dengan kartu kredit.
Tulis fungsi atau program yang menerima daftar harga barang sebagai bilangan bulat dalam sen dan output harga total serendah mungkin (dalam sen) untuk barang-barang yang dapat dicapai melalui urutan pembelian, masing-masing baik secara tunai atau kredit.
Kode terpendek menang.
Uji kasus
[] : 0
[48] : 48
[92, 20] : 110
[47, 56, 45] : 145
[55, 6, 98, 69] : 225
[6, 39, 85, 84, 7] : 218
[95, 14, 28, 49, 41, 39] : 263
[92, 6, 28, 30, 39, 93, 53] : 335
[83, 33, 62, 12, 34, 29, 18, 12] : 273
[23, 46, 54, 69, 64, 73, 58, 92, 26] : 495
[19, 56, 84, 23, 20, 53, 96, 92, 91, 58] : 583
[3, 3, 19, 56, 3, 84, 3, 23, 20, 53, 96, 92, 91, 58, 3, 3] : 598
[2, 3, 4, 4, 4, 4, 4] : 19
s.reduce(:+)
(biasanya Anda bahkan tidak perlu paranthes, tetapi dalam kasus Anda ...) dan sebarism
untuk 2 karakter tambahan.a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
.0,
darireduce
panggilan, kode istirahat untuk input kosong. Saya memang menyebutkan itu dalam jawabannya. Inlining m sepertinya tidak membantu. Terima kasih atas saran terakhir - itu bodoh dari saya.(c-m=c>d ?d:c)
yang memberi Anda dua karakter.-
memiliki prioritas lebih tinggi daripada=
. Apakah tugas itu memiliki prioritas tinggi di sisi kirinya (seperti pada, untuk memastikan operan kiri adalah nilai lebih)?GolfScript (54 karakter)
Ini adalah program yang mengambil input dari stdin sebagai nilai yang dipisahkan oleh ruang. Satu karakter dapat disimpan dengan memaksa format input bukan sebagai array GolfScript.
Uji kasus secara online
Trik yang paling menarik adalah
.2$>$
untukmin
operator yang tidak merusak .Analisis matematika saya pada dasarnya sama dengan analisis Jan dan Ray: mengingat nilai mod 5, satu-satunya penghematan adalah pada transaksi bernilai 1 atau 2. Opsi kartu kredit berarti bahwa kita tidak pernah berhasil. Jadi item yang harganya 5n + 2 sen tidak bisa mendapatkan keuntungan dari bundling; item tidak dapat bernilai 5n + 1 sen (karena menggabungkan dua tabungan 1 sen ke dalam tabungan 2 sen tidak memberikan manfaat apa pun). 0 adalah identitas aditif, jadi satu-satunya kasus yang menarik melibatkan nilai 3 dan 4.
3+3 = 1
dan3+4 = 4+4+4 = 2
; jika kita memiliki 3s campuran dan 4s kemudian kita mengoptimalkan oleh lebih memilih3+4
lebih3+3
(ketat baik) atau4+4+4
(setara).sumber
~):m
) sayangnya tanpa pengurangan dalam jumlah char.C ++: 126 karakter
Selamat memberikan panduan untuk membuat program ini menjadi lebih pendek. Berikut adalah program pengujian, kompilasi dengan tdm-gcc 4.7.1 compiler dan jalankan secara normal.
sumber
R 143
Tes (di mana
P
alias untuk kode di atas)sumber
Mathematica
112 126 167157Sunting : Kasing {3, 3} dan {4,4,4} sekarang ditangani berkat Peter Taylor dan cardboard_box.
Catatan: Non-pembelian (test case # 1) dimasukkan sebagai
f[{0}]
.Bagaimana itu bekerja
Mod[n, 5]
kemudian diproses: 1's dan 2's menjadi 0's. Nol tetap tidak berubah.Pengujian
a12
menyesuaikan untuk {3,3}a13
menyesuaikan untuk {4,4,4}sumber
Python 3 (115 karakter)
Python 2 (106 karakter)
sumber
[3,4,9]
harus diberikan14
, karena Anda dapat menggabungkan item 3 dan 4 sen untuk mendapatkan pembelian 7 sen yang Anda bayar tunai dengan 5 sen, dan sisa item 9 sen yang Anda bayar dengan kredit karena jika tidak maka akan dibulatkan.1, 2, 3, 4, 5, 6, 7, 8, 9, 10
, ini memberi0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0
, yang merupakan jumlah46.66
. Namun, jawaban yang benar adalah45
, jadi jumlah angka yang Anda cetak bukanlah jawaban yang benar, dan karenanya solusi ini salah.APL, 58 karakter
Program ini pada dasarnya adalah terjemahan langsung dari solusi Ruby Jan Dvorak .
⍬
adalah vektor kosong.sumber
Julia 83C
Penjelasan:
Dalam satu pembelian, Anda dapat menyimpan paling banyak 2 sen.
Jadi, jika Anda memiliki kombinasi yang dapat menghemat 2 sen, beli saja dengan cara itu dan itu akan menjadi optimal. Misalnya, jika Anda memilikix
item dengan harga 3 (mod 5) dany
item dengan harga 4 (mod 5), Anda dapat membuatmin(x, y)
jumlah (3, 4) pasangan, yang menghemat Anda2 min(x, y)
sen. Kemudian Anda menggunakan 3 sisanya, jika ada, untuk menghematmax(0, x-min(x,y)) / 2
sen Anda . Ini juga dapat dihitung dengan(max(x,y)-y)/2
Edit
Solusi ini salah.
sumber
4 4 4 3 3
kemudian4 4 4
adalah kombinasi yang dapat menghemat 2 sen, tetapi membeli dengan cara yang tidak optimal. (Sebenarnya, Anda tampaknya tidak4 4 4
mempertimbangkan sama sekali. Bukankah kode ini gagal dalam ujian terakhir?)