テーブルトークRPGのダイス表記を計算する [9/30/2012] Challenge #102 [easy] (Dice roller) : dailyprogrammer

[9/30/2012] Challenge #102 [easy] (Dice roller) : dailyprogrammer

問題

ダイス表記(dice notation)とは"AdB(+/-)C"という形式の文字列(A,B,Cは数)を受け取って以下の計算を行う記法である。

  1. 1からBまでの乱数(B面ダイス)をA回ふって合計する。
  2. 1の結果にCを加減する。

ただしAとCは省略してもよい("d8+4", "4d6+2", "d3"など)。Aが省略された場合1として計算する。Cが省略された場合手順2の計算は行わない。

解答

import re
import random

def dice_roll(notation):
    r = re.compile(r"(\d*)d(\d+)([+-]?\d*)")
    a, b, c = r.search(notation).groups()
    a = int(a) if a != '' else 1
    b = int(b)
    c = int(c) if c != '' else 0
    result = sum(random.randint(1, b) for i in range(a)) + c
    return result

簡易な割に色々な分布の乱数を得られておもしろいと思います。