2011年05月28日

たけしのコマ大数学科 合計値を「0,3,6,9」とせず0-4の全5札を取出す確率

 文字数を最大限に絞ると上の様な表題になるが、たけしのコマ大数学科「マジックナンバーに挑戦」が本日のお題である。今年の神戸大学文系入試問題だったものとのことである。例によって、今回も、Python君にたけしのコマ大 数学研究会の体育会系手法で、全順列を書出させるマゾ的解答例である。試験会場でYahoo知恵袋に質問するくらいなら、この様なプログラムをPC持込みで書き、堂々とプリントアウトしてプログラムも込みで答案用紙に貼り付けて提出して試て欲しいものだ。
 無論、今は無理でも何れそんな大学入試をするとこが出て欲しいものだ。試験と言う枠て合格する為に磨く記憶力と要領で社会での活動能力が計れるものでもないし、多機能スマホを多くの社会人が持つ様になる時代の社会インフラと試験インフラにギャップを設ける必要はないと思うのはmireだけだろうか。mireの記憶力と計算力はとても乏しい。それで入試には苦労した記憶があるし、それが動機でPCを始めたクチなので恨みに近い感情さえあるのも確かだが、紙と鉛筆は使って良いのなら、その幅が目的により拡がってもなんらおかしくない筈だ。

 さて、お題に戻ろう。問題文は、以下の通りである。

たけしのコマ大数学科
袋の中に0から4迄書かれたカードが1枚ずつ合計5枚ある。
4つの数字「0・3・6・9」をマジックナンバーと呼ぶ時
以下のルールで独りでゲームを行い勝つ確率を求めなさい。

ルール
★袋から無作為に1枚ずつカードを取出す
★取出したカードの数字の合計がマジックナンバーになったら
その時点で負けとし、それ以降はカードを取出さない
★途中で負けなく全てのカードを取出せたら勝ちとする。


 文系の数学問題であるとの前提であれば、この確率は、カード5枚を取出す際の全順列の内で
取出したカードの数の累計値がマジックナンバー「0・3・6・9」とならずに済む順列がいくつあるかを数えれば済む、何の能力を確かめたいのか判らない、ある意味で気休め的な平凡な入試問題である。文系の数学問題なので、それはそれで、数学得意の受験者には楽勝の有難い問題ではあるのだから、もしmireが当事者なら喜んだことだろうけど(笑)。

 ということで、Python君に想定する答え通りの解答を途中経過も含めて出して頂くプログラムが次のものである。文系の問題で5枚のカードを5枚取出すとあるので、気合いを入れずにそのままfor文を5段に入れ子で書かせて頂いたが、まあ、ここ辺りを変えるなら、関数化し入れ子にする方が良いとも言える。でも、問題が問題なだけに、文系入試の解答に入れ子処理は高度過ぎて実体が読めずに不正解とされても困るので、ベタ書きのままとして置く。気になる人は、終了条件となる取出しカード枚数を引数として、forループ1段を書いた関数を書き、入れ子したその関数の引数にデクレメントし、枚数がゼロになったら抜ける様にすれば良い。

 尚、今回も何故か分数が絡んでしまったので、前回の分数約分用汎用関数をそのままコピペ流用した。入試では駄目でも自分で作った資産流用は実社会ではあって当り前の行為である。


          komadai_card_game.py


