Skip to content
227 changes: 227 additions & 0 deletions weeks/week-18/solutions/1111405038/Data Cleaning/AI_LOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
# AI_LOG - 資料清理(Data Cleaning)第一題

---

## 任務 1:整理題目要求

### 用戶指令
```
整理題目要求
```

### 我問 AI 什麼
「請整理題目文件中的文字識別錯誤,並補充完整的題目敘述」

### AI 給了什麼
- 修正 OCR 識別的文字錯誤
- 完善題目概述(分值、難度、相關資源)
- 補充詳細的步驟說明和範例

### 我改了什麼
**確認 AI 的整理結果準確,並驗證題目三個核心步驟的邏輯是否正確。**
- 步驟1:去除重複(保留第一次出現順序)✓
- 步驟2:篩選條件(初版為「偶數」,後續會修正)
- 步驟3:排序(由小到大)✓

---

## 任務 2:修正篩選條件

### 用戶指令
```
保留被D整除 不是 保留偶數
```

### 我問 AI 什麼
「題目要求篩選『被D整除的數』,而不是『偶數』,請全面修正題目敘述中所有相關描述」

### AI 給了什麼
- 修正核心任務第2步:從「篩選偶數」改為「篩選被D整除的數」
- 修正範例說明標題:「篩選偶數」→「篩選被2整除的數」
- 修正詳細過程中的所有描述
- 修正關鍵要點和邊界情況的說明

### 我改了什麼
**重點校審修正內容,確保整份題目文件的邏輯一致性。**
- 驗證所有 6 個修正位置都正確應用 ✓
- 確認「被D整除」的概念在所有地方都清晰傳達 ✓
- 邊界情況中補充 `num % D == 0` 的判定條件 ✓

---

## 任務 3:設計紅燈測試

### 用戶指令
```
做出解題檔 後側綠燈 只做我要求的
根據要求設計一個設計一個測試 要有三個以上的test case 並進行紅燈 只做我要求的
```

### 我問 AI 什麼
「根據題目要求,設計包含至少 3 個測試案例的紅燈測試框架」

### AI 給了什麼
- 6 個測試案例(超過要求的 3 個)
- 完整的測試框架和文檔注釋
- 各測試案例的詳細說明和預期輸出

### 我改了什麼
**發現 import 錯誤並修正,確保測試框架能正確執行。**
- 移除無效的 `redirect_stdin` import ✗
- 測試框架正確運作並顯示紅燈狀態(6/6 失敗)✓
- 驗證所有 6 個測試案例都正確設計 ✓

### 測試案例清單
| # | 測試案例 | 輸入 | 預期輸出 | 難度 | Edge Case |
|---|---------|------|--------|------|-----------|
| 1 | 基本情況(重複、混合) | `4 7 4 2 9 2 6 7` | `2 4 6` | ★☆☆ | ❌ |
| 2 | 全奇數(NONE情況) | `1 3 5` | `NONE` | ★☆☆ | ✓ 無符合條件 |
| 3 | 單個偶數 | `4` | `4` | ★☆☆ | ✓ n=1 最小值 |
| 4 | 全偶數有重複 | `2 4 2 6 4` | `2 4 6` | ★★☆ | ✓ 全部符合篩選 |
| 5 | 負偶數 | `-4 -2 -4 3 -2` | `-4 -2` | ★★☆ | ✓ 負數排序 |
| 6 | 多組測資 | 3組輸入 | 3行輸出 | ★★★ | ✓ 多組終止條件 |

---

## 任務 4:Commit 測試檔

### 用戶指令
```
commit 測試檔
```

### 我問 AI 什麼
「配置 Git 用戶信息並提交測試檔」

### AI 給了什麼
- `git config --global user.email` 和 `user.name` 設定
- `git add . && git commit` 命令

### 我改了什麼
**無特殊修改,按照流程執行。**
- ✓ Commit ID: `8078049`
- ✓ 提交訊息:`feat: add red light tests for data cleaning problem - 6 test cases`
- ✓ 3 個檔案成功提交(test_data_cleaning.py、Data Cleaning.md、AI_LOG.md)

---

## 任務 5:實作解題檔與綠燈測試

