Sebagian besar aplikasi kalkulator tip hanya mengambil persentase datar dari harga makanan. Jadi, misalnya, jika makanan Anda adalah $ 23,45, Anda dapat memberikan tip 15% = $ 3,52, atau tip 20% yang lebih murah hati = $ 4,69.
Cukup nyaman untuk pengguna kartu kredit. Tetapi tidak demikian halnya jika Anda lebih suka meninggalkan tips uang tunai, dalam hal ini jumlah aneh ini menghalangi. Jadi, mari modifikasi ide agar lebih nyaman bagi pengguna uang tunai.
Tugas Anda
Tulis, sesedikit mungkin byte, program atau fungsi yang mengambil input:
- Harga makanan
- Persentase tip minimum
- Persentase tip maksimum
Dan hasilkan jumlah tip dalam kisaran [harga * min_percentage / 100, harga * max_percentage / 100] yang meminimalkan jumlah tagihan / uang kertas dan koin yang diperlukan.
Asumsikan denominasi moneter AS sebesar 1 ¢, 5 ¢, 10 ¢, 25 ¢, $ 1, $ 5, $ 10, $ 20, $ 50, dan $ 100.
Contoh
Berikut adalah contoh program non-golf dengan Python:
import math
import sys
# Do the math in cents so we can use integer arithmetic
DENOMINATIONS = [10000, 5000, 2000, 1000, 500, 100, 25, 10, 5, 1]
def count_bills_and_coins(amount_cents):
# Use the Greedy method, which works on this set of denominations.
result = 0
for denomination in DENOMINATIONS:
num_coins, amount_cents = divmod(amount_cents, denomination)
result += num_coins
return result
def optimize_tip(meal_price, min_tip_percent, max_tip_percent):
min_tip_cents = int(math.ceil(meal_price * min_tip_percent))
max_tip_cents = int(math.floor(meal_price * max_tip_percent))
best_tip_cents = None
best_coins = float('inf')
for tip_cents in range(min_tip_cents, max_tip_cents + 1):
num_coins = count_bills_and_coins(tip_cents)
if num_coins < best_coins:
best_tip_cents = tip_cents
best_coins = num_coins
return best_tip_cents / 100.0
# Get inputs from command-line
meal_price = float(sys.argv[1])
min_tip_percent = float(sys.argv[2])
max_tip_percent = float(sys.argv[3])
print('{:.2f}'.format(optimize_tip(meal_price, min_tip_percent, max_tip_percent)))
Beberapa input dan output sampel:
~$ python tipcalc.py 23.45 15 20
4.00
~$ python tipcalc.py 23.45 15 17
3.55
~$ python tipcalc.py 59.99 15 25
10.00
~$ python tipcalc.py 8.00 13 20
1.05
a program that takes as input (stdin, command-line arguments, or GUI input box, whichever is most convenient in your language)
Apakah ini dimaksudkan untuk mengesampingkan default kami untuk input dan output? Yaitu, apakah mis. Suatu fungsi yang mengambil tiga angka dan mengembalikan hasilnya diizinkan?3.51
dan3.75
juga keluaran yang valid untuk kasus uji23.45 15 17
? Mereka menggunakan jumlah koin yang sama dan juga berada di dalam jangkauan.Jawaban:
Arang , 60 byte
Cobalah online! Mengambil input sebagai desimal. Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukkan tagihan.
Masukkan fraksi desimal tip dan hitung minium dan tip maksimum.
Mulailah dengan nol tip.
String SEXy mengembang
10050.20.10.5.01.0.250.1.05.01
yang dipecah menjadi kelompok-kelompok tiga karakter dan dilemparkan ke float.Tambahkan sebanyak mungkin denominasi saat ini untuk mencapai ujung minimum.
Hapus satu denominasi jika ujung maksimal telah terlampaui.
Format ujung untuk tampilan.
sumber
I
bukan﹪%.2f
.JavaScript (ES6), 93 byte
Cobalah online!
Bagaimana?
Kami secara rekursif menghitung jumlah nilai tagihan / koin hingga masuk dalam kisaran yang dapat diterima, selalu mencoba nilai tertinggi terlebih dahulu.
sumber
Python 3.x:
266185 byteModifikasi langsung ke contoh program saya di pertanyaan. Perhatikan bahwa output tidak lagi diformat sehingga membutuhkan 2 tempat desimal.
Sunting: Terima kasih kepada Jo King karena membuatnya lebih kecil.
sumber
Java 10,
186185 byteMengambil persentase minimum dan maksimum sebagai
/100
desimal (yaitu15%
sebagai0.15
).-1 byte untuk memperbaiki masalah dengan
3.51
potensi keluaran dan bermain golf cara untuk memperbaiki kesalahan pembulatan sebesar 1 byte pada saat yang sama.Cobalah online.
Penjelasan:
sumber
Bersih ,
207156 byteBertukar dengan fungsi menyimpan 51 byte, tidak mengejutkan.
Cobalah online!
sumber
Python (
264222 byte)Sedikit lebih golf.
Cobalah secara Online!
sumber
Perl 6 ,
93 9289 byteCobalah online!
Blok kode anonim yang mengambil tiga argumen (harga, persentase minimum, dan persentase maksimum) dan mengembalikan tip.
sumber
Bahasa Wolfram (Mathematica) , 105 byte
Ini akan memberikan semua solusi dengan jumlah koin minimal.
Cobalah online!
sumber
Kotlin , 215 byte
Cobalah online!
sumber
Jelly ,
3332 byteTautan monadik yang menerima daftar
[cost in cents, [minimum ratio, maximum ratio]]
yang menghasilkan jumlah tip dalam sen.Cobalah online!
Bagaimana?
Baris pertama adalah Tautan pembantu yang menghasilkan jumlah yang diberikan lebih sedikit dari uang kertas / koin denominasi terbesar:
Jumlah panggilan yang diperlukan untuk mencapai nol digunakan untuk mengurutkan kisaran jumlah tip, dan kemudian yang paling kiri dihasilkan:
sumber