ダーツゲーム


質問する


KakaoTalkゲームスターは下半期にダーツゲームを新サービスとして発売する.ダーツゲームは、ボードに3回ダーツを投げ、点数の和で実力を競うゲームで、簡単に楽しめます.
入社したばかりの武智はコード力が認められ、ゲームの核心部分である採点ロジックを担当した.ダーツゲームの得点ロジックは以下の通りです.
1.ダーツゲームは3回のチャンスがあります.
チャンスごとに得られる点数は0点から10点です.
3.スコアとともにSingle(S)、Double(D)、Triple(T)領域が存在し、各領域で当選した場合、スコアから1平方、2平方、3平方(スコア^1、スコア^2、スコア^3)が算出される.
4.選択肢はスター賞(*)、雅察賞(#)、スター賞(*)が当選したときの点数とそれまでの点数をそれぞれ2倍にした.阿次賞(#)が当選した時、この点数は負数だった.
5.スター賞(*)も初の機会に受賞できる.このような状況で、初のスター賞(*)の点数は2倍になった.(例4参照)
6.スター賞(*)の効果は、他のスター賞(*)の効果と重ねることができる.この場合、重なったスター賞(*)の点数は4倍だ.(例4参照)
7.スター賞(*)の効果は、サブ賞(#)の効果と重ねることができる.この場合、重なったアッチャ賞(#)の点数は-2倍です.(例5参照)
8.単一(S)、二重(D)、三重(T)の各成分が存在する.
9.スター賞(*)、ヤッツァ賞(#)は1点あたり2つしか存在しないし、存在しない可能性もある.
0~10の整数と、アルファベットS、D、T、*、および#からなる文字列を入力すると、合計スコアが返される関数を作成します.

入力フォーマット


「スコア|加算|オプション」からなる文字列3組.
例)1S2D*3Tスコアは0~10の整数です.
ボーナスはS、D、Tの一つです.
破線は*または#のいずれかで、ない可能性があります.

出力フォーマット


3回の機会で得られたスコアの合計の整数値を出力します.
例)37

I/O例


例題DartResultRes解答説明1束目第1束第2+22滲み2+2^1*2+2^2*2+2*2+3\\2+2\\2+11\\\\911+11^2^2^2+21^2^2+2^1*(-)+10^11112+21\\\\21 11111111111111+11)+第3\\\\\\21 1111111111111111111111111111111111+2+21 1111111111111111+21 21 21 1111111111111111)+第2\\\\\\\\21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 2+23∧2+315∧2+21∧2+311;1^2*(-1)*2+2^1*2+2^1*2+3^112∧(-1)∗2+21∗2+316 1S2D*3T -413+22+32∗(−1)1^3 + 2^2 + 3^2 * (-1)13+22+32∗(−1)7 1D2S#10S 5912+21∗2+33∗21^2 + 2^1 * 2 + 3^3 * 212+21∗2+33∗2

問題を解く

def solution(dartResult):
    answer =[0,0,0]
    bonus=['S','D','T']
    n=len(dartResult)
    an=-1
    for i in range(n):
        a=dartResult[i]
        if a in bonus:
            answer[an]=answer[an]**(bonus.index(a)+1)
        elif a=='*':
            answer[an]*=2
            if an>0:
                answer[an-1]*=2
        elif a=='#':
            answer[an]*=-1
        else:
            if dartResult[i+1].isdigit():
                an+=1
                answer[an]=int(a)
            else:
                if dartResult[i-1].isdigit():

                    answer[an]=answer[an]*10+int(a)
                else:
                    an+=1
                    answer[an]=int(a)
    return sum(answer)
  • 10などの2桁の問題を解決するには、次のインデックスが
  • であることを確認します.
  • は、10に2桁の数を乗じるプロセス、
  • を通過する.

    他人を解く


    正規表現で解く
    import re
    def solution(dartResult):
        bonus = {'S' : 1, 'D' : 2, 'T' : 3}
        option = {'' : 1, '*' : 2, '#' : -1}
        p = re.compile('(\d+)([SDT])([*#]?)')
        dart = p.findall(dartResult)
        for i in range(len(dart)):
            if dart[i][2] == '*' and i > 0:
                dart[i-1] *= 2
            dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]
    
        answer = sum(dart)
        return answer
    いっそ10を置き換える方法
    dartResult = dartResult.replace('10','k')
    point = ['10' if i == 'k' else i for i in dartResult]
    コードが長くなって,最後になってやっと問題を解いた.
    問題を解決したら、コードを減らして改善する方向に進みます.