#! c:/Python26/python.exe
# -*- coding: UTF-8 -*-
"""
たけしのコマ大数学科 2011.5
【問題】
袋の中に0から4迄書かれたカードが1枚ずつ合計5枚ある。
4つの数字「0・3・6・9」をマジックナンバーと呼ぶ時
以下のルールで独りでゲームを行い勝つ確率を求めなさい。
ルール
★袋から無作為に1枚ずつカードを取出す
★取出したカードの数字の合計がマジックナンバーになったら
その時点で負けとし、それ以降はカードを取出さない
★途中で負けなく全てのカードを取出せたら勝ちとする。

#  この問題には問題がある。数学問題で言えば、カードの組合せの #
# 確率で解答することが常識だろうが、「負けた時はそれ以降カード #
# を取出さない」とのルールを重視すると、時間的な確率を意図する #
# 可能性も秘めている。単位時間での確率と考えるなら1枚引く毎の #
# 時間を基に計算すべきなのだろう。文系受験者にはそんな発想こそ #
# 必要かと思う。横並びの人材より変わった発想で課題にアプローチ #
# 出来る能力こそ入試選抜出来る様に変革すべきではないだろうか? #
"""

def isMagicNumber(cards, sum_lose=[0, 3, 6, 9]):
"""
マジックナンバーと累計値を照合し、勝負けを判定
照合分は1、不照合分は0としてメッセージとのタプル
を返す
"""
sum = 0
msg = ''
for c in cards:
msg += '「%d」' % (c)
sum += c
if sum in sum_lose:
msg += 'を引いて合計が%dとなり、負け。' % (sum)
return 1, msg
msg += '☆勝ち。'
return 0, msg


############################################################
# 汎用関数
def reduction(numerator, denominator):
"""
reduce a fraction: numerator / denominator
分数を約分 : 分子/分母
"""
#print numerator, denominator
mx = max(numerator, denominator) # 分子,分母で大きい方を約分の最大の公約数候補とする
r = range(mx+1)[1:] # 1から最大の公約数候補迄の数字リストを作成
r.reverse() # 逆順に並べ替え
for i in r: # 順番に
if (numerator % i==0) and (denominator % i ==0): # 約数候補を試す
# print '%d/%d' % (numerator/i, denominator/i)
return numerator/i, denominator/i # (分子,2分母)の形のタプルを返す


def str_fraction(t=(0,1)):
"""
returns string of fraction: 't[0] / t[1]'
分数の文字列を返す : '分子/分母'
"""
return '%d/%d' % t


def str_reduced_fraction(t=(0,1)):
"""
returns string of reduced fraction
約分した分数の文字列を返す
"""
return '%d/%d' % reduction(t[0], t[1])

############################################################


sum_lose = [0, 3, 6, 9] # 負けとなる合計値(ゲームルール)
cards = [0,1,2,3,4]
cards0 = cards[:]
cards1 = cards[:]
cards2 = cards[:]
cards3 = cards[:]
cards4 = cards[:]

# 5!となるが「コマ大」的にはこの体育会系解法だろう
cards_sets =[] # カード選択の全組合せ結果を入れる。
cards_set =[] # 5枚のカード選択結果を入れる。

print __doc__
print 'カード順列別に判定すると以下の様になる。'
print 'No. 勝 負 [出現可能順列] その場合の実際の取出しと判定'

alls = loses = wins = 0
for c0 in cards0:
cards1 = cards0[:]
del cards1[cards1.index(c0)]
for c1 in cards1:
cards2 = cards1[:]
del cards2[cards2.index(c1)]
for c2 in cards2:
cards3 = cards2[:]
del cards3[cards3.index(c2)]
for c3 in cards3:
cards4 = cards3[:]
del cards4[cards4.index(c3)]
for c4 in cards4:
cards_set = [c0, c1, c2, c3, c4]
lose, msg = isMagicNumber(cards_set)
alls += 1
loses += lose
if lose==0: wins += 1
print '%3d %2d %2d' % (alls, wins, loses),
print cards_set, msg
#cards_sets.append(cards_set)
cards_set = []
flag = 0
#sum = 0

ans = '解答: %s (勝ち=%d, 負け=%d, 全順列=%d)' % (str_reduced_fraction((wins, alls))
, wins, loses, alls)

print '\n%s' % (ans)
print '========================================'


 このコードを実行すると次の様になる。


D:\blog>python komadai_card_game.py

