---
# System prepended metadata

title: Python - Fuction(3) - Exercise
tags: [Python HomeWork]

---

# Python - Fuction(3) - Exercise
###### tags: `Python HomeWork`
**例**：着ぐるみのバイトの求人には幾つの条件があります。特に着ぐるみ自体の大きさが決まっているので身長制限があります。とある会社の求人には、160センチ以下が好ましいと書いていて、もし153センチの杏奈が応募したら果たしてTrueなのかFalseなのか、プログラミングで出力してください。
```
杏奈の身長を表す変数を利用して比較してください
annaHigh = 153

出力例：
True
```
:::info
code:
```python=
annaHigh = 153
print( annaHigh <= 160 )
```
答え：
![](https://i.imgur.com/SM2qRLJ.png)

:::
        
--------------------------------------------
## 問1：配列乱数最大値最小値平均取得
乱数で１～１００の範囲から整数を10個生成し、リストに格納して表示させ、その中での最大値と最小値と平均値を表示してください。

以下の指示に従ってください

* **自分**でn_max()とn_min()とavg()を作ること。
    * n_max()は渡されたリストから最大値をreturnします。
    * n_min()は渡されたリストから最小値をreturnします。
    * avg()は渡されたリストの要素の平均値をreturnします。
* フォーマット：平均数値を小数点以下2桁まで表示する事

```
**出力例１：**
55 64 74 45 20 46 37 95 56 81 
AVERAGE = 57.30
MAX = 95
MIN = 20

**出力例２：**
17 85 58 53 2 77 14 54 69 78 
AVERAGE = 50.70
MAX = 85
MIN = 2
```

:::info
Code:
```python=
"""
import random
random_num=10
total=0
list_empty=[]
for i in range(random_num):
    n=random.randint(1,100)
    list_empty.append(n)
    total+=n
for i in list_empty:
    print(i,end=" ")
print()
    

def n_max(random_num):
    return max(list_empty)

def n_min(random_num):
    return min(list_empty)

def avg(list_empty):
    return print("AVERAG = {:.2f}".format(total/10))

avg(list_empty)
print("MAX = ",n_max(random_num))
print("MIN = ",n_min(random_num))
"""

import random

def create_randList(number,fro,to):
    rand_list=[]
    for i in range(number):
        num=random.randint(fro,to)
        rand_list.append(num)
    return rand_list

def n_max(num_list):
    for i in range(len(num_list)):
        if i==0:
            big=num_list[i]
        if big<num_list[i]:
            big=num_list[i]
    return big
    
def n_min(num_list):
    for i in range(len(num_list)):
        if i==0:
            small=num_list[i]
        if small>num_list[i]:
            small=num_list[i]
    return small

def avg(num_list):
    return sum(num_list)/len(num_list)
def prt_rand(_list):
    for i in _list:
        print(i,end=" ")
        

rand_list=create_randList(10,1,100)
prt_rand(rand_list)

print("\nAVERAGE = {:.2f}".format(avg(rand_list)))
print("MAX = {}".format(n_max(rand_list)))
print("MIN = {}".format(n_min(rand_list)))
```
結果：
![](https://i.imgur.com/1VKnGTw.png)

:::

## 問2：アップサイドダウン＿World
「end」が入力されるまで、ユーザーにリストの内容を入力させます。
入力されたリストを逆順にして出力します。

* **関数reverse()を作成してください。**
この関数は、渡されたリストの順序を乱さずに、逆の順序に並び替えた新たなリストをretrunします。

```
**入力出力例**：
input: python
input: c++
input: html
input: php
input: end
original: ['python', 'c++', 'html', 'php']
reverse: ['php', 'html', 'c++', 'python']
```
:::info
code：
```python=
"""
def reverse(list_new):
    list_empty.reverse()
    return list_empty


list_empty=[]
list_new=0
while True:
    languages=input("input: ")
    if languages=="end":
        break
    list_empty.append(languages)
    list_new+=1
print("original: ",list_empty)
print("reverse: ",reverse(list_new))
"""

def reverse(list_empty):
    list_empty.reverse()
    return list_empty

list_empty=[]
while True:
    languages=input("input: ")
    if languages=="end":
        break
    list_empty.append(languages)
print("original: ",list_empty)
print("reverse: ",reverse(list_empty.copy()))
```
結果：
![](https://i.imgur.com/vDRhLYI.png)

:::

## 問3：タピオカ非常美味是非試食
以下はとあるクラス全員が注文した飲み物の内容です。
```
order_list =["玫瑰紅茶","咖啡凍紅茶","梅子紅茶","烏龍紅茶", 
             "伯爵紅茶","百香果紅茶","椰果紅茶","QQ紅茶",
             "布丁紅茶","梅子紅茶","蜂蜜紅茶","QQ紅茶",
             "布丁紅茶","椰果紅茶","薄荷紅茶","玫瑰紅茶",
             "珍珠紅茶","檸檬紅茶","椰果紅茶","檸檬紅茶",
             "波霸紅茶","奶香紅茶","QQ紅茶","蜂蜜紅茶", 
             "梅子紅茶","藍莓凍紅茶","烏龍紅茶","布丁紅茶",
             "梅子紅茶","蜂蜜紅茶","QQ紅茶","布丁紅茶",
             "椰果紅茶","薄荷紅茶","玫瑰紅茶","珍珠紅茶",
             "檸檬紅茶","椰果紅茶","檸檬紅茶","波霸紅茶",
             "奶香紅茶","QQ紅茶","蜂蜜紅茶", "梅子紅茶",
             "藍莓凍紅茶","烏龍紅茶","百香果紅茶","百香果紅茶"]
```
ただし、注文内容の数が多いので、とても分かりにくい上、飲み物を作る際も見落としてしまう可能性があります。ここで一つプログラムを作成して、お店の手伝いをしましょう。

* まず、n 種類の飲み物が注文されたかを表示してください。
* そして、n 種類の飲み物の内容を表示してください。
* 飲み物はそれぞれ何杯注文されたかを表示してくだい。

---
### 入出力例：
```
**入出力例：**
ご注文は全部で16種類
['咖啡凍紅茶', '伯爵紅茶', '布丁紅茶', '薄荷紅茶', '玫瑰紅茶', '珍珠紅茶', '椰果紅茶', '檸檬紅茶', '波霸紅茶', '奶香紅茶', 'QQ紅茶', '蜂蜜紅茶', '梅子紅茶', '藍莓凍紅茶', '烏龍紅茶', '百香果紅茶']

咖啡凍紅茶 : 1
伯爵紅茶 : 1
布丁紅茶 : 4
薄荷紅茶 : 2
玫瑰紅茶 : 3
珍珠紅茶 : 2
椰果紅茶 : 5
檸檬紅茶 : 4
波霸紅茶 : 2
奶香紅茶 : 2
QQ紅茶 : 5
蜂蜜紅茶 : 4
梅子紅茶 : 5
藍莓凍紅茶 : 2
烏龍紅茶 : 3
百香果紅茶 : 3
```
:::success
先生のおすすめはorder_listを事前にコピーしておくことです！
種類だけのリストを取得できたので、order_listのコピーがあれば、countメソッドでそれぞれの種類の個数を計算できます。

20-23のコードはなくても種類のリスト取得できるのでやってみてくださいね。
code：
```python=
"""
order_list =["玫瑰紅茶","咖啡凍紅茶","梅子紅茶","烏龍紅茶", 
             "伯爵紅茶","百香果紅茶","椰果紅茶","QQ紅茶",
             "布丁紅茶","梅子紅茶","蜂蜜紅茶","QQ紅茶",
             "布丁紅茶","椰果紅茶","薄荷紅茶","玫瑰紅茶",
             "珍珠紅茶","檸檬紅茶","椰果紅茶","檸檬紅茶",
             "波霸紅茶","奶香紅茶","QQ紅茶","蜂蜜紅茶", 
             "梅子紅茶","藍莓凍紅茶","烏龍紅茶","布丁紅茶",
             "梅子紅茶","蜂蜜紅茶","QQ紅茶","布丁紅茶",
             "椰果紅茶","薄荷紅茶","玫瑰紅茶","珍珠紅茶",
             "檸檬紅茶","椰果紅茶","檸檬紅茶","波霸紅茶",
             "奶香紅茶","QQ紅茶","蜂蜜紅茶", "梅子紅茶",
             "藍莓凍紅茶","烏龍紅茶","百香果紅茶","百香果紅茶"]

kinds_list=[]
pop_list=[]
for i in range(len(order_list)):
    pop_kinds=order_list.pop(0)
    while pop_kinds in order_list:
        order_list.remove(pop_kinds)
        kinds_list.append(pop_kinds)
        copy_kinds_list=kinds_list.copy()
        pop_kinds=copy_kinds_list.pop(0)
    kinds_list.clear()
    pop_list.append(pop_kinds)
    if order_list==[]:
        break
 

print("ご注文は全部で{}種類".format(len(pop_list)))
print(pop_list)

for i in range(len(pop_list)):
    print(pop_list[i]," : ")
    
#最後の注文された商品数を数えて、printする方法が分かりませんでした。
"""

def get_unique(target_list,string):
    for i in range(target_list.count(string)-1):
        target_list.remove(string)

order_list =["玫瑰紅茶","咖啡凍紅茶","梅子紅茶","烏龍紅茶", 
             "伯爵紅茶","百香果紅茶","椰果紅茶","QQ紅茶",
             "布丁紅茶","梅子紅茶","蜂蜜紅茶","QQ紅茶",
             "布丁紅茶","椰果紅茶","薄荷紅茶","玫瑰紅茶",
             "珍珠紅茶","檸檬紅茶","椰果紅茶","檸檬紅茶",
             "波霸紅茶","奶香紅茶","QQ紅茶","蜂蜜紅茶", 
             "梅子紅茶","藍莓凍紅茶","烏龍紅茶","布丁紅茶",
             "梅子紅茶","蜂蜜紅茶","QQ紅茶","布丁紅茶",
             "椰果紅茶","薄荷紅茶","玫瑰紅茶","珍珠紅茶",
             "檸檬紅茶","椰果紅茶","檸檬紅茶","波霸紅茶",
             "奶香紅茶","QQ紅茶","蜂蜜紅茶", "梅子紅茶",
             "藍莓凍紅茶","烏龍紅茶","百香果紅茶","百香果紅茶"]

c_ord_list=order_list.copy()

for i in order_list:
    get_unique(c_ord_list,i)

print("ご注文は全部で{}種類\n{}".format(len(c_ord_list),c_ord_list))
print()
for drk in c_ord_list:
    print(drk,":",order_list.count(drk))
```
結果：
![](https://i.imgur.com/jHKOqje.png)

:::


## 問4：慰労会不公平
年末、多くの会社では一年の労をねぎらう為、慰労会がレストランなどで行われています。そして、台湾の慰労会でよく抽選会が行われます。だいたい当たった人がプレゼントをもらうが、今回は全員にプレゼントがあります。

**プレゼントは以下の通りです**
```python=
prize_list=["商品券10000万円","PS5","Switch","ティッシュ一年分",
"休み50日間","映画チケット30枚","パリ100日間99泊旅行券",
"給料一年間2倍","パン一年間食べ放題","高級茶飲み放題"]
```
**社員は以下の通りです**
```python=
nameList=["Tyler","Brian","Kaitlyn","Dylan","Thomas",
      "Savannah","Gavin","Erin","Lucas","Kylie"]
```

プレゼントをランダムに配るプログラムを書きましょう。
* ランダムに社員にプレゼントを配り、誰が何をもらったかを表示してください。（プレゼントはどれも一つしかありません）（名前のフィールド幅：10）


---
### 入出力：
```
入出例１：
['PS5', '商品券10000万円', 'パリ100日間99泊旅行券', '休み50日間', '高級茶飲み放題', '映画チケット30枚', '給料一年間2倍', 'ティッシュ一年分', 'Switch', 'パン一年間食べ放題']
お名前:Tyler     　性格：PS5
お名前:Brian     　性格：商品券10000万円
お名前:Kaitlyn   　性格：パリ100日間99泊旅行券
お名前:Dylan     　性格：休み50日間
お名前:Thomas    　性格：高級茶飲み放題
お名前:Savannah  　性格：映画チケット30枚
お名前:Gavin     　性格：給料一年間2倍
お名前:Erin      　性格：ティッシュ一年分
お名前:Lucas     　性格：Switch
お名前:Kylie     　性格：パン一年間食べ放題

入出例２：
['給料一年間2倍', 'パリ100日間99泊旅行券', 'パン一年間食べ放題', '高級茶飲み放題', 'ティッシュ一年分', 'PS5', '映画チケット30枚', '商品券10000万円', '休み50日間', 'Switch']
お名前:Tyler     　性格：給料一年間2倍
お名前:Brian     　性格：パリ100日間99泊旅行券
お名前:Kaitlyn   　性格：パン一年間食べ放題
お名前:Dylan     　性格：高級茶飲み放題
お名前:Thomas    　性格：ティッシュ一年分
お名前:Savannah  　性格：PS5
お名前:Gavin     　性格：映画チケット30枚
お名前:Erin      　性格：商品券10000万円
お名前:Lucas     　性格：休み50日間
お名前:Kylie     　性格：Switch
```
:::success
**まず**、12、15、21行目のrandintのstopはlen(prize_list)-1 にしないとリストの範囲を超えてしまうことがあります。
例えば、要素が三つ入っているリストがあり、そのindexは以下のようになります。
```
 0 1 2
[5,4,3]
```
長さは３なので、random.randint(0,len(prize_list))で乱数を取得すると、場合によっては3を取得する可能性があります。ただ、要素が三つしかないリストには、index３の要素がありません。

**次に**、14行目の判定を注目！
12と13行目で生成した乱数で商品を取得しました。では、14行目の判定は数字がlistにあるかではなく、商品がリストにあるかにしてみましょう。
```
    while select_prize in prize_random_list:
        n=random.randint(0,len(prize_list)-1)
        select_prize=prize_list[n]
```

**最後に**、重複のやつは、21行目に注目！
21行目で乱数を生成していますが、特に重複しないような処理していないので重複がでます。ただ、実はここは乱数生成しなくても大丈夫です。先ほどはもう商品リストの中身をシャッフルしたので、今度はシャッフルした商品を順番に配ればいいです。
code：
```python=
"""
import random
prize_list=["商品券10000万円","PS5","Switch","ティッシュ一年分",
"休み50日間","映画チケット30枚","パリ100日間99泊旅行券",
"給料一年間2倍","パン一年間食べ放題","高級茶飲み放題"]

nameList=["Tyler","Brian","Kaitlyn","Dylan","Thomas",
      "Savannah","Gavin","Erin","Lucas","Kylie"]
      
prize_random_list=[]
random_n=10
for i in range(random_n):
    n=random.randint(0,len(prize_list))
    select_prize=prize_list[n]
    while n in prize_random_list:
        n=random.randint(0,len(prize_list))
    prize_random_list.append(select_prize)
print(prize_random_list)


for i in range(len(nameList)):
    n=random.randint(0,len(prize_list))
    prize=prize_list[n]
    print("お名前:{:<10}性格：{}".format(nameList[i],prize))

#prize_random_listの中が重複してしまい、その解決方法が分かりませんでした。
"""

import random

def rand_list(num):
    rand_list=[]
    for time in range(num):
        rand_num=random.randrange(num)
        while rand_num in rand_list:
            rand_num=random.randrange(num)
        rand_list.append(rand_num)
    return rand_list


prize_list=["商品券10000万円","PS5","Switch","ティッシュ一年分",
"休み50日間","映画チケット30枚","パリ100日間99泊旅行券",
"給料一年間2倍","パン一年間食べ放題","高級茶飲み放題"]

nameList=["Tyler","Brian","Kaitlyn","Dylan","Thomas",
      "Savannah","Gavin","Erin","Lucas","Kylie"]

people_num=len(nameList)
index_list=rand_list(people_num)

for i in index_list:
    print("お名前:{:10} 性格:{}".format(nameList[i],prize_list[i]))
```
結果：
![](https://i.imgur.com/pbS07Dp.png)
:::

## 問5：🐍ちゃんの帰宅
ある日、蛇ちゃんは道に迷っていて、どうしたらいいのか困っています。
🐍：「どうしよう！！おうちに帰りたい...😭」
君：「泣かないで！！蛇ちゃんのおうちどこにあるか知っているから、連れてったげる！」
🐍：「え..何で知っているの？」
君：「いいから😁」

**プログラム説明：**
* **関数prtMaze()** を作成してください。
関数は呼び出されたら、画面を描画します。
**例：**
🍎 🍎 🌲 
🌲 🍎 🌲 
🌲 🍎 🐍 

* **次に**、コマンド **「0:UP 1:right 2:left 3:down」** を表示し、コマンドを**入力できる**ようにしてください。
    1. 「0」が入力されたら、蛇ちゃんは上へ移動します。
    2. 「1」が入力されたら、蛇ちゃんは右へ移動します。
    3. 「2」が入力されたら、蛇ちゃんは左へ移動します。
    4. 「3」が入力されたら、蛇ちゃんは下へ移動します。

* **関数canGo()** を作成して、コマンドが入力されたら、移動できるかどうかを判定してください。

* **関数upMaze()** を作成して、もし移動できたなら、移動後の画面を更新してください。

* 🐍ちゃんが左上へ行くと、ゴールということでメッセージを出力してください。

```
**入出力例**

🍎 🍎 🌲 
🌲 🍎 🌲 
🌲 🍎 🐍 
0:UP 1:right 2:left 3:down

Go to :3
道がありません

🍎 🍎 🌲 
🌲 🍎 🌲 
🌲 🍎 🐍 
0:UP 1:right 2:left 3:down

Go to :0
道がありません

🍎 🍎 🌲 
🌲 🍎 🌲 
🌲 🍎 🐍 
0:UP 1:right 2:left 3:down

Go to :2

🍎 🍎 🌲 
🌲 🍎 🌲 
🌲 🐍 🍎 
0:UP 1:right 2:left 3:down

Go to :0

🍎 🍎 🌲 
🌲 🐍 🌲 
🌲 🍎 🍎 
0:UP 1:right 2:left 3:down

Go to :0

🍎 🐍 🌲 
🌲 🍎 🌲 
🌲 🍎 🍎 
0:UP 1:right 2:left 3:down

Go to :2

🐍 🍎 🌲 
🌲 🍎 🌲 
🌲 🍎 🍎 
---ゴール---

```
:::info
code:
```python=
"""
def prtMaze():
    print("🍎 🍎 🌲")
    print("🌲 🍎 🌲")
    print("🌲 🍎 🐍")

def canGo():
    

print("0:UP 1:right 2:left 3:down")
select=int(input("Go to :"))

#ヘビの動きのパターンを全部書くのではなく、何かもっと完結にできそうだけど、
#「画面」の判断（右に進む、左に進む、など。）の仕方が分かりませんでした。
"""

def prtMaze(maze):
    for i in range(len(maze)):
        if i%3==0:
            print()
        print(maze[i],end=" ")
    print()
    
def canGo(charaindex,maze):
    return not (charaindex<0 or charaindex>8 or maze[charaindex]=="🌲")

def updateMaze(charaindex,afterindex,maze):
    maze[charaindex]="🍎"
    maze[afterindex]="🐍"
    return afterindex

maze=["🍎","🍎","🌲","🌲","🍎","🌲","🌲","🍎","🐍"]
move=[-3,1,-1,3]
prtMaze(maze)
charaIndex=maze.index("🐍")

while charaIndex:
    print("0:UP 1:right 2:left 3:down")
    command=int(input("Go to :"))
    quantity=move[command]
    afterIndex=charaIndex+quantity
    if canGo(afterIndex,maze):
        charaIndex=updateMaze(charaIndex,afterIndex,maze)
    else:
        print("道がありません")
    prtMaze(maze)
    
print("---ゴール---")

```
結果：
![](https://i.imgur.com/xTQEiNu.png)
![](https://i.imgur.com/JgVatZz.png)

:::