0

問題: サイコロを 3 つ振る必要があります。サイコロの 2 つ (または 3 つ) が同じ数字を返す場合は、停止します。3 つのサイコロがすべて同じ場合 (例: 2、4、および 6)、もう一度ロールします。ダブルスまたはトリプルが出るまで、または 7 回のいずれか早い方でこれを実行します。

注: 私は python newb です。

ここに私がこれまでに持っているものがありますが、これが実際に行うことは、216 の可能な組み合わせを実際に生成することだけです。

import itertools

all_possible = list(itertools.permutations([1,2,3,4,5,6],3))
input = raw_input()

print all_possible

これにより、次のタイプの出力が生成されます。

[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 4, 2), (1, 4, 3), (1, 4, 5), (1, 4, 6), (1, 5, 2), (1, 5, 3), (1, 5, 4), (1, 5, 6), (1, 6, 2), (1, 6, 3), (1, 6, 4), (1, 6, 5), (2, 1, 3), (2, 1, 4), (2, 1, 5), (2, 1, 6), (2, 3, 1), (2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 4, 1), (2, 4, 3), (2, 4, 5), (2, 4, 6), (2, 5, 1), (2, 5, 3), (2, 5, 4), (2, 5, 6), (2, 6, 1), (2, 6, 3), (2, 6, 4), (2, 6, 5), (3, 1, 2), (3, 1, 4), (3, 1, 5), (3, 1, 6), (3, 2, 1), (3, 2, 4), (3, 2, 5), (3, 2, 6), (3, 4, 1), (3, 4, 2), (3, 4, 5), (3, 4, 6), (3, 5, 1), (3, 5, 2), (3, 5, 4), (3, 5, 6), (3, 6, 1), (3, 6, 2), (3, 6, 4), (3, 6, 5), (4, 1, 2), (4, 1, 3), (4, 1, 5), (4, 1, 6), (4, 2, 1), (4, 2, 3), (4, 2, 5), (4, 2, 6), (4, 3, 1), (4, 3, 2), (4, 3, 5), (4, 3, 6), (4, 5, 1), (4, 5, 2), (4, 5, 3), (4, 5, 6), (4, 6, 1), (4, 6, 2), (4, 6, 3), (4, 6, 5), (5, 1, 2), (5, 1, 3), (5, 1, 4), (5, 1, 6), (5, 2, 1), (5, 2, 3), (5, 2, 4), (5, 2, 6), (5, 3, 1), (5, 3, 2), (5, 3, 4), (5, 3, 6), (5, 4, 1), (5, 4, 2), (5, 4, 3), (5, 4, 6), (5, 6, 1), (5, 6, 2), (5, 6, 3), (5, 6, 4), (6, 1, 2), (6, 1, 3), (6, 1, 4), (6, 1, 5), (6, 2, 1), (6, 2, 3), (6, 2, 4), (6, 2, 5), (6, 3, 1), (6, 3, 2), (6, 3, 4), (6, 3, 5), (6, 4, 1), (6, 4, 2), (6, 4, 3), (6, 4, 5), (6, 5, 1), (6, 5, 2), (6, 5, 3), (6, 5, 4)]

これは、ダブルまたはトリプルを生成しないため、どちらもあまり良くありません。私が見る限り、すべてが一意の組み合わせのみです。

----------更新-----------OK--私はこれを取り、配列から各値を剥がしてそれらを合計することで少し拡張しました(おそらく少なくとも可能な効率的な方法)。それは機能し、ブレークの前に複数のセットが生成された場合、それらはすべて印刷されます。私が今やりたいことは、合計することです。そう:

def gen_random_termagants():
for _ in range(7): 
    # instead of three separate variables, we use a list here
    # the nice thing is, that you can freely vary the number of
    # 'parallel' dice rolls this way 
    dice = [random.randint(1, 6) for _ in range(3)]

    # this is more general and will break as soon as there are
    # duplicate (die) values in the list (meaning, break, if not all elements 
    # are different)
    first_die = dice[0]
    second_die = dice[1]
    third_die = dice[2]
    total_term = first_die + second_die + third_die
    print "Total: %s" % total_term
    if len(dice) > len(set(dice)):
        break

出力サンプルは次のとおりです。

How many tervigons? ::>3
Let's calculate some termagants based on 3 tervigons...
You'll get a minimum of 9 termagants per turn.
You'll get a maximum of 54 termagants per turn.
minimums: 5 turns [45] :: 6 turns [54] :: 7 turns [63]
averages: 5 turns [157] :: 6 turns [189] :: 7 turns [220]
maximums: 5 turns [270] :: 6 turns [324] :: 7 turns [378]
Total: 9
Total: 8

したがって、この例では、17 (つまり 9 + 8) を返すようにします。

4

2 に答える 2