たけしのコマ大数学科 2011.5
【問題】
袋の中に0から4迄書かれたカードが1枚ずつ合計5枚ある。
4つの数字「0・3・6・9」をマジックナンバーと呼ぶ時
以下のルールで独りでゲームを行い勝つ確率を求めなさい。
ルール
★袋から無作為に1枚ずつカードを取出す
★取出したカードの数字の合計がマジックナンバーになったら
その時点で負けとし、それ以降はカードを取出さない
★途中で負けなく全てのカードを取出せたら勝ちとする。

#  この問題には問題がある。数学問題で言えば、カードの組合せの #
# 確率で解答することが常識だろうが、「負けた時はそれ以降カード #
# を取出さない」とのルールを重視すると、時間的な確率を意図する #
# 可能性も秘めている。単位時間での確率と考えるなら1枚引く毎の #
# 時間を基に計算すべきなのだろう。文系受験者にはそんな発想こそ #
# 必要かと思う。横並びの人材より変わった発想で課題にアプローチ #
# 出来る能力こそ入試選抜出来る様に変革すべきではないだろうか? #

カード順列別に判定すると以下の様になる。
No. 勝 負 [出現可能順列] その場合の実際の取出しと判定
1 0 1 [0, 1, 2, 3, 4] 「0」を引いて合計が0となり、負け。
2 0 2 [0, 1, 2, 4, 3] 「0」を引いて合計が0となり、負け。
3 0 3 [0, 1, 3, 2, 4] 「0」を引いて合計が0となり、負け。
4 0 4 [0, 1, 3, 4, 2] 「0」を引いて合計が0となり、負け。
5 0 5 [0, 1, 4, 2, 3] 「0」を引いて合計が0となり、負け。
6 0 6 [0, 1, 4, 3, 2] 「0」を引いて合計が0となり、負け。
7 0 7 [0, 2, 1, 3, 4] 「0」を引いて合計が0となり、負け。
8 0 8 [0, 2, 1, 4, 3] 「0」を引いて合計が0となり、負け。
9 0 9 [0, 2, 3, 1, 4] 「0」を引いて合計が0となり、負け。
10 0 10 [0, 2, 3, 4, 1] 「0」を引いて合計が0となり、負け。
11 0 11 [0, 2, 4, 1, 3] 「0」を引いて合計が0となり、負け。
12 0 12 [0, 2, 4, 3, 1] 「0」を引いて合計が0となり、負け。
13 0 13 [0, 3, 1, 2, 4] 「0」を引いて合計が0となり、負け。
14 0 14 [0, 3, 1, 4, 2] 「0」を引いて合計が0となり、負け。
15 0 15 [0, 3, 2, 1, 4] 「0」を引いて合計が0となり、負け。
16 0 16 [0, 3, 2, 4, 1] 「0」を引いて合計が0となり、負け。
17 0 17 [0, 3, 4, 1, 2] 「0」を引いて合計が0となり、負け。
18 0 18 [0, 3, 4, 2, 1] 「0」を引いて合計が0となり、負け。
19 0 19 [0, 4, 1, 2, 3] 「0」を引いて合計が0となり、負け。
20 0 20 [0, 4, 1, 3, 2] 「0」を引いて合計が0となり、負け。
21 0 21 [0, 4, 2, 1, 3] 「0」を引いて合計が0となり、負け。
22 0 22 [0, 4, 2, 3, 1] 「0」を引いて合計が0となり、負け。
23 0 23 [0, 4, 3, 1, 2] 「0」を引いて合計が0となり、負け。
24 0 24 [0, 4, 3, 2, 1] 「0」を引いて合計が0となり、負け。
25 0 25 [1, 0, 2, 3, 4] 「1」「0」「2」を引いて合計が3となり、負け。
26 0 26 [1, 0, 2, 4, 3] 「1」「0」「2」を引いて合計が3となり、負け。
27 0 27 [1, 0, 3, 2, 4] 「1」「0」「3」「2」を引いて合計が6となり、負け。
28 1 27 [1, 0, 3, 4, 2] 「1」「0」「3」「4」「2」☆勝ち。
29 2 27 [1, 0, 4, 2, 3] 「1」「0」「4」「2」「3」☆勝ち。
30 3 27 [1, 0, 4, 3, 2] 「1」「0」「4」「3」「2」☆勝ち。
31 3 28 [1, 2, 0, 3, 4] 「1」「2」を引いて合計が3となり、負け。
32 3 29 [1, 2, 0, 4, 3] 「1」「2」を引いて合計が3となり、負け。
33 3 30 [1, 2, 3, 0, 4] 「1」「2」を引いて合計が3となり、負け。
34 3 31 [1, 2, 3, 4, 0] 「1」「2」を引いて合計が3となり、負け。
35 3 32 [1, 2, 4, 0, 3] 「1」「2」を引いて合計が3となり、負け。
36 3 33 [1, 2, 4, 3, 0] 「1」「2」を引いて合計が3となり、負け。
37 3 34 [1, 3, 0, 2, 4] 「1」「3」「0」「2」を引いて合計が6となり、負け。
38 4 34 [1, 3, 0, 4, 2] 「1」「3」「0」「4」「2」☆勝ち。
39 4 35 [1, 3, 2, 0, 4] 「1」「3」「2」を引いて合計が6となり、負け。
40 4 36 [1, 3, 2, 4, 0] 「1」「3」「2」を引いて合計が6となり、負け。
41 5 36 [1, 3, 4, 0, 2] 「1」「3」「4」「0」「2」☆勝ち。
42 6 36 [1, 3, 4, 2, 0] 「1」「3」「4」「2」「0」☆勝ち。
43 7 36 [1, 4, 0, 2, 3] 「1」「4」「0」「2」「3」☆勝ち。
44 8 36 [1, 4, 0, 3, 2] 「1」「4」「0」「3」「2」☆勝ち。
45 9 36 [1, 4, 2, 0, 3] 「1」「4」「2」「0」「3」☆勝ち。
46 10 36 [1, 4, 2, 3, 0] 「1」「4」「2」「3」「0」☆勝ち。
47 11 36 [1, 4, 3, 0, 2] 「1」「4」「3」「0」「2」☆勝ち。
48 12 36 [1, 4, 3, 2, 0] 「1」「4」「3」「2」「0」☆勝ち。
49 12 37 [2, 0, 1, 3, 4] 「2」「0」「1」を引いて合計が3となり、負け。
50 12 38 [2, 0, 1, 4, 3] 「2」「0」「1」を引いて合計が3となり、負け。
51 12 39 [2, 0, 3, 1, 4] 「2」「0」「3」「1」を引いて合計が6となり、負け。
52 12 40 [2, 0, 3, 4, 1] 「2」「0」「3」「4」を引いて合計が9となり、負け。
53 12 41 [2, 0, 4, 1, 3] 「2」「0」「4」を引いて合計が6となり、負け。
54 12 42 [2, 0, 4, 3, 1] 「2」「0」「4」を引いて合計が6となり、負け。
55 12 43 [2, 1, 0, 3, 4] 「2」「1」を引いて合計が3となり、負け。
56 12 44 [2, 1, 0, 4, 3] 「2」「1」を引いて合計が3となり、負け。
57 12 45 [2, 1, 3, 0, 4] 「2」「1」を引いて合計が3となり、負け。
58 12 46 [2, 1, 3, 4, 0] 「2」「1」を引いて合計が3となり、負け。
59 12 47 [2, 1, 4, 0, 3] 「2」「1」を引いて合計が3となり、負け。
60 12 48 [2, 1, 4, 3, 0] 「2」「1」を引いて合計が3となり、負け。
61 12 49 [2, 3, 0, 1, 4] 「2」「3」「0」「1」を引いて合計が6となり、負け。
62 12 50 [2, 3, 0, 4, 1] 「2」「3」「0」「4」を引いて合計が9となり、負け。
63 12 51 [2, 3, 1, 0, 4] 「2」「3」「1」を引いて合計が6となり、負け。
64 12 52 [2, 3, 1, 4, 0] 「2」「3」「1」を引いて合計が6となり、負け。
65 12 53 [2, 3, 4, 0, 1] 「2」「3」「4」を引いて合計が9となり、負け。
66 12 54 [2, 3, 4, 1, 0] 「2」「3」「4」を引いて合計が9となり、負け。
67 12 55 [2, 4, 0, 1, 3] 「2」「4」を引いて合計が6となり、負け。
68 12 56 [2, 4, 0, 3, 1] 「2」「4」を引いて合計が6となり、負け。
69 12 57 [2, 4, 1, 0, 3] 「2」「4」を引いて合計が6となり、負け。
70 12 58 [2, 4, 1, 3, 0] 「2」「4」を引いて合計が6となり、負け。
71 12 59 [2, 4, 3, 0, 1] 「2」「4」を引いて合計が6となり、負け。
72 12 60 [2, 4, 3, 1, 0] 「2」「4」を引いて合計が6となり、負け。
73 12 61 [3, 0, 1, 2, 4] 「3」を引いて合計が3となり、負け。
74 12 62 [3, 0, 1, 4, 2] 「3」を引いて合計が3となり、負け。
75 12 63 [3, 0, 2, 1, 4] 「3」を引いて合計が3となり、負け。
76 12 64 [3, 0, 2, 4, 1] 「3」を引いて合計が3となり、負け。
77 12 65 [3, 0, 4, 1, 2] 「3」を引いて合計が3となり、負け。
78 12 66 [3, 0, 4, 2, 1] 「3」を引いて合計が3となり、負け。
79 12 67 [3, 1, 0, 2, 4] 「3」を引いて合計が3となり、負け。
80 12 68 [3, 1, 0, 4, 2] 「3」を引いて合計が3となり、負け。
81 12 69 [3, 1, 2, 0, 4] 「3」を引いて合計が3となり、負け。
82 12 70 [3, 1, 2, 4, 0] 「3」を引いて合計が3となり、負け。
83 12 71 [3, 1, 4, 0, 2] 「3」を引いて合計が3となり、負け。
84 12 72 [3, 1, 4, 2, 0] 「3」を引いて合計が3となり、負け。
85 12 73 [3, 2, 0, 1, 4] 「3」を引いて合計が3となり、負け。
86 12 74 [3, 2, 0, 4, 1] 「3」を引いて合計が3となり、負け。
87 12 75 [3, 2, 1, 0, 4] 「3」を引いて合計が3となり、負け。
88 12 76 [3, 2, 1, 4, 0] 「3」を引いて合計が3となり、負け。
89 12 77 [3, 2, 4, 0, 1] 「3」を引いて合計が3となり、負け。
90 12 78 [3, 2, 4, 1, 0] 「3」を引いて合計が3となり、負け。
91 12 79 [3, 4, 0, 1, 2] 「3」を引いて合計が3となり、負け。
92 12 80 [3, 4, 0, 2, 1] 「3」を引いて合計が3となり、負け。
93 12 81 [3, 4, 1, 0, 2] 「3」を引いて合計が3となり、負け。
94 12 82 [3, 4, 1, 2, 0] 「3」を引いて合計が3となり、負け。
95 12 83 [3, 4, 2, 0, 1] 「3」を引いて合計が3となり、負け。
96 12 84 [3, 4, 2, 1, 0] 「3」を引いて合計が3となり、負け。
97 13 84 [4, 0, 1, 2, 3] 「4」「0」「1」「2」「3」☆勝ち。
98 14 84 [4, 0, 1, 3, 2] 「4」「0」「1」「3」「2」☆勝ち。
99 14 85 [4, 0, 2, 1, 3] 「4」「0」「2」を引いて合計が6となり、負け。
100 14 86 [4, 0, 2, 3, 1] 「4」「0」「2」を引いて合計が6となり、負け。
101 15 86 [4, 0, 3, 1, 2] 「4」「0」「3」「1」「2」☆勝ち。
102 15 87 [4, 0, 3, 2, 1] 「4」「0」「3」「2」を引いて合計が9となり、負け。
103 16 87 [4, 1, 0, 2, 3] 「4」「1」「0」「2」「3」☆勝ち。
104 17 87 [4, 1, 0, 3, 2] 「4」「1」「0」「3」「2」☆勝ち。
105 18 87 [4, 1, 2, 0, 3] 「4」「1」「2」「0」「3」☆勝ち。
106 19 87 [4, 1, 2, 3, 0] 「4」「1」「2」「3」「0」☆勝ち。
107 20 87 [4, 1, 3, 0, 2] 「4」「1」「3」「0」「2」☆勝ち。
108 21 87 [4, 1, 3, 2, 0] 「4」「1」「3」「2」「0」☆勝ち。
109 21 88 [4, 2, 0, 1, 3] 「4」「2」を引いて合計が6となり、負け。
110 21 89 [4, 2, 0, 3, 1] 「4」「2」を引いて合計が6となり、負け。
111 21 90 [4, 2, 1, 0, 3] 「4」「2」を引いて合計が6となり、負け。
112 21 91 [4, 2, 1, 3, 0] 「4」「2」を引いて合計が6となり、負け。
113 21 92 [4, 2, 3, 0, 1] 「4」「2」を引いて合計が6となり、負け。
114 21 93 [4, 2, 3, 1, 0] 「4」「2」を引いて合計が6となり、負け。
115 22 93 [4, 3, 0, 1, 2] 「4」「3」「0」「1」「2」☆勝ち。
116 22 94 [4, 3, 0, 2, 1] 「4」「3」「0」「2」を引いて合計が9となり、負け。
117 23 94 [4, 3, 1, 0, 2] 「4」「3」「1」「0」「2」☆勝ち。
118 24 94 [4, 3, 1, 2, 0] 「4」「3」「1」「2」「0」☆勝ち。
119 24 95 [4, 3, 2, 0, 1] 「4」「3」「2」を引いて合計が9となり、負け。
120 24 96 [4, 3, 2, 1, 0] 「4」「3」「2」を引いて合計が9となり、負け。