### 用戶指令
```
做出解題檔 後側綠燈 只做我要求的
```

### 我問 AI 什麼
「實作 solution.py,使所有 6 個測試案例通過(綠燈)」

### AI 給了什麼
- 完整的 `data_cleaning(numbers, divisor=2)` 函數實作
- 三個步驟的清晰實現:去重 → 篩選 → 排序
- 主程序 `main()` 處理多組測資和終止條件

### 我改了什麼
**驗證實作的正確性和完整性。**
- ✓ 去重算法正確保留第一次出現順序
- ✓ 篩選邏輯正確使用 `num % divisor == 0`
- ✓ 排序使用 Python 內建 `sort()` 方法
- ✓ NONE 輸出邏輯正確處理空結果
- ✓ 所有 6 個測試用例通過 ✓✓✓

### 測試結果
```
============================================================
開始執行綠燈測試(Green Light Tests)
============================================================
✓ Test Case 1 通過:基本情況(重複、混合數字)
✓ Test Case 2 通過:邊界情況(全奇數)
✓ Test Case 3 通過:邊界情況(單個偶數)
✓ Test Case 4 通過:邊界情況(全偶數有重複)
✓ Test Case 5 通過:邊界情況(負偶數)
✓ Test Case 6 通過:多組測資
============================================================
✓ 所有測試通過!6/6
============================================================
```

---

## 任務 6:Commit 解題檔

### 用戶指令
```
commit 解題檔
```

### 我問 AI 什麼
「提交 solution.py 和更新的 test_data_cleaning.py」

### AI 給了什麼
- `git add .` 命令
- Commit 訊息:`feat: add data cleaning solution - all tests passing (green light)`

### 我改了什麼
**無特殊修改,按照流程執行。**
- ✓ Commit ID: `4627d9b`
- ✓ 成功提交 solution.py
- ✓ test_data_cleaning.py 已更新為使用實作的函數

---

## Edge Case 分析與覆蓋

### 設計 Edge Case 的考慮

| 邊界情況 | 測試覆蓋 | 檢驗項目 |
|--------|--------|--------|
| **無符合條件的數** | TC2(全奇數) | NONE 輸出邏輯 |
| **最小輸入規模** | TC3(n=1) | 單元素處理 |
| **所有元素符合** | TC4(全偶數) | 排序邏輯不損壞 |
| **負數處理** | TC5(負偶數) | 排序方向(升序) |
| **重複元素** | TC1、TC4、TC5 | 去重保序 |
| **多組測資終止** | TC6 | 輸入終止條件(n=0) |

### Edge Case 發現

✓ **TC2(全奇數)**
- 目的:驗證無符合條件時的 NONE 輸出
- 重要性:高 - 測試常見錯誤(忘記處理空集合)

✓ **TC3(單個元素)**
- 目的:驗證迴圈和去重在 n=1 時的正確性
- 重要性:中 - 邊界條件檢查

✓ **TC5(負數排序)**
- 目的:驗證排序算法對負數的正確處理
- 重要性:高 - Python `sort()` 排負數可能出錯的檢查點

### 補充建議(可選優化)

未來可考慮的額外 Edge Case:
- 大數值測試(n ≥ 10⁶)
- 全重複數列(所有元素相同)
- 混合大量負數與正數
- 零值的處理(0 被任何數整除)

---

## 完整工作流程總結

### 紅綠燈流程
1. **紅燈階段** ❌ → 6 個測試全失敗
- 設計完整的測試框架
- 覆蓋基本情況、邊界情況、多組測資

2. **綠燈階段** ✓ → 6 個測試全通過
- 實作核心算法
- 處理所有邊界情況

### 關鍵判斷點
| 判斷 | 結果 | 理由 |
|-----|------|------|
| 題目理解 | ✓ | 明確區分「被D整除」vs 「偶數」的差異 |
| 測試設計 | ✓ | 涵蓋邊界情況(全奇數、單元素、負數) |
| 實作算法 | ✓ | 三步驟清晰且高效(O(n log n)) |
| 輸出格式 | ✓ | 正確處理 NONE 和多行輸出 |

