【Progate】Python I を修了した人向け練習問題

# はじめに
Progateの Python Iを修了した方向けの練習問題集です
お好きなエディタで解いてみてください
おすすめは[Paiza.io](https://paiza.io/ja/projects/new)です

各問題には入力済みのコードが付いていますので、それをコピーし足りない要素を埋めて解答を完成させてください
☆は難易度です
# 「Pythonの基礎を学ぼう」より
## 問題1-1 Print some values ☆
コメントの指示に従ってコードを完成させてください
```python:task1-1.py
# 「Progate最高」と出力してください

# 数値の334を出力してください

# 1000に111を足した値を出力してください

# 「1000 + 111」を文字列として出力してください

```
### 出力例
```
Progate最高
334
1111
1000 + 111
```
### 解答例
<details><summary>解答例</summary>

```python:task1-1.py
# 「Progate最高」と出力してください
print('Progate最高')
# 数値の334を出力してください
print(334)
# 1000に111を足した値を出力してください
print(1000+111)
# 「1000 + 111」を文字列として出力してください
print('1000+111')
```
</details>

# 「変数を使ってみよう」より
## 問題2-1 Exam result ☆☆
あなたは国語、数学、英語の三教科のテストを受け、
国語の点数が**40点**、数学の点数が**70点**、英語の点数が**80点**でした
あなたの合計得点を「**○○さんの合計得点**」となるように、
平均得点を「**○○さんの平均得点**」となるように出力してください

コメントの指示に従ってコードを完成させてください
```python:task2-1.py
# 変数nameに好きな文字列を代入してください


# 変数japanese_scoreに40を代入してください

# 変数math_scoreに70を代入してください

# 変数english_scoreに80の値を代入してください


# 変数total_scoreにjapanese_scoreとmath_scoreとenglish_scoreを足した値を代入してください


# 変数nameを使用し、「○○さんの合計得点」となるように出力してください

# 変数total_scoreを出力してください

# 変数nameを使用し、「○○さんの平均得点」となるように出力してください

# 三教科の平均得点を出力してください

```
### 出力例
```
太郎さんの合計得点
190
太郎さんの平均得点
63.333333333333336
```
### 解答例
<details><summary>解答例</summary>

```python:task2-1_answer.py
# 変数nameに好きな文字列を代入してください
name = '太郎'

# 変数japanese_scoreに40を代入してください
japanese_score = 40
# 変数math_scoreに70を代入してください
math_score = 70
# 変数english_scoreに80の値を代入してください
english_score = 80

# 変数total_scoreにjapanese_scoreとmath_scoreとenglish_scoreを足した値を代入してください
total_score = japanese_score + math_score + english_score

# 変数nameを使用し、「○○さんの合計得点」となるように出力してください
print(name + 'さんの合計得点')
# 変数total_scoreを出力してください
print(total_score)
# 変数nameを使用し、「○○さんの平均得点」となるように出力してください
print(name + 'さんの平均得点')
# 三教科の平均得点を出力してください
print(total_score / 3)
```
</details>

### +αの知識
それぞれの点数の変数に代入する値を変更して、
合計得点と平均得点が変わるのを確かめてみてください

## 問題2-2 Taro+Jiro ☆☆
太郎君と次郎君はそれぞれ数字が書かれた紙を持っています
二人はそれぞれ持っている紙を横に繋げ数字を完成させようとしています
1行目に（**太郎、次郎**）の順番で繋げたものを「**太郎 + 次郎 = ○○**」となるように出力してください
2行目も同様に（**次郎、太郎**）の順番で繋げたものを「**次郎 + 太郎 = ○○**」となるように出力してください

コメントの指示に従ってコードを完成させてください
```python:task2-2.py
taro_number = '1111'
jiro_number = '200'

# 変数number1にtaro_numberとjiro_numberの順番で連結した文字列を代入してください

# 変数number1を「太郎 + 次郎 = ○○」となるように出力してください


# 変数number2にjiro_numberとtaro_numberの順番で連結した文字列を代入してください

# 変数number2を「次郎 + 太郎 = ○○」となるように出力してください

```
### 出力例
```
太郎 + 次郎 = 1111200
次郎 + 太郎 = 2001111
```
### 解答例
<details><summary>解答例</summary>

```python:task2-2_answer.py
taro_number = '1111'
jiro_number = '200'

# 変数number1にtaro_numberとjiro_numberの順番で連結した文字列を代入してください
number1 = taro_number + jiro_number
# 変数number1を「太郎 + 次郎 = ○○」となるように出力してください
print('太郎 + 次郎 = ' + number1)

# 変数number2にjiro_numberとtaro_numberの順番で連結した文字列を代入してください
number2 = jiro_number + taro_number
# 変数number2を「次郎 + 太郎 = ○○」となるように出力してください
print('次郎 + 太郎 = ' + number2)
```
</details>

### +αの知識

変数`number1`や`number2`を使わずに書くこともできます
なぜこのように書けるのか考えてみてください

<details><summary>変数を使わない解答例</summary>

```python:task2-2_answer.py
taro_number = '1111'
jiro_number = '200'

print('太郎 + 次郎 = ' + taro_number + jiro_number)
print('次郎 + 太郎 = ' + jiro_number + taro_number)
```
</details>

## 問題2-3 Taro+Jiro 2 ☆☆☆
太郎君と次郎君はそれぞれ数字が書かれた紙を持っています
二人はそれぞれ持っている紙を横に繋げ数字を完成させようとしています
ただし、太郎君は**持っている数字の3倍の数字**を、次郎君は**持っている数字に240を足した数字**を使います
1行目に（**太郎、次郎**）の順番で繋げたものを「**太郎 + 次郎 = ○○**」となるように出力してください
2行目も同様に（**次郎、太郎**）の順番で繋げたものを「**次郎 + 太郎 = ○○**」となるように出力してください

コメントの指示に従ってコードを完成させてください
```python:task2-3.py
taro_number = '1111'
jiro_number = '200'

# 変数new_taro_numberにtaro_numberを3倍した数字を代入して下さい

# 変数taro_numberをnew_taro_numberの値を文字列型に変換した文字列で更新してください

# 変数new_jiro_numberにjiro_numberに240を足した数字を代入して下さい

# 変数jiro_numberをnew_jiro_numberの値を文字列型に変換した文字列で更新してください


number1 = taro_number + jiro_number
print('太郎 + 次郎 = ' + number1)
number2 = jiro_number + taro_number
print('次郎 + 太郎 = ' + number2)
```
### 出力例
```
太郎 + 次郎 = 3333440
次郎 + 太郎 = 4403333
```
### 解答例
<details><summary>解答</summary>

```python:task2-3_answer.py
taro_number = '1111'
jiro_number = '200'

# 変数new_taro_numberにtaro_numberを3倍した数字を代入して下さい
new_taro_number = int(taro_number) * 3
# 変数taro_numberをnew_taro_numberの値を文字列型に変換した文字列で更新してください
taro_number = str(new_taro_number)
# 変数new_jiro_numberにjiro_numberに240を足した数字を代入して下さい
new_jiro_number = int(jiro_number) + 240
# 変数jiro_numberをnew_jiro_numberの値を文字列型に変換した文字列で更新してください
jiro_number = str(new_jiro_number)

number1 = taro_number + jiro_number
print('太郎 + 次郎 = ' + number1)
number2 = jiro_number + taro_number
print('次郎 + 太郎 = ' + number2)
```
</details>

### +αの知識
変数`new_taro_number`や`new_jiro_number`を使わずに書くこともできます
このように書くことが出来る方法を身につけておくと、管理する変数が減って良いことがあります
<details><summary>変数を使わない解答例</summary>

`str()`や`int()`は入れ子構造にすることによってすっきり書くことが出来ます
```python:task2-3_answer.py
taro_number = '1111'
jiro_number = '200'

taro_number = str(int(taro_number)*3)
jiro_number = str(int(jiro_number)+240)

print('太郎 + 次郎 = ' + taro_number + jiro_number)
print('次郎 + 太郎 = ' + jiro_number + taro_number)
```
</details>

# 「真偽値と条件分岐」より
## 問題3-1 Teacher's comment ☆☆
あなたはテストを受けました
以下の分岐で結果を出力してください
* 点数が**100点**の時：「**満点です**」と出力
* 点数が**40点以上**、**100点未満**の時：「**○○点です**」と出力
* 点数が**40点未満**の時：「**○○点で、これは赤点です**」と出力

コメントの指示に従ってコードを完成させ、`score`の値を変更して正確に結果が出力されることを確かめてください
```python:task3-1.py
score = 55

# 変数scoreが100と等しい時は「満点です」と出力

# 変数scoreが40点以上、100点未満の時は「○○点です」となるように出力

# 変数scoreが40点未満の時は「○○点で、これは赤点です」となるように出力

```
### 出力例
```
55点です
```
### 解答例
<details><summary>解答例</summary>

「○○以上、□□未満」といった条件を書くときは、
`40 <= score and scorer < 100`のように比較演算子の左に小さい数字を持ってくるように書くと、見た目でわかりやすい条件式になります
```python:task3-1_answer.py
score = 55

# 変数scoreが100と等しい時は「満点です」と出力
if score == 100:
    print('満点です')
# 変数scoreが40点以上、100点未満の時は「○○点です」となるように出力
if 40 <= score and score < 100:
    print(str(score) + '点です')
# 変数scoreが40点未満の時は「○○点で、これは赤点です」となるように出力
if score < 40:
    print(str(score) + '点で、これは赤点です')
```
</details>

### +αの知識

「○○以上、□□未満」といった条件は実はこう書くこともできます
<details><summary>「○○以上、□□未満」を書くときは...</summary>

こっちの方が感覚的ですよね
```python
if 40 <= score and score < 100:
```
↓
```python
if 40 <= score < 100:
```
</details>

もちろん`elif`や`else`を使って書くこともできます
<details><summary>elifやelseを使用した解答例</summary>

```python:task3-1_answer.py
score = 55

if score == 100:
    print('満点です')
elif 40 <= score:
    print(str(score) + '点です')
else:
    print(str(score) + '点で、これは赤点です')
```
</details>

## 問題3-2 Multiple of three ☆☆
ある数**x**が与えられます
**xを3で割った時の余りが0**の時は「3の倍数」、**それ以外**の時は「3の倍数ではない」と出力してください

コメントの指示に従ってコードを完成させ、xの値によって正しい出力がなされることを確認してください
```python:task3-2.py
x = 120

# xを3で割った時の余りが0に等しい場合に「3の倍数」と出力してください

# それ以外の時は「3の倍数ではない」と出力してください

```
### 出力例
```
3の倍数
```
### 解答例
<details><summary>解答例</summary>

```python:task3-2_answer.py
x = 120

# xを3で割った時の余りが0に等しい場合に「3の倍数」と出力してください
if x % 3 == 0:
    print('3の倍数')
# それ以外の時は「3の倍数ではない」と出力してください
else:
    print('3の倍数ではない')
```
</details>

### +αの知識
今回は3で行いましたが、これはどんな数でも倍数かを判定することが出来ます
3の部分を変数化したコードを書いてみてください

<details><summary>3の部分を変数化した解答例</summary>

dの値を変更してみて、正確に判定出来ていることを確かめてみてください
```python:task3-2_answer.py
x = 120
d = 3

if x % d == 0: # dの倍数
    print(str(d)+'の倍数')
else:
    print(str(d)+'の倍数ではない')
```
</details>

## 問題3-3 FizzBuzz ☆☆☆
ある数**x**が与えられます
**xが、3でも5でも割り切れる**時は「**3と5の倍数**」、**3だけで割り切れる**時は「**3だけの倍数**」、**5だけで割り切れる**時は「**5だけの倍数**」、**それ以外**の時は「**3と5の倍数ではない**」と出力してください

コメントの指示に従ってコードを完成させ、xの値によって正しい出力がなされることを確認してください
```python:task3-3.py
x = 120

# xが3でも5でも割り切れる時は「3と5の倍数」と出力してください

# xが3だけで割り切れる時は「3だけの倍数」と出力してください

# xが5だけで割り切れる時は「5だけの倍数」と出力してください

# それ以外の時は「3と5の倍数ではない」と出力してください

```
### 出力例
```
3と5の倍数
```
### 解答例
<details><summary>解答例</summary>

この問題では条件を確かめる順番が大事です
最初に`if x % 3 == 0:`としてしまうと、「3だけの倍数」の数だけでなく「3と5の倍数」の数も条件に含まれてしまうことに注意してください
最初に`if x % 3 == 0 and x % 5 == 0:`とすることで、`elif`で残りの数字から判定できます
```python:task3-3_answer.py
x = 120

# xが3でも5でも割り切れる時は「3と5の倍数」と出力してください
if x % 3 == 0 and x % 5 == 0:
    print('3と5の倍数')
# xが3だけで割り切れる時は「3だけの倍数」と出力してください
elif x % 3 == 0:
    print('3だけの倍数')
# xが5だけで割り切れる時は「5だけの倍数」と出力してください
elif x % 5 == 0:
    print('5だけの倍数')
# それ以外の時は「3と5の倍数ではない」と出力してください
else:
    print('3と5の倍数ではない')
```
</details>

### +αの知識
この問題は一般にFizzBuzz問題と言われている問題です
3と5の最小公倍数が15であることを使うとこのようにも書けます

<details><summary>最小公倍数を使用した解答例</summary>

```python:task3-3_answer.py
x = 120

if x % 15 == 0:
    print('3と5の倍数')
elif x % 3 == 0:
    print('3だけの倍数')
elif x % 5 == 0:
    print('5だけの倍数')
else:
    print('3と5の倍数ではない')
```
</details>

# 応用問題
ここからはコメント付きのコードはありません
プログラミングを始めたばかりの方には難しい内容となっております
今すぐできなくても問題はありませんので、しばらく勉強した後にまた解きに戻ってきてみてください
## 問題4-1 Make number ☆☆
ある一桁の数字**A**と**B**を入力で受け取ります
**Aを十の位**、**Bを一の位**とする数字を出力してください
### 入力
```
A
B
```
### 入力例1
```
3
8
```
### 出力例1
```
38
```

### 入力例2
```
5
3
```
### 出力例2
```
53
```
### 解答例
<details><summary>解答例</summary>

```python:task4-1_answer.py
A = input()
B = input()

number = int(A)*10 + int(B)
print(number)
```
</details>

### +αの知識
入力されたAとBが文字列型であることを利用した解法もあります
なぜこのように書けるか考えてみてください
<details><summary>AとBが文字列型であることを利用した解法</summary>

```python:task4-1_answer.py
A = input()
B = input()

number = int(A + B)
print(number)
```
</details>

## 問題4-2 Swap number ☆☆
ある**二桁の数字X**を入力で受け取ります
**Xの十の位と一の位を入れ替えた数字**を出力してください

演算子`/`は割り算を行いますが、小数点以下も計算します
整数部分だけを使いたい時は演算子`//`を使用します
```python
x = 9 / 2
print(x) # 4.5
x = 9 // 2
print(x) # 4
```
演算子`//`と`%`を使用することで二桁の数字の十の位と一の位を取得できます
```python
x = 35
a = x // 10 # 十の位
print(a) # 3
b = x % 10 # 一の位
print(b) # 5
```

### 入力
```
X
```

### 入力例1
```
79
```
### 出力例1
```
97
```
### 入力例2
```
30
```
### 出力例2
```
3
```
十の位が0になる場合もあります
### 解答例
<details><summary>解答例</summary>

```python:task4-2_answer.py
X = input()

A = int(X) // 10 # 十の位
B = int(X) % 10 # 一の位

number = B*10 + A
print(number)
```
</details>

### +αの知識
この問題では二桁でしたが、三桁の場合はどうやって各位の数字を取ってこればいいでしょうか
考えてみましょう
<details><summary>三桁の場合</summary>

```python:task4-2_answer.py
X = input()

A = int(X) // 100
B = (int(X) % 100) // 10 # 下二桁にしてから10で割る
C = int(X) % 10

number = C * 100 + B*10 + A
print(number)
```
</details>

## 問題4-3 Digit multiply ☆☆☆
ある**二桁の数字X**を入力で受け取ります
**Xの各桁の数字を2倍にした数字**を出力してください
ただし、各桁の数字を2倍した結果が一桁に収まらない場合はその桁を9にしてください
### 入力
```
X
```

### 入力例1
```
24
```
### 出力例1
```
48
```
### 入力例2
```
36
```
### 出力例2
```
69
```
一の位の6を2倍すると12になり、9を超えるので答えの一の位は9になります

### 解答例
<details><summary>解答例</summary>

```python:task4-3_answer.py
X = input()

A = int(X) // 10
A *= 2
if A > 9:
    A = 9
    
B = int(X) % 10
B *= 2
if B > 9:
    B = 9

number = A*10 + B
print(number)
```
</details>

### +αの知識
二つの数字を比べて小さい方を返す`min()`関数を使うとif文を使わなくても書けます
<details><summary>min関数を使った解法</summary>

```python:min()
print(min(3, 5)) # 3

print(min(2*3, 10//2)) # 5
```
```python:task4-3_answer.py
X = input()

A = int(X) // 10
A = min(A*2, 9)
    
B = int(X) % 10
B = min(B*2, 9)

number = A*10 + B
print(number)
```

もちろん大きい方を返す`max()`関数もあります
```python:max()
print(min(3, 5)) # 5

print(min(2*3, 10//2)) # 6
```
</details>

## 問題4-4 Sort 1 ☆☆☆
ある数**A**、**B**を入力で受け取ります
数A、Bを**小さい順に並べ**、**各数字の間に半角スペースを入れた文字列**を出力してください
### 入力
```
A
B
```
### 入力例1
```
6
3
```
### 出力例1
```
3 6
```
3と6の間に半角スペースが入っています
### 入力例2
```
123
450
```
### 出力例2
```
123 450
```
### 解答例
<details><summary>解答例</summary>

```python:task4-4_answer.py
A = input()
B = input()

if int(A) < int(B):
    print(A + ' ' + B)
else:
    print(B + ' ' + A)
```
</details>

### +αの知識
変数の値を半角スペース区切りで出力したい時はこう書くこともできます
<details><summary>変数の値を半角スペース区切りで出力したい時</summary>

`print(A, B)`と書くことで変数の値を半角スペース区切りで出力できます
```python:変数の値を半角スペース区切りで出力したい時
A = 120
B = '520'

# どちらも「120 520」と出力される
print(str(A) + ' ' + B)
print(A, B) # 型が違っても問題なく並べられます

# 3個以上でもできます
C = 55
print(A, B, C) # 120 520 55
```
```python:task4-4_answer.py
# 入力と同時に整数型へ変換
A = int(input())
B = int(input())

if A < B:
    print(A, B)
else:
    print(B, A)
```
</details>

## 問題4-5 Sort 2 ☆☆☆☆
ある数**A**、**B**、**C**を入力で受け取ります
数A、B、Cを**小さい順に並べ**、**各数字の間に半角スペースを入れた文字列**を出力してください

### 入力
```
A
B
C
```
### 入力例1
```
6
3
4
```
### 出力例1
```
3 4 6
```
### 入力例2
```
123
450
356
```
### 出力例2
```
123 356 450
```
### 解答例
<details><summary>解答例</summary>

```python:task4-5_answer.py
A = int(input())
B = int(input())
C = int(input())

# Aが一番小さい時
if A <= B and A <= C:
    if B < C:
        print(A, B, C)
    else:
        print(A, C, B)
# Bが一番小さい時
elif B <= A and B <= C:
    if A < C:
        print(B, A, C)
    else:
        print(B, C, A)
# Cが一番小さい時
else:
    if A < B:
        print(C, A, B)
    else:
        print(C, B, A)
```
</details>

### +αの知識
数字の数が２つから３つになっただけで処理がとても増えました
これが４つなら？10個なら？1000個なら？どんな処理を書けばいいでしょうか

このような、数字の並びを小さい順に並び替える処理をソートアルゴリズムと言います
アルゴリズムにも種類があり、並び替える方法によって並び替えにかかる時間が全然違い、
優れたアルゴリズムはよりたくさんの数の並びをより短い時間で並び替えることが出来ます

アルゴリズムの種類ごとにどうやって並び替えるかを視覚的に鑑賞できる[動画](https://youtu.be/kPRA0W1kECg)がありますので、興味があったら見てみてください

<details><summary>ソートアルゴリズムを使った解法（学んでいない内容が含まれています）</summary>

ProgateのPython IIで学ぶ「リスト」を使用しています
`sorted_list = sorted([A, B, C])`でA,B,Cをリストに格納し、`sorted()`で小さい順に並び替えています
`print(*sorted_list)`はリストの中身を半角スペース区切りで出力するテクニックです
```python:task4-4_answer.py
A = int(input())
B = int(input())
C = int(input())

sorted_list = sorted([A, B, C])
print(*sorted_list)
```
コピーして実行し、数値を変更しても正しく並び替えられることを確認してみてください
</details>

# さいごに
以上でProgateの Python I を修了した方向けの練習問題集は終了です
問題はまた増えるかもしれません

お疲れさまでした