解答: 1/5 (勝ち=24, 負け=96, 全順列=120)
========================================

D:\blog>


 追記、なにげに解答だけ載せてしまったが、判らない人は判らないよね?
で、簡単に解説しておくことにする。

 先ずはPythonコード側から。
Pthonは、JavaやCの様にmain()から実行という暗黙の取り決めはないので、段付のない最初の行頭から実行される。この場合、77行目からとなる。それ以前の分は、defで始まる関数定義と「"""」で囲んだ__doc__定義、そして#で始まる行コメントだ。
 そこで、77行目からは、ゲームの定義として、マジックナンバーという負けとなる累計値を、続いて各取出時のカード状態を表す為のcard0〜4のリストを初期化準備している。続いて、まぁカウンタでも良かったのだが、ついでなので、実現し得るカードの順列の全てを記録する為のリストcards_setsと、cards_setを空リストで初期化準備している。何気にcard0〜4のリスト初期化で、「= cards0[:]」としているところは、各取出し階層での利用時にそうしているので「= cards0[]」としても動くし答えは変わらないのでどちらでも構わない。違いはと言うと、Pythonのリスト型もJavaの配列と同様、代入演算子「=」で単純に代入しても値が代入される訳ではないので、値を代入したい為に、「[:]」としてリストの頭の要素から最後迄を個別で指定する表記にした次第である。これで、card0〜4は個別に変更されようとも他の値を一緒に書きかえる様なことはなくなる。基本型の変数とは扱いが異なることを理解して置こう。

 print __doc__ は、このPythonコードの __doc__ を標準出力せよということである。このPythonコードの__doc__は、3行目から22行目にある。JavaのJavaDocの「/** */」と同様の仕様である。Pythonには複数行コメントは無く、その代わりに複数行文字列を「"""」「'''」の何れかで囲むことで表現出来る様にし、__doc__はそちらを活用する仕様となったわけだ。


 まぁ、ここでは、問題文と出題者への文句を書かせて頂いている。出題者の意図は順列としての確率であることは、理解出来るのでこだわらずに順列確率として解答したが、この様な問題を見て受験者全員か同じ問題として発想してしまう様な教育は将来の進歩がなく日本の将来が危ぶまれることになる。社会には、同じ発想で同じことをこなす多くの人々以外に、人とは異なる発想で新たな社会を発想し創成する人も必要なのである。今の日本は自らが作り上げた閉鎖された日本人社会が普遍的な世の中という想定の基に、自らの属するコミュニティ(会社や地域社会等)があたかも日本全体の社会システムと同等かの様に思い生活していることに最大の問題がある。これは、大学組織にも言えることで、大学が学内で起きた知恵袋事件を偽計業務妨害として警察の捜査を依頼協力すると言った入学前の受験生に対し適用する発想は社会主義を標榜する独裁国家以上に恐ろしいものを感じるし、如何に日本が戦後安定して、画一的な発想の人材を育て過ぎてしまった帰結であるかを、個別の大学を批判するということでなく日本全体で反省すべきことかとMireは思うのである。戦後に起きた価値観の崩壊の様な事を自ら求め常に起こして行かなければ社会と人はは固定観念に安住してしまい、その思考にソグワナイとこを良しとせず排除してしまう。それで、人と違う発想を持つと、今の日本では異端視され活き難いことは事実である。国の決める教育指導要領で「正解」が何かが定められ教育される帰結として、世の中にも「正解」が存在しそれは1つであると思う人を絶対多数にしてしまっている。大学には、せめてそのことを踏まえ、世の中には「正解」が複数存在し、別の側面から眺めれば不正解になることを学ぶ場としての人材を選抜する様にして欲しいものだ。自由な発想なしに大での研究活動は有得ない氏発展もないのだから。ちょいと長い愚痴を叩かせて頂いたが、ここらで、元に戻らせて頂こう。


 まぁ、出題者の想定内なら、不正解とされる確率が低いので解の求め方として、素直に「カード順列別に判定すると以下の様になる。」をprint文で標準出力させている。これを書くことでその方向性で答えを出せば不正解とは出来なくなるだろうという算段である。尚、Pythonの文字列は「'」と「"」の何れの一方で囲めば良い。「'」は文字だけというCやJavaの様な決まりはない。

 alls と loses そして wins は、それぞれ全順列の数を、マジックナンバーとなったものとそうでないものをカウントする変数なので、ループ処理前に0に初期化した。

 次からは全順列を求める為、5段forループを組んでいる。各階層では、既に取出したカードは元の場所にないので、前階層のリストのコピーからそれを取除いてからループ処理をしている。これで、ちゃんと 5! =5*4*3*2*1 つまり120個の順列が得られたらそれが確率計算の分母として正解のプログラムとなる訳だ。最後の階層では、cards_setに可能性のある順列を代入、
それを関数isMagicNumber(cards_set)で、マジックナンバーになる順列となっていると1と判定メッセージをタプルで返させloseとmsgに代入させている。allsは無条件カウント、losesはloseを足し、winsにはloseが0の時にカウントさせている。

 以上の処理をprint alls, wins, loses, cards_set, msgとして標準出力し続けることで
経過表示が完成し、その最終値で、最後にansを作成し解答を表示させている訳である。
posted by Mire at 20:13 | Comment(0) | TrackBack(0) | 数学 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/205281555
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2012年08月 >>
      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  
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune