---
title: 109-2進階程式設計期末考
tags: 程式設計
---
# 程式實作: 小美的冰箱
在「防疫期間避免外出」的原則下,**阿北**告訴小美每個禮拜出門買一次就好,每次買個兩個禮拜的份量這樣可以避免暴露在危險之中。
聽了阿北的建議,小美準備了一個大大大冰箱來存放採買回來的食物。每次買來的食材都非常多,為了防止食物太多又放到過期,小美採取以下策略:
1. 冰箱以「**後進先出**」方式存取,以方便取出食材。
2. 為避免食物過期,每次採買回來會先「**取出所有**」冰箱內食材,併同新採買的食材放回冰箱。(原本最冰箱**最深處**的會變成**最外層**)
3. 非採買日會從冰箱拿出2個食材煮晚餐;而採買日會順便買晚餐,**不開伙**煮晚餐。
4. 當冰箱沒有食材時小美一定會去採買。
你很好奇如果依照這樣的規則運作,一段時間後冰箱到底會有那些食材,於是你決定紀錄每次阿美放入冰箱的食材,然後寫一個程式來記錄$n$天之後,阿美的冰箱還有哪些食材。
## 輸入
第 1行代表你記錄的天數 $n$ ( $3 \leq n \leq 1000$) ;第 2~n+1行,由1個數字及 $m$ 項物品
* $0$ 代表今天不採買,只煮晚餐(會消耗冰箱$2$項食材)。
* 數字$m$ ( $1 \leq m \leq 1000$) 及 $m$ 個文字,代表今天去採買了$m$項,以及要放入冰箱的食材。<br>每個項目中間以空格隔開。
## 輸出
共2行。
第1行代表冰箱剩下 $x$ 樣食材
第2行從冰箱最深處往外依序輸出食材名稱,中間以空白隔開。
若冰箱內沒有東西,請輸出「empty」。
## Sample input / output
<table style="width:100%">
<th>Sample Input 1</th><th>Sample Output 1</th><th>Sample Input 2</th><th>Sample Output 2</th>
<tr style="font-size:1em"><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
3
6 a b c d e f
0
4 k j v u
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
8
k j v u d c b a
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
7
5 a b c d e
0
0
7 k j l m n o p
0
0
2 u q
```
</td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
6
u q m l j k
```
</td></tr>
</table>
---
# 程式實作: 教士與城堡(Bishop & Rook)
西洋棋遊戲規則中,城堡(Rook)可以直或橫的行走(下左圖);而教士(Bishop)可以斜向行走(下右圖)。
 
