Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions weeks/week-18/solutions/1112405041/A02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
def caesar_encrypt(text, shift):
result = []
for ch in text:
if 'A' <= ch <= 'Z':
result.append(chr((ord(ch) - ord('A') + shift) % 26 + ord('A')))
elif 'a' <= ch <= 'z':
result.append(chr((ord(ch) - ord('a') + shift) % 26 + ord('a')))
else:
result.append(ch)
return ''.join(result)


def main():
import sys
for line in sys.stdin:
line = line.rstrip("\n")
print(caesar_encrypt(line, shift=2))


if __name__ == "__main__":
main()
252 changes: 252 additions & 0 deletions weeks/week-18/solutions/1112405041/AI_LOG_A02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
# AI_LOG - A02 凱撒密碼

## 我問 AI 什麼

> 逐字貼上我實際輸入的提示詞:
慢慢拆解我的 問題 !!!! 我有符合情境? 情境 SCENARIO
這是一場 CPE 模擬實戰:題目分 A / B / C 三區,難度與分數遞增。規則照平時練的來——每一題用 TDD + Git PR SOP 交卷:開分支 → 先寫測試 (紅燈) commit → 再寫實作 (綠燈) commit → push → 開 PR (你的 fork 分支 → 課程 repo main) → PR 附 AI_LOG.md。 可翻書、可上網、可用 AI,但時間會被吃掉,勝負在熟練度。先拿 A 區保底,再往 B、C 推進。(我的第一題 有嗎?)第二題 凱撒密碼 (Caesar Cipher) [ A 區 · 保底 ] [ 25 分 ]

步驟②「再拿一塊保底」:用古典凱撒位移加密一段文字。本題為 W3 字串處理題型。

相關教材 (可參考):weeks/week-08/QUESTION-10222.md (鍵盤右移位移密碼,本題原型)、week-03/README.md (字串加密與頻率)。
! 用 AI 前先回答首頁五項檢查表 (簽名 / 邊界 / 例外 / edge case / 驗收),填滿才開始協作。

~ 一、題目敘述
將每行字串中的英文字母向後位移 SHIFT 位 (SHIFT 依學號個位,見參數頁 我是 位移 SHIFT=2 ):大寫在 A~Z 內循環、小寫在 a~z 內循環 (例如 SHIFT=3 時 z→c、Y→B);非英文字母字元 (空白、數字、標點) 原樣保留。

~ 二、輸入說明
輸入包含多行,每行一個字串 (可能含空白、標點,長度 ≤ 1000),讀到檔案結尾 (EOF) 為止。

~ 三、輸出說明
對每一行輸入,輸出加密後的字串 (一行對一行)。

~ 四、範例 (Sample, 假設 SHIFT = 3)
Sample Input

Hello, NPU!
abc XYZ
Sample Output

Khoor, QSX!
def ABC
H→K, e→h, l→o, o→r;逗號、空白、驚嘆號不變。X→A, Y→B, Z→C 循環回開頭。

∠ 先填你的參數,再算「同一組 Sample Input」的預期輸出
我的位移 SHIFT = 2 (個位 u → u%25+1 )
用你的 SHIFT 重算上面 Sample Input 的輸出 (兩行):
Hello, NPU! → ______________________
abc XYZ → ______________________

驗收:PR + TA 隱藏測資 (配分見首頁檢查表)。



回 main 開新分支(建議): 第二題 做 A02



