旅行に行った時、Aちゃんはレンタカー代を払って、Bくんは宿代を払って、Cちゃんはご飯代を払って。。。とやっていくと最終的に誰が誰にいくら払えば良いのか分からなくなるやつありますよね??
LINEノートに書き込んでおいて帰り道に清算、、、とかやっていましたが、毎回四苦八苦していました。
友達がそれぞれ自分の立替額を入力すれば自動で決算してくれるアプリ、それも、友達にアプリをインストールしてもらう必要がなくて手軽に使えるやつ、、、
と考えると、Line botでやってくれれば良いじゃん、となったわけです。
これからは旅行に行く仲間とのLINEグループにLine botを招待して、じゃあ全員何か払ったらここに入力してね、と言うだけ!
みんな使ってくれるといいな。
割り勘計算プログラム
一番悩んだのは一人では初めてやるLine botの接続でしたが、とりあえず割り勘計算のプログラムを公開します。
使っているのは単純な四則演算。
いつも自分で立替計算するときのやり方を順番に思い出せば書けました。
user_listは['Aちゃん', 'Bくん', 'Cちゃん']といったユーザーのリスト、bill_listは[100,200,100]とA,B,Cがそれぞれ払った金額が格納されたリストです。
(辞書型で持てば?という話はある)
趣味程度のプログラミング力なので綺麗に書けている気はしませんが、、、まあ機能はしていそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
def warikan(user_list, bill_list): #一人当たりいくら払えば良いのか計算 total=0 for bill in bill_list: total = total + bill #人数で割り切れなかったあまりは募金させる bokin = total%len(user_list) #一人当たりの支払額 one = int((total-bokin)/len(user_list)) #払いすぎている人はover_pay dict, もっと払う必要がある人はless_pay dictに入れる #一人当たりの支払額との差分を人別に保存しておく over_pay = {} less_pay = {} for m in range(len(bill_list)): sa = one - bill_list[m] if sa < 0: over_pay[user_list[m]]=sa elif sa > 0: less_pay[user_list[m]]=sa #払いすぎている人の過分を払っていなさすぎる人の差分で埋めていく comment = ['一人当たり'+str(one)+'円'] for o_key in over_pay: while over_pay[o_key]*-1 > bokin: for l_key in less_pay: while over_pay[o_key]*-1 > bokin and less_pay[l_key] > bokin: if less_pay[l_key] <= over_pay[o_key]*-1: deal = int(less_pay[l_key]) com = l_key + '-->' + o_key + ':' + str(deal) comment.append(com) over_pay[o_key]=over_pay[o_key]+deal less_pay[l_key]=less_pay[l_key]-deal else: deal = int(over_pay[o_key]*-1) com = l_key + '-->' + o_key + ':' + str(deal) comment.append(com) over_pay[o_key]=over_pay[o_key]+deal less_pay[l_key]=less_pay[l_key]-deal if bokin > 0: comment.append(str(bokin)+'円は募金') return comment |
この関数を持っておけばこんな感じに機能します
1 2 3 4 5 |
user_list = ['A', 'B', 'C'] bill_list = [100,200,100] comment = warikan(user_list, bill_list) print(comment) #['一人当たり133円', 'A-->B:33', 'C-->B:33', '1円は募金'] |
ちょっと人数が増えても頑張れる
1 2 3 4 5 |
user_list = ['A', 'B', 'C','d','e','f','g'] bill_list = [100,200,100,100,50,10,900] comment = warikan(user_list, bill_list) print(comment) #['一人当たり208円', 'A-->g:108', 'B-->g:8', 'C-->g:108', 'd-->g:108', 'e-->g:158', 'f-->g:198', '4円は募金'] |
こういうの頭の体操っぽくて好きだなー。