圖片來源:wiki([城堡](https://en.wikipedia.org/wiki/Rook_(chess))) wiki([教士](https://en.wikipedia.org/wiki/Bishop_(chess)))
給一個西洋棋盤面(大小為$8 \times 8$),上面只放上 $1$城堡、 $1$教士,請判斷哪一方獲得勝利。
## 輸入
$8 \times 8$的西洋棋盤面。
* 數字 $0$ 代表沒有棋子
* 數字 $1$ 代表**城堡**
* 數字 $2$ 代表**教士**
## 輸出
共1行,代表二棋子對決的勝利者。
* 城堡勝出,輸出 rook
* 教士勝出,輸出 bishop
* 若無人勝出,輸出 tie
## Sample input / output
<table style="width:100%">
<th>Sample Input 1</th><th>Sample Output 1</th><th>Sample Input 2</th><th>Sample Output 2</th>
<tr style="font-size:1em"><td style="vertical-align: top;padding:0"><div style="border-width:0px">
```
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px">
```
rook
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px">
```
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 2 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
```
</td><td style="vertical-align: top;padding:0"><div style="border-width:0px">
```
bishop
```
</td></tr>
</table>
---
# 程式實作:大物流時代
真高牆物流公司因應網路購物的熱潮,現階段接單接到手軟~ 於是總公司決定決定讓文山區集散貨中心採取「分流」方式上班。
文山區集散貨中心共有$3$位員工,依照階級高低分別是:老大(Boss)、美美(Mei)、阿霹(Peter),經過討論後決定的上班規則如下:
* 自6/1為基準日,稱為第$1$日、6/30日為第$30$日、7/1為第$31$日...以此類推
* 第 $n$ 日,如果為 $7$ 的倍數,則**老大**上班~
* 第 $n$ 日,如果為 $3$ 的倍數,則**美美**上班~
* 第 $n$ 日,如果為 $2$ 的倍數,則**阿霹**上班~
* 若第 $n$ 日,為多個數字的倍數,則符合條件的同仁都上班,請依照階級高->低方式顯示。
* 若第 $n$ 日無法被$7,3,2$整除,則**老大**上班~
因為大家送貨都很忙,想請聰明的你幫忙設計個程式,當輸入第$n$日時,可以快速地告訴大家這天誰上班。
## 輸入
共 $1$ 行,代表今天為第$n$天,為整數($1 \leq n \leq 1000$)。
## 輸出
今天輪到要上班的同仁英文名。一行一位同仁方式輸出。
若同一天複數同仁上班,請依照職位高低順序 老大(Boss) -> 美美(Mei) -> 阿霹(Peter) 輸出
## Sample input / output
<table style="width:100%">
<th>Sample Input 1</th><th>Sample Output 1</th><th>Sample Input 2</th><th>Sample Output 2</th>
<tr><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
10
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px;margin:0px">
```
Peter
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
6
```
</td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
Mei
Peter
```
</td></tr>
</table>
## [補充]
* 本題前10筆資料,保證為$2$或$3$或$7$的倍數。
* 至少60%的測試資料是$2$或$3$或$7$的倍數。
---
# 程式實作:遠距課的學習效果
線上學習開跑了!與實體上課最不一樣的就是老師無法快速從同學的神情觀察到上課的效果,而必須透過各種評量的手段來知道學生學習成效如何。
阿凡老師在這一個多月的線上課整理出一套方法,阿凡老師每堂課必定小考,並藉由分析小考成績來評估學生學習的效果。這套方法主要透過班上小考的$3$種統計數字來判斷:
* 總分 Total score ,越高表示表現越好。
* 平均 Average score ,若有低於60,表示需要補強。
* 變異數 Variance ,數字越大,代表班上學習效果的落差很大。
不會寫程式的阿凡老師想請你幫忙設計一個程式,只要輸入班上小考的成績,以及想要計算的項目,就可以快速把數字算出來。
:::info
[**補充**] 本題採用之變異數計算公式為:離均差$(x_i - \bar{x})$的平方和除以$(n-1)$
$\sum_{i=1}^{n} \dfrac{(x_i - \bar{x})^2} { (n-1)}$
例如:有四個數字, [$57, 60, 75, 80$] 計算變異數,先算出平均數為:$68$,
四數字的離均差為[$(57-68),(60-68),(75-68),(80-68)$]
[$-11,-8,7,12$] 平方後相加為:$121+64+49+144=378$
所以其變異數為:$378/(4-1)=126$
:::
## 輸入
分為$3$部分,第$1$行,一個小寫英文代碼 ($t , a , v$),代表想求的數字。
$t$ 代表總分;$a$ 代表平均;$v$ 代表變異數
第$2$行,整數 $n$,代表這次有 $n$ 位同學參加小考。
第$3$行開始有 $n$ 行,代表$n$位同學的小考分數。
## 輸出
共$1$行,1個整數**不包含小數點**,代表求出來的數字。
## Sample input / output
<table style="width:100%">
<th>Sample Input 1</th><th>Sample Output 1</th><th>Sample Input 2</th><th>Sample Output 2</th>
<tr style="font-size:1em"><td style="vertical-align: top;padding:0"><div style="border-width:0px;padding:0;margin:0">
```
a
5
72
82
61
70
80
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px;margin:0px;padding:0">
```
73
```
</div></td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
t
5
65
61
75
70
79
```
</td><td style="vertical-align: top;padding:0"><div style="border-width:0px;">
```
350
```
</td></tr>
</table>
## [補充]
* 本題數字(包含總分、平均、變異數)皆為整數,不必輸出小數點。
* 前5筆資料參加小考人數皆為5人。
* 80%的測試資料為計算總分或平均。