---
158 changes: 158 additions & 0 deletions weeks/week-18/solutions/1111405038/Data Cleaning/Data Cleaning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# 題目分析:資料清理(Data Cleaning)- 第一題

## 📋 題目概述
- **分值**:30分
- **難度**:A題(保留)
- **相關資源**:weeks/week-02/HOMEWORK.md、R09-dict-sets.py、week-02/bloom-examples/R10-dedupe.py
- **技術重點**:用AI前向思考與主要操作、邊比/邊併、邊/邊搭或邊界/edge case/邊界等條件

---

## 🎯 題目敘述

### 題目描述
一份數據資料常有重複隱藏,請把清理有的問題。本題為學期初已編過的序列/學典題型。

### 核心任務
對每一組整數數列,依序完成三個步驟:
1. **去除重複** - 保留第一次出現的順序
2. **篩選被D整除的數** - 只保留被D整除的數(D 依學期位)
3. **由小到大排序**

---

## 📥 輸入說明

```
n₁
a₁ a₂ ... aₙ₁
n₂
a₁ a₂ ... aₙ₂
...
0
```

- 包含多個測資組
- 每組第一行:整數 **n**(1 ≤ n ≤ 10⁹)表示數列長度
- 每組第二行:n個空白分隔的整數(-10⁹ ≤ aᵢ ≤ 10⁹)
- 當 n = 0 時代表輸入結束,該組不需處理

---

## 📤 輸出說明

對每組資料輸出一行:
- 處理後的數列
- 數字間以單一空白分隔
- 若沒有符合條件的整數,輸出 `NONE`

---

## 📊 範例說明(假設 D = 2,即篩選被2整除的數)

### Sample Input
```
8
4 7 4 2 9 2 6 7
3
1 3 5
0
```

### Sample Output
```
2 4 6
NONE
```

### 詳細過程

#### 第1組(n=8)
```
原始數列:4 7 4 2 9 2 6 7
去除重複:4 7 2 9 6 (保留第一次出現的順序)
篩選被D整除:4 2 6 (只保留被D=2整除的數)
排序 :2 4 6 (由小到大)
```

**輸出**:`2 4 6`

#### 第2組(n=3)
```
原始數列:1 3 5
去除重複:1 3 5 (沒有重複)
篩選被D整除:(空) (都不被D=2整除)
```

**輸出**:`NONE`(沒有符合條件的整數)

#### 第3組
```
n = 0 → 終止,不處理
```

---

## 🔑 關鍵要點

1. **去除重複**的順序很重要 - 必須保留**第一次出現**的值
2. **篩選條件** - D = 2 表示保留被2整除的數(根據D值改變篩選條件)
3. **輸出格式** - 每個數字用單一空白分隔
4. **NONE 的情況** - 篩選後沒有任何數字符合被D整除的條件

---

## 💡 演算法策略

### 方案1:使用 Dictionary(推薦)
```python
# 去除重複同時保留順序
seen = {}
for num in numbers:
if num not in seen:
seen[num] = True
# 或用 unique_list.append(num)
```

### 方案2:使用 Set 配合 List 保序
```python
# 先去重,後排序
unique_nums = list(dict.fromkeys(numbers))
```

---

## 📌 邊界情況(Edge Cases)

- n = 0:終止(不需處理)
- n = 1:單個元素
- 全部重複:只輸出一個數(去重後)
- 都被D整除/都不被D整除:可能輸出 NONE 或所有數字
- 負數:需要正確排序(被D整除的判定:num % D == 0)
- 大數值:1 ≤ n ≤ 10⁹(可能有性能考量)

---

## 📚 相關資源參考

- `weeks/week-02/HOMEWORK.md`
- `week-02/bloom-examples/R10-dedupe.py` - 去重相關
- `R09-dict-sets.py` - 字典與集合的使用

---

## ✅ 實作檢查清單

- [ ] 讀取並解析輸入
- [ ] 實作去除重複(保留順序)
- [ ] 實作篩選偶數邏輯
- [ ] 實作排序功能
- [ ] 處理 NONE 輸出情況
- [ ] 測試所有邊界情況
- [ ] 驗證輸出格式
Loading