Chainer チュートリアル　演習問題の解答

# 本稿の投稿経緯
python初心者の私が、Chainer チュートリアルをやっていたところ、解答を探してもなく困ったので、なんとなくできた内容を共有し、私と同じように困っている人の参考になればと思い投稿。
解答の誤り、もっとスマートな方法があれば指摘頂きたい。

# 問題と解答
さっそく、解答を記載していくが、pythonコードを書く問題のみを記載していく。

## 問2.1 (組み込み関数)

```ruby:問題
a=[4, 8, 3, 4, 1] というリストに対して以下の操作を行う組み込み関数適用する
リスト a の長さを求める。
リスト a に含まれる値の最大値を求める。
リスト a に含まれる値の最小値を求める。
リスト a に含まれる値の合計値を求める。
リスト a をソートして、[1, 3, 4, 4, 8] というリストを返す。
```

```ruby:解答
a = [4, 8, 3, 4, 1]
res = len(a)
print(res)
```
表示結果は、`5`

```ruby:解答
a = [4, 8, 3, 4, 1]
res = max(a)
print(res)
```
表示結果は、`8`

```ruby:解答
a = [4, 8, 3, 4, 1]
res = min(a)
print(res)
```
表示結果は、`1`

```ruby:解答
a = [4, 8, 3, 4, 1]
res = sum(a)
print(res)
```
表示結果は、`20`

```ruby:解答
a = [4, 8, 3, 4, 1]
res = sorted(a)
print(res)
```
表示結果は、`[1, 3, 4, 4, 8]`

## 問2.3 (リストの基本操作)
```ruby:問題
a=[4, 8, 3, 4, 1] というリストに対して以下の操作を行うコードを書いて下さい。
リスト a の先頭の要素を取り除いて、[8, 3, 4, 1] となるようにして下さい。
リスト a の末尾の要素を取り除いて、[4, 8, 3, 4] となるようにして下さい。
リスト a の末尾に 100 という値を追加して、[4, 8, 3, 4, 1, 100] となるようにして下さい
```
```ruby:解答
a=[4, 8, 3, 4, 1]
a.pop(0)
print(a)
```
表示結果は、`[8, 3, 4, 1]`

```ruby:解答
a=[4, 8, 3, 4, 1]
a.pop()
print(a)
```
表示結果は、`[4, 8, 3, 4]`

```ruby:解答
a=[4, 8, 3, 4, 1]
a.append(100)
print(a)
```
表示結果は、`[4, 8, 3, 4, 1, 100]`

## 問2.4 (リスト内包表記)

```ruby:問題
1. a=[4, 8, 3, 4, 1] というリストに対し、要素が偶数なら 0, 奇数なら 1 に変換するコードをリスト内包表記を用いて書いて下さい。この結果、このリストは [0, 0, 1, 0, 1] に変換されるべきです。

2. 組み込み関数を組み合わせて、リスト a に含まれる奇数の個数を数えるコードを書いて下さい。

3. リスト内包表記を使ってリスト a から奇数の要素だけを残すコードを書いて下さい。
```

```ruby:解答
a = [4, 8, 3, 4, 1]
squares = [x % 2 for x in a]
print(squares)
```
表示結果は、`[0, 0, 1, 0, 1]`

```ruby:解答
a = [4, 8, 3, 4, 1]
squares = [x % 2 for x in a]
print(sum(squares))
```
表示結果は、`2`

```ruby:解答
a = [4, 8, 3, 4, 1]
squares = [x for x in a if x % 2 !=0]
print(squares)
```
表示結果は、`[3, 1]`

## 問2.5 (文字列)

```ruby:問題
1. str.join() を使って、0 から 99 までの数をスペース区切りで並べた文字列 "0 1 2 3 4 ... 99" を構成して下さい。
2. str.format() を使って float の値 (1.0 / 7.0) の小数点以下9桁までを表示して下さい。
```

```ruby:解答
' '.join([str(x) for x in range(100)])
```
表示結果は、`'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99'`

```ruby:解答
'{:.9}'.format(1.0 / 7.0)
```
表示結果は、`'0.142857143'`

## 問2.6 (クラス)
```ruby:問題
クラスを実装する練習として、データを管理するクラスを実装してみましょう。
 次のメソッドを全て持つクラス DataManager を記述して下さい。

__init__(self, x, y, z): 3つの数 x, y, z をコンストラクタで受け取り、インスタンスの属性でそれぞれの値を記憶する。
add_x(self, delta): x に delta だけ足して、値を更新する。
add_y(self, delta): y に delta だけ足して、値を更新する。
add_z(self, delta): z に delta だけ足して、値を更新する。
sum(self): x, y, z の3つの数の合計値を返す。

このクラスを使って以下のようなコードが書けるものとします。

data_manager = DataManager(2, 3, 5)
print(data_manager.sum())  # => 10
data_manager.add_x(4)      # => data_manager.x の値が 2 から 6 に更新される
print(data_manager.sum())  # => 14
data_manager.add_y(0)      # => data_manager.y の値が 3 から 3 に更新される
print(data_manager.sum())  # => 14
data_manager.add_z(-9)     # => data_manager.z の値が 5 から -4 に更新される
print(data_manager.sum())  # => 5
```

```ruby:解答
class DataManager:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
        
    def add_x(self, delta):
        self.x += delta
    
    def add_y(self, delta):
        self.y += delta

    def add_z(self, delta):
        self.z += delta
        
    def sum(self):
        return self.x + self.y + self.z
```

表示結果は、`10,14,14,10`

## 問2.8 (制御構文)
```ruby:問題
2以上の整数 p が素数であるとは、
「どんな 2 以上 p-1 以下の整数 k に対しても p は k で割り切れない」
が成り立つことを指します。素数を小さい順から列挙すると、
2, 3, 5, 7, 11, 13, 17, ... となります。 
if や for を用いて、2 から 100 からまでに含まれる素数を列挙して下さい。
```

```ruby:解答
x = [i for i in range(100)]
sosu = []
sosu.append(2)

for i in range(3, len(x)):
    for p in range(2, i):
        if i % p != 0:
            if p == i-1:
                sosu.append(i)
            else:
                pass
        else:
            break
print(sosu)
```

表示結果は、`[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]`

# やってみて
とりあえず一通り、結果は妥当なものが出るようにできた。
素数の問題が、特に難しかった。素数2については、ズルをしました。スマートなコーディングがあれば、教えていただきたい。