ダーツゲーム
質問する
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)
他人を解く
正規表現で解く
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]
コードが長くなって,最後になってやっと問題を解いた.問題を解決したら、コードを減らして改善する方向に進みます.
Reference
この問題について(ダーツゲーム), 我々は、より多くの情報をここで見つけました https://velog.io/@nuri00/1차-다트-게임テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol