今までの問題の応用だったので
難しくはなかったですね。
時間はかかりますが。。。
class Status():
#当初の勇者のステータス
def __init__(self,level,hp,attack,defense,speed,clever,fortune):
self.level = int(level)
self.hp = int(hp)
self.attack = int(attack)
self.defense = int(defense)
self.speed = int(speed)
self.clever = int(clever)
self.fortune = int(fortune)
def levelup(self, add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
self.level += 1
self.hp += int(add_hp)
self.attack += int(add_attack)
self.defense += int(add_defense)
self.speed += int(add_speed)
self.clever += int(add_clever)
self.fortune += int(add_fortune)
def muscle_training(self, add_hp, add_attack):
self.hp += int(add_hp)
self.attack += int(add_attack)
def running(self, add_defense, add_speed):
self.defense += int(add_defense)
self.speed += int(add_speed)
def study(self, add_clever):
self.clever += int(add_clever)
def pray(self, add_fortune):
self.fortune += int(add_fortune)
def __str__(self):
"""表示文字列に変換する"""
return f"{self.level} {self.hp} {self.attack} {self.defense} {self.speed} {self.clever} {self.fortune}"
N,K= map(int,input().split())
#勇者たちのステータスを登録
braves = [Status(*input().split()) for _ in range(N)]
#勇者たちのトレーニングコマンドメソッド
def levelup(number,add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
braves[int(number)-1].levelup(add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune)
def muscle_training(number,add_hp,add_attack):
braves[int(number)-1].muscle_training(add_hp,add_attack)
def running(number,add_defense, add_speed):
braves[int(number)-1].running(add_defense,add_speed)
def study(number,add_clever):
braves[int(number)-1].study(add_clever)
def pray(number,add_fortune):
braves[int(number)-1].pray(add_fortune)
#ここを上の関数たちをつかってラムダ関数で書ければ短くできる
commands = {
'levelup':levelup,
'muscle_training' :muscle_training,
'running' :running,
'study' :study,
'pray' :pray,
}
for _ in range(K):
number,command,*args = input().split()
commands[command](number,*args)
for brave in braves:
print(brave)
ただ一点、コメントで教えてもらったコマンドメニューを辞書で作るところですが、
上のをラムダ関数で書こうとしてかけず、いったんそのまま書いてました。。。
関数名とか引数をどう書こうか迷っていたので。。。
時間もなかったのでいったんそのまま書きました。
また時間がある時に調べて書いてみます
***
解答見たところで直したほうがいいなと思ったところ
#前
def __str__(self):
"""表示文字列に変換する"""
return f"{self.level} {self.hp} {self.attack} {self.defense} {self.speed} {self.clever} {self.fortune}"
#修正後
def print(self):
print(self.level,self.hp,self.attack,self.defense,self.speed,self.clever,self.fortune)
ですね。全部数値だし。
コメント欄からラムダ式と**argの使い方についてアドバイスを頂きまして
再度確認したところ
#最初
def levelup(number,add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
braves[int(number)-1].levelup(add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune)
#ラムダ
'levelup': lambda brave, *args: brave.levelup(*args),
要するにdefの代わりにlambdaと書いて、その横に引数そして、セミコロン(:)の後に引数を使用した処理内容という形式にて書く。
ということなので、levelup関数について考えてみます
levelup関数はそもそもbraves[int(number)-1]がイコールbraveなので、
これを引数とし、さらに全ての引数を全部*argsで代用します
そうすると下記のようになります
私がわからなかった、ひっかかっていたのはbraveの部分ですね。
クラスのselfの部分かーと今さら気づきました。
#修正前
def levelup(number,add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune):
braves[int(number)-1].levelup(add_hp, add_attack, add_defense, add_speed, add_clever, add_fortune)
##↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
def levelup(brave,*args):
brave.levelup(*args)
##↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#ラムダ(+辞書)
'levelup' : lambda brave,*args: brave.levelup(*args)
#もちろん、braves[int(number)-1]がbraveになったのでちょっと変える必要がある
```py
for _ in range(K):
number,command,*args = input().split()
commands[command](number,*args)
以上。