東大理三生のプログラミング奮闘記

初心者プログラマーが半年間でどれだけ成長するか!についてのブログです。勉強方法とか使った本とかについて書いていくと思います!プログラミングをもっと身近に感じてもらえたら嬉しいです!毎日更新を目指します!

2017年東大理系数学をpythonで解いてみた!

昨日、今日で東大入試がありましたね!

受験生の方、受験お疲れ様でした。


せっかくなので、数学の問題をpythonで解いてみよう!ということで解いてみました!


pythonの機能(ライブラリ)がまだ全然使いこなせないので、今回は第2問(確率)だけを解いてみました。


(問題)
f:id:gragragrao:20170226144148p:plain

(解答)

# 2017年 東大数学 理系

# 第2問

import itertools
from fractions import Fraction

move_pattern = ["a", "b", "c", "d"]
move_command = list(itertools.product(move_pattern, repeat=6))

whole_event = 4 ** 6
counter_1 = 0
counter_2 = 0

for command in move_command:
    coordinate = [0, 0]
    for s in command:
        if s == "a":
            coordinate[0] += 1
        if s == "b":
            coordinate[0] -= 1
        if s == "c":
            coordinate[1] += 1
        if s == "d":
            coordinate[1] -= 1
    if coordinate[0] == coordinate[1]:
        counter_1 += 1

prob_1 = Fraction(counter_1, whole_event)
print("the answer of (1) is {}".format(prob_1))


for command in move_command:
    coordinate = [0, 0]
    for s in command:
        if s == "a":
            coordinate[0] += 1
        if s == "b":
            coordinate[0] -= 1
        if s == "c":
            coordinate[1] += 1
        if s == "d":
            coordinate[1] -= 1
    if coordinate[0] == 0 and coordinate[1] == 0:
        counter_2 += 1

prob_2 = Fraction(counter_2, whole_event)
print("the answer of (2) is {}".format(prob_2))

見やすいように、同じ処理を設問ごとに書いているので少し冗長になっていますが、ちゃんと動きます。

4048個のループが2回、全部で10000回ぐらいの処理なので工夫なしでやっても計算の時間は全然早いです。
(最初のitertoolsでcommand_listを作った時の処理も入れたら15000回ぐらい??)


計算結果はこれです

f:id:gragragrao:20170226144205p:plain


解答速報と照らし合わせてもあっていますね!


こうやって実際にpythonが使えるのを見ると面白いですよね〜

気が向いたら他の問題もやって見ます。


それでは〜〜