所以第二題 你跟我說要做 甚麼 ?(還有要用老師 AGENT.MD


~ 三、輸出說明 對每一行輸入,輸出加密後的字串 (一行對一行)。
~ 四、範例 (Sample, 假設 SHIFT = 3) Sample Input
Hello, NPU!
abc XYZ
Sample Output
Khoor, QSX!
def ABC
H→K, e→h, l→o, o→r;逗號、空白、驚嘆號不變。X→A, Y→B, Z→C 循環回開頭。
∠ 先填你的參數,再算「同一組 Sample Input」的預期輸出 我的位移 SHIFT = 2 (個位 u → u%25+1 ) 用你的 SHIFT 重算上面 Sample Input 的輸出 (兩行): Hello, NPU! → ______________________ abc XYZ → ______________________
驗收:PR + TA 隱藏測資 (配分見首頁檢查表)。 國立澎湖科技大學 資訊工程系 趙達毅 第 4 / 6 頁



慢慢拆解我的 問題 !!!! 我有符合情境? 情境 SCENARIO
這是一場 CPE 模擬實戰:題目分 A / B / C 三區,難度與分數遞增。規則照平時練的來——每一題用 TDD + Git PR SOP 交卷:開分支 → 先寫測試 (紅燈) commit → 再寫實作 (綠燈) commit → push → 開 PR (你的 fork 分支 → 課程 repo main) → PR 附 AI_LOG.md。 可翻書、可上網、可用 AI,但時間會被吃掉,勝負在熟練度。先拿 A 區保底,再往 B、C 推進。(我的第一題 有嗎?)第二題 凱撒密碼 (Caesar Cipher) [ A 區 · 保底 ] [ 25 分 ]

步驟②「再拿一塊保底」:用古典凱撒位移加密一段文字。本題為 W3 字串處理題型。

相關教材 (可參考):weeks/week-08/QUESTION-10222.md (鍵盤右移位移密碼,本題原型)、week-03/README.md (字串加密與頻率)。
! 用 AI 前先回答首頁五項檢查表 (簽名 / 邊界 / 例外 / edge case / 驗收),填滿才開始協作。

~ 一、題目敘述
將每行字串中的英文字母向後位移 SHIFT 位 (SHIFT 依學號個位,見參數頁 我是 位移 SHIFT=2 ):大寫在 A~Z 內循環、小寫在 a~z 內循環 (例如 SHIFT=3 時 z→c、Y→B);非英文字母字元 (空白、數字、標點) 原樣保留。

~ 二、輸入說明
輸入包含多行,每行一個字串 (可能含空白、標點,長度 ≤ 1000),讀到檔案結尾 (EOF) 為止。

~ 三、輸出說明
對每一行輸入,輸出加密後的字串 (一行對一行)。

~ 四、範例 (Sample, 假設 SHIFT = 3)
Sample Input

Hello, NPU!
abc XYZ
Sample Output

Khoor, QSX!
def ABC
H→K, e→h, l→o, o→r;逗號、空白、驚嘆號不變。X→A, Y→B, Z→C 循環回開頭。

∠ 先填你的參數,再算「同一組 Sample Input」的預期輸出
我的位移 SHIFT = 2 (個位 u → u%25+1 )
用你的 SHIFT 重算上面 Sample Input 的輸出 (兩行):
Hello, NPU! → ______________________
abc XYZ → ______________________

驗收:PR + TA 隱藏測資 (配分見首頁檢查表)。



回 main 開新分支(建議): 第二題 做 A02



所以第二題 你跟我說要做 甚麼 ?(還有要用老師 AGENT.MD


~ 三、輸出說明 對每一行輸入,輸出加密後的字串 (一行對一行)。
~ 四、範例 (Sample, 假設 SHIFT = 3) Sample Input
Hello, NPU!
abc XYZ
Sample Output
Khoor, QSX!
def ABC
H→K, e→h, l→o, o→r;逗號、空白、驚嘆號不變。X→A, Y→B, Z→C 循環回開頭。
∠ 先填你的參數,再算「同一組 Sample Input」的預期輸出 我的位移 SHIFT = 2 (個位 u → u%25+1 ) 用你的 SHIFT 重算上面 Sample Input 的輸出 (兩行): Hello, NPU! → ______________________ abc XYZ → ______________________
驗收:PR + TA 隱藏測資 (配分見首頁檢查表)。 國立澎湖科技大學 資訊工程系 趙達毅 第 4 / 6 頁



A02 根據 AGENT .MD 你先教學 1-5 階段要問 甚麼 再開始 詢問我 順便 給我你想要怎麼設計 甚麼 然後根據題目 要求 設計 我看 再來 採用 慢慢拆解我的 問題 !!!! 我有符合情境? 情境 SCENARIO
這是一場 CPE 模擬實戰:題目分 A / B / C 三區,難度與分數遞增。規則照平時練的來——每一題用 TDD + Git PR SOP 交卷:開分支 → 先寫測試 (紅燈) commit → 再寫實作 (綠燈) commit → push → 開 PR (你的 fork 分支 → 課程 repo main) → PR 附 AI_LOG.md。 可翻書、可上網、可用 AI,但時間會被吃掉,勝負在熟練度。先拿 A 區保底,再往 B、C 推進。(我的第一題 有嗎?)第二題 凱撒密碼 (Caesar Cipher) [ A 區 · 保底 ] [ 25 分 ]

步驟②「再拿一塊保底」:用古典凱撒位移加密一段文字。本題為 W3 字串處理題型。

相關教材 (可參考):weeks/week-08/QUESTION-10222.md (鍵盤右移位移密碼,本題原型)、week-03/README.md (字串加密與頻率)。
! 用 AI 前先回答首頁五項檢查表 (簽名 / 邊界 / 例外 / edge case / 驗收),填滿才開始協作。

~ 一、題目敘述
將每行字串中的英文字母向後位移 SHIFT 位 (SHIFT 依學號個位,見參數頁 我是 位移 SHIFT=2 ):大寫在 A~Z 內循環、小寫在 a~z 內循環 (例如 SHIFT=3 時 z→c、Y→B);非英文字母字元 (空白、數字、標點) 原樣保留。

~ 二、輸入說明
輸入包含多行,每行一個字串 (可能含空白、標點,長度 ≤ 1000),讀到檔案結尾 (EOF) 為止。

~ 三、輸出說明
對每一行輸入,輸出加密後的字串 (一行對一行)。

~ 四、範例 (Sample, 假設 SHIFT = 3)
Sample Input

Hello, NPU!
abc XYZ
Sample Output

Khoor, QSX!
def ABC
H→K, e→h, l→o, o→r;逗號、空白、驚嘆號不變。X→A, Y→B, Z→C 循環回開頭。

∠ 先填你的參數,再算「同一組 Sample Input」的預期輸出
我的位移 SHIFT = 2 (個位 u → u%25+1 )
用你的 SHIFT 重算上面 Sample Input 的輸出 (兩行):
Hello, NPU! → ______________________
abc XYZ → ______________________

驗收:PR + TA 隱藏測資 (配分見首頁檢查表)。



回 main 開新分支(建議): 第二題 做 A02



所以第二題 你跟我說要做 甚麼 ?(還有要用老師 AGENT.MD


~ 三、輸出說明 對每一行輸入,輸出加密後的字串 (一行對一行)。
~ 四、範例 (Sample, 假設 SHIFT = 3) Sample Input
Hello, NPU!
abc XYZ
Sample Output
Khoor, QSX!
def ABC
H→K, e→h, l→o, o→r;逗號、空白、驚嘆號不變。X→A, Y→B, Z→C 循環回開頭。
∠ 先填你的參數,再算「同一組 Sample Input」的預期輸出 我的位移 SHIFT = 2 (個位 u → u%25+1 ) 用你的 SHIFT 重算上面 Sample Input 的輸出 (兩行): Hello, NPU! → ______________________ abc XYZ → ______________________
驗收:PR + TA 隱藏測資 (配分見首頁檢查表)。 國立澎湖科技大學 資訊工程系 趙達毅 第 4 / 6 頁


你覺得這個設計可以嗎?你確認後我開始問你檢查表的答案,然後出測試 code。 我覺得很棒 問之前 題目 要洩題給我 再給我答案


我符合 老師的 SAMPLE INPUT 的 預期輸出? 跟 SAMPLE OUT PUT?


函式名稱:caesar_encrypt
參數:text: str (要加密的字串), shift: int (位移量)
回傳:str (加密後的字串) 每行長度 ≤ 1000 字元
讀取方式 for line in sys.stdin 讀到 EOF
結束條件 EOF(沒有固定行數) 情況 處理方式
空行 直接 print() 輸出空行(保留行數對齊)
非英文字母 原樣保留,不做任何處理 # Edge case 案例 SHIFT=2 預期輸出 陷阱
1 大寫繞圈 XYZ ZAB Y(89)+2=91→65(A), Z(90)+2=92→66(B)
2 小寫繞圈 xyz zab y(121)+2=123→97(a), z(122)+2=124→98(b)
3 非字母不動 123 !@# 123 !@# 數字、空白、標點全部保留
4 空字串 "" "" 迴圈跑 0 次,回傳空字串 驗收標準 — 預期答案
你的 SHIFT = 2

Sample Input: Sample Output (SHIFT=2):
Hello, NPU! → Jgnnq, NRW!
abc XYZ → cde ZAB


先給我 POWER SHELL 第二題執行紅燈測試

OK 繼續

做好了 紅燈

我該怎麼 驗算程式 直接開 TEST CASE? 或手動 輸入 ?新增 AI LOG.MD 翻本 ( LOOK WEEK 15 16 17 FOLDER ) 幫我查 (並補正至 A02

no changes added to commit (use "git add" and/or "git commit -a")
PS C:\Users\User\Downloads\20260622clip\2026-python\weeks\week-18\solutions\1112405041> Write-Output "Hello, NPU!" "abc XYZ" | python weeks\week-18\solutions\1112405041\A02.py
C:\Users\User\AppData\Local\Programs\Python\Python313\python.exe: can't open file 'C:\\Users\\User\\Downloads\\20260622clip\\2026-python\\weeks\\week-18\\solutions\\1112405041\\weeks\\week-18\\solutions\\1112405041\\A02.py': [Errno 2] No such file or directory
PS C:\Users\User\Downloads\20260622clip\2026-python\weeks\week-18\solutions\1112405041> (我要測試!!!!


去開PR 你的 路徑 要怎麼 開?



摘要
1. 分析 week 15 16 17 全部檔案 跟 AGENT.MD 重點是?考試要準備什麼?
2. 第二題 凱撒密碼,將每行英文字母向後位移 SHIFT=2,大寫 A~Z 循環、小寫 a~z 循環,非字母不動。請先教學檢查表 1-5 再回答。
3. 根據 ✅簽名 ✅邊界 ✅例外 ✅Edge ✅驗收 逐一測試,教我使用 powershell 執行紅燈綠燈。
4. 幫我產出 A02.py 的測試 stub 與實作 code。請先給測試(紅燈),我 commit 後再給實作(綠燈)。


## AI 給了什麼

> AI 回應重點:

1. 先教學 5 項檢查表的原理與預期答案,並給出他的設計方案(`caesar_encrypt(text, shift)`,用 ord/chr + %26 做循環位移)
2. 我確認採用設計後,AI 給 `test_A02.py` 共 8 個測試案例(基本、大寫繞圈、小寫繞圈、非字母不變、空字串、混合大小寫、全部字母循環、主程式多行輸出)
3. 給我 stub 框架跑紅燈 → 我 commit `test:` 後 → 給實作 code 轉綠燈
4. 發現測試預期值寫錯(NPU→NRW 應為 NPU→PRW),修正後 8/8 OK

## 我改了什麼

> AI 給的測試中 `test_basic_case` 預期值是 `Jgnnq, NRW!`,但我手動驗算 N+2=P、P+2=R、U+2=W,正確應為 `Jgnnq, PRW!`。回報 AI 後修正測試預期值,8 題全綠。

我手動測試 發現 輸入 不同有不同 結果 為可以 用的 程式


## AI 反問我什麼 / 我怎麼回答

| AI 問了什麼 | 我怎麼回答 |
|---|---|
| 函式簽名叫什麼?參數與回傳? | `caesar_encrypt(text: str, shift: int) -> str` |
| SHIFT 值怎麼算? | 學號個位數 1 → 1%25+1 = 2 |
| 空行怎麼處理? | print() 輸出空行,保留行數對齊 |
| 非英文字母怎麼處理? | 原樣保留,不做任何處理 |
| edge case 要測哪些? | 大寫繞圈、小寫繞圈、非字母不動、空字串 |
54 changes: 54 additions & 0 deletions weeks/week-18/solutions/1112405041/test_A02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import unittest
import sys
import io
from A02 import caesar_encrypt, main


class TestCaesarEncrypt(unittest.TestCase):

def test_basic_case(self):
"""基本案例:Hello, NPU! with shift=2 -> Jgnnq, PRW!"""
result = caesar_encrypt("Hello, NPU!", shift=2)
self.assertEqual(result, "Jgnnq, PRW!")

def test_lowercase_wrap(self):
"""小寫繞圈:xyz -> zab"""
result = caesar_encrypt("xyz", shift=2)
self.assertEqual(result, "zab")

def test_uppercase_wrap(self):
"""大寫繞圈:XYZ -> ZAB"""
result = caesar_encrypt("XYZ", shift=2)
self.assertEqual(result, "ZAB")

def test_non_alpha_unchanged(self):
"""非字母不動:123 !@# -> 123 !@#"""
result = caesar_encrypt("123 !@#", shift=2)
self.assertEqual(result, "123 !@#")

def test_empty_string(self):
"""空字串 -> 空字串"""
result = caesar_encrypt("", shift=2)
self.assertEqual(result, "")

def test_mixed_case(self):
"""混合大小寫:abc XYZ -> cde ZAB"""
result = caesar_encrypt("abc XYZ", shift=2)
self.assertEqual(result, "cde ZAB")

def test_all_letters_shift_2(self):
"""全部字母位移2驗證循環"""
result = caesar_encrypt("AZaz", shift=2)
self.assertEqual(result, "CBcb")

def test_main_output(self):
"""主程式多行輸出"""
sys.stdin = io.StringIO("Hello, NPU!\nabc XYZ\n")
sys.stdout = io.StringIO()
main()
output = sys.stdout.getvalue().strip()
self.assertEqual(output, "Jgnnq, PRW!\ncde ZAB")


if __name__ == "__main__":
unittest.main()