Battery IncludedなPythonの魅力
宝くじで何億円も当たったら、
今回は
全部で18人の方々からご応募いただき、
Pythonでの出題だったのは、
架空の売り上げ枚数を生成するためのポイント
売り上げの数については、
1 何口売れるか、20万~30万口という幅の中から、それらしい数字が選ばれるような仕組みを考えてみてください。
なんともあいまいな書き方ですが、
正規分布についてはWebにもくわしい情報がたくさんあるで、
たとえば以下のように記述することで、
>>> random.gauss(250000,50000/3.0)
260870.83563410284
確率変数なので、
これは、 中には、 randomモジュールには、 今回の問題のために用意した架空の宝くじ 架空の販売くじは、 これは、 18人の応募者のうち最多の6人がこの方法を採用していました。 当たり判定の後、 これを使えば、 これで とすると、 collections. 今回は、 数字のカンマ区切りは、 今回のようにお金を扱っている場合、 大きな数字に限りませんが、 当籤準備金は、 18人の解答者の中でお1人だけ、 端数をどうするのか、 ここで便利なのが、 プログラミングには、 次々にアルゴリズムが浮かんでくる天才ハッカーは別として、 ところで、当たり判定と結果をまとめるコードはどう書くか
>>> import collections
>>> collections.Counter([0,0,0,1,1,2])
Counter({0: 3, 1: 2, 2: 1})
def loto_check(mine,hit):
return len(set(hit).intersection(set(mine)))
result = collections.Counter([loto_check(v,jackpot) for v in lotog_sales])
# jackpotは当たりくじ、lotog_salesは5個の数字のリストを要素にもつリスト型
result[5]
大きな数字はわかりやすい表示に
>>> val = 200000000
>>> locale.setlocale(locale.LC_MONETARY,'ja_JP')
>>> print(locale.currency(val,grouping=True))
¥200,000,000
端数の問題をどう処理するか
>>> divmod(10,3)
(3, 1)
Pythonには便利な道具がたくさん
解答例
#!/usr/bin/env python
# coding: utf-8
'''
Python2.7での実行を想定しています。
'''
import random
import argparse
import collections
import locale
locale.setlocale(locale.LC_MONETARY,'ja_JP')
def money_fmt(val):
'''
金額を少し見やすくします。
'''
return locale.currency(val,grouping=True)
def loto():
'''
一つ分のくじを返します
'''
return random.sample(range(1,41),5)
def loto_check(mine,hit):
'''
当たり判定用の関数(一致している数字の個数を返す関数)
'''
return len(set(hit).intersection(set(mine)))
if __name__ == '__main__':
parser = argparse.ArgumentParser('LOTO-Gで一山当てるプログラム')
parser.add_argument('-m','--myloto', nargs=5, type=int, help='1から40までの数字から5つを選んで、スペース区切り入力してください。',required=True)
parser.add_argument('-n','--num', type=int, help='購入する口数を指定してください。',default=1)
args = parser.parse_args()
# 今回の売り上げ口数を決定(これで99.7%が200,000から300,000にはいります)
amount = int(random.gauss(250000,50000/3.0))
# 架空の宝くじ販売を作る
lotog_sales = []
for i in range(amount):
lotog_sales.append(loto())
# 自分のくじを追加
for i in range(args.num):
lotog_sales.append(args.myloto)
# 今回の当たりを生成
jackpot = loto()
# 各当籤口数の計算
result = collections.Counter([loto_check(v,jackpot) for v in lotog_sales])
# 総売上
total = 500 * len(lotog_sales)
# 胴元の取り分(このあと端数を追加)
bookmaker = int(total * 0.4)
# 当籤準備金
refund = total - bookmaker
# 分配率を保持する辞書型
rate = {1:2, 2:3, 3:6}
# 結果の出力
jackpot.sort()
print('今回の当選番号は「{}」です。'.format(' '.join([str(v) for v in jackpot])))
# 当選金の分配
for i in range(1,4):
_reserve = divmod(refund,rate[i])
bookmaker += _reserve[1] #端数は胴元が持って行くことにします。
n = result[5-i+1] #当籤口数
if n:
prize = divmod(_reserve[0],n)
print('{}等({}口) 当籤金額は{}です。'.format(i,n,money_fmt(prize[0])))
bookmaker += prize[1]
else:
print('{}等の当籤はありません。'.format(i))
print('総売上は{}でした。'.format(money_fmt(total)))
print('主催者の取り分は{}でした。'.format(money_fmt(bookmaker)))
my_hit = loto_check(args.myloto,jackpot)
if my_hit in (0,1,2):
print('あなたは、はずれー')
else:
print('あなたは、{}等に当籤!'.format(6-my_hit))