これまでの両方の回答が非常に重いアプローチをとっており、多くのことを非常に非効率的に行っていることに驚きました。特に、メモリの使用に関しては次のようになります。
- 文字列の作成と処理
- 入力の冗長コピーの保存
- カウントのために複数の一時的なリストや文字列を作成する。
さらに、これらのソリューションはどちらも、ランタイムの観点から特にエレガントではなく、実際に何が起こっているか、またはアルゴリズムで実行する必要があるかの手順の側面を説明するのに適していません。これは、初心者の指導の重要な側面です。
次のアプローチでは、コピーを保持する必要がないため、任意の大きな入力 (ロールの量) で作業できます。したがって、ジェネレーター関数または同様のストリーム処理関数に簡単に変換できます。また、より簡単で手続き的にきれいです。
import random
rolls=int(raw_input("Enter the number of rolls: "))
desc = {0: "H", 1: "T"}
total = [0, 0]
running = [0, 0]
running_max = [0, 0]
last_rolled = None
for roll in xrange(rolls):
# we use 0 for heads and 1 for tails
# this will be the index to the relevant list element for our counters
rolled = random.randint(0,1)
total[rolled] += 1
if last_rolled == rolled:
# we are continuing the run, flipped the same as last time
running[rolled] += 1
else:
# there has been a break in the run
if not last_rolled is None:
# as long as this isnt the first iteration
print running[last_rolled] * desc[last_rolled],
running[last_rolled] = 0
running[rolled] = 1
# update the max count
running_max[rolled] = max(running_max[rolled], running[rolled])
last_rolled = rolled
print running[last_rolled] * desc[last_rolled]
print "total rolls: H=%d, T=%d" % tuple(total)
print "running max: H=%d, T=%d" % tuple(running_max)
出力例:
Enter the number of rolls: 20
HH TTTT HH TT HHHHHHH T H T
total rolls: H=12, T=8
running max: H=7, T=4