「自作Python100本ノック」2日目（6本〜10本目）



「自作Python100本ノック」とは何ぞや？
どの程度のレベル感なのか？
どのように進めて行くのか？
など詳しくは[こちら](https://qiita.com/ahpjop/items/373f807d68044cda1c9b#%E8%87%AA%E4%BD%9Cpython100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF1%E6%9C%AC5%E6%9C%AC%E7%9B%AE)に整理してありますのでまずはそちらを確認するようお願いします。

それでは今日も始めていきます！
（100本目まで気力が本当にもつのだろうか。。。。）

##Q6: FizzBuzz問題
問題：1〜100までの数字のうち、3で割り切れるものは"Fizz!",5で割り切れるものは"Buzz!",15で割り切れるものは"FizzBuzz!"と表示させ、それ以外の数はそのままの数を表示させなさい。
　　
みんな大好きFizzBuzz問題ですね。
なんか毎回記事の最初の問題は、簡単ですね。
　
　　　

```q6.py
for i in range(1, 101):
    if i % 15 == 0:
        print("Fizz Buzz!")
    elif i % 3 == 0:
        print("Fizz!")
    elif i % 5 == 0:
        print("Buzz!")
    else:
        print(i)
```

##Q7: その内整数nまでの”z”の個数を計算し表示せよ（ただし`if文`,`for文`の使用不可）
問題：Q６と同じ規則に従って、1から整数nまでを数字,Fizz,Buzz,FizzBuzz,に分けていき、その内いくつ"z"があるか個数をカウントし表示させなさい。
条件：`if文`,`for文`は使用してはいけない。

if文,for文を使えば簡単ですが、それが使えないとなると頭を使いますよね。
　　　

```q7.py
def count_z(n):
    print((n // 3 * 2) + n // 5 * 2)#「//」は割り算の整数部分の結果を出します
    
count_z(100)
```

##Q8:　為替自動換算クラスの作成
問題：日本円をドルとユーロに換算するクラスを作成せよ。
条件：・1ドル=109円, 1ユーロ=129円で換算。(2018/5/8現在)
　　　・クラスの引数に日本円を入力して、その後その値を各通貨に換算できるようする。

クラスの使い方ですね。
　　　

```q8.py
class YenToCurrency:
    def __init__(self,yen):
        self.yen = yen
        
    def doll(self):
        doll = self.yen / 109
        return(doll)
    
    def euro(self):
        euro = self.yen / 129
        return(euro)

exchange = YenToCurrency(3000)
print('3000円は{}ドルです。'.format(exchange.doll()))
print('3000円は{}ユーロです。'.format(exchange.euro()))
```
[参考][AI_STANDARD](https://www.ai-standard.jp/)
##Q9: RPGゲームクラスの作成
問題：キャラクターのステータスを登録して、お互いに攻撃することができるクラスを
　　　作成せよ。
条件：・キャラクターは名前,体力の現在値、体力の最大値、攻撃力,防御力の
　　　　5つのパラメータをもっており、いつでも参照することができる。
　　　・キャラクターは別のキャラクターを攻撃して、
　　　　相手の体力を自分の攻撃力(-相手の防御力)分だけ減らすことができる。

少し長いクラスの作成となります。
　　　

```q9.py
class Character:
    def __init__(self,name,maxhp,attack_point,defence_point):
        self.name = name
        self.maxhp = maxhp 
        self.hp = maxhp
        self.attack_point = attack_point
        self.defence_point = defence_point
        
        
    def status(self):
        return "{}:体力 {}/{}:攻撃力 {} 防御力 {}".format(self.name,self.hp,self.maxhp,self.attack_point,self.defence_point)
    
    def attack(self,enemy):
        cal_attack_point = self.attack_point - enemy.defence_point
        enemy.hp -= cal_attack_point
        print("{}の攻撃！{}に{}のダメージ！".format(self.name,enemy.name,cal_attack_point))
        

yusha = Character("勇者",60,10,2)
slime = Character("スライム",15,5,1)

# ステータスを表示
print(yusha.status())
print(slime.status())
    
# 勇者の攻撃
yusha.attack(slime)
# スライムの攻撃:
slime.attack(yusha)

# ステータスを表示
print(yusha.status())  # 勇者のステータス
print(slime.status())  # スライムのステータス
```
[参考][AI_STANDARD](https://www.ai-standard.jp/)

##Q10 Hashnumber 判定
問題：整数 X の各桁の数字の和を f(X) としたとき、
　　　X が f(X) で割り切れる場合、X はハーシャッド数です。
　　　整数 N が与えられるので、ハーシャッド数かどうか判定してください。

`str()`や,`map()`や`sum()`を使う良い練習になるのではないでしょうか。
　　　

```q10.py
def j_hash(n):
    s = str(n)
    array = list(map(int, list(s)))
    a = sum(array)
    if n % a == 0:
        print("Hashnumber")
    else:
        print("Not hashnumber")

j_hash(444)
```
[参考][やるだけPython競プロ日誌](http://delta114514.hatenablog.jp/entry/2017/12/03/234419)

##感想
やっと10本目までいきました！！
今回は、FizzBuzzやクラス定義の問題など基礎的な部分もありながら、"z"をif文,for文なしで解く問題やHashnumber判定といった少し頭を使わなくてはいけない問題なども混ぜることができ良いバランスだったかなと思います。

さて、本当に100本目までいけるのか非常に怪しいですが、とりあえず今回はここまで！
見ての通り初心者なので、何か修正、アドバイス、感想等あればなんでも良いのでコメントもらえると助かります。
よろしくお願いします。

→ [3日目](https://qiita.com/ahpjop/items/023cb561d7a2081ad606)