CP2 HW01 評分標準

4/8: 1.1 及 1.2 rejudge

1.1 My String Library

此題共有 8 筆測試,每筆 2.5 分,都是簡單的測試,可在此查看

請注意,題目已表示此題不得使用需實作的七個函式,該七個函式已替換成帶有 my 前綴的對應版本,查看覆蓋的 header file。這代表,如果你嘗試使用 strstr 但卻沒有實作 mystrstr 會直接導致編譯錯誤。(技術上來說編譯成功了,但鏈結時找不到對應的函式)

如果看到評語是 Received non-zero exit code: 139 代表出現記憶體存取錯誤。

此外,我發現有許多人因為使用 size_t 但忘記 #include <stddef.h> 而 0 分,再次提醒請記得在 linux 上測試再繳交,不同作業系統及編譯器使用的 header file 內容不盡相同。(Update: rejudge,忘記 include 助教會幫你 include)

截圖 2024-04-06 凌晨4.26.33

1.2 String Calculator

提醒:完整測試環境歡迎去 HW01 參考答案 那邊下載

測資分布

"XYZ_16 + 00001_2", // 1. 非法運算子 "123_10 + 123_10 +", // 2. 非法運算元 "123_10 / 123_10", // 3. 非法運算元 "123_17 + 123_10 + 123_10", // 4. 非法 base "ABC_16 + 00001_2", // 5. 範例(加法) "10_10 - 10_10", // 6. 減法 "100_10 * 10_10", // 7. 乘法 "ABC_16", // 8. 沒有運算元 "1010_3 + 10_5", // 9. 不常用的 base 輸入 "10_10 - 20_10", // 10. 結果是負數 "FFFF_16 * 2_10 + 10_10 - 1_10", // 11. 多個運算元 "1_10 + FFFF_16 * 2_10", // 12. 先乘除後加減 "7FFFFFFF_16 + 2_10 - 1111_2", // 13. 過程超過最大數的運算 "12345_10 * 54321_10", // 14. 大數乘法 "2_10 * 2_10 * 2_10 * 2_10 * 2_10", // 15. 重複運算 "0_10 + 0_10 - 0_10", // 16. 全零加法,測試處理全零的情況 "1_2 * 0_10", // 17. 乘以零,測試任何數乘以零的結果 "80000000_16 - FFFFFFFF_16", // 18. 負數結果,測試處理運算結果為負數的情況 "123_4 * 12764_9 - 1234_5 + ACE35_15 - 6578312_11", // 19. 奇怪 base 的運算 "FFFFF_16 + FFFFF_16 + FFFFF_16 + FFFFF_16 + FFFFF_16 + FFFFF_16 + FFFFF_16 + FFFFF_16 + FFFFF_16" // 20. 很長的輸入

批改標準

  • 每筆測資為 獨立 評測。
  • 完全正確(所有功能皆正確運作,無記憶體錯誤): 1 分。
  • 功能錯誤(未按要求實作或結果不正確): 0 分。
  • 記憶體錯誤(如記憶體洩漏、未初始化記憶體訪問等): 0 分。
  • 單筆測資執行時間超過 10 秒: 該筆測資 0 分。

Murmur

  • 格式如果錯誤或不小心多印東西,若你認為和題目設計本身能分開處理,記得寄信過來並且一定要附上你自己測試過後的結果。
  • 記得 Allocate 記憶體,不知道是什麼的可以從程設一的影片開始補,或是問 ChatGPT
  • 不要把所有程式都寫在 .h 裡面,多實驗一下就會發現如果要實作某些東西,還是寫在 .c 裡面比較好
  • 13 人拿到 18 分以上、3 人全對 21 人拿到 18 分以上、5 人全對

2024/4/8 16:00 更新:

為了讓同學能夠動用到 pExpr 的記憶體空間,從原本的 pointer array 改成使用 double pointer,並重新批改了。稍後會在更新至 Moodle 上,感謝宸研詳細的說明,以及博宇、承霖在第一時間寄信!

1.3 Chain Rule

測資分布

國中生微積分

Easy
3
pts, 3 test cases
高中生微積分
Medium
6
pts, 6 test cases
高中生段考微積分
Hard Medium
2
pts, 2 test cases
大學生微積分
Hard
7
pts, 7 test cases
判錯:
2
pts, 2 test cases

批改標準

共有 20 筆測資,每筆 1 分。
各筆測資為 獨立 評測,不會因為前筆測資發生 Segmentation Fault 而導致後面測資無法得分。

  • 完全正確(*pResult 內容皆正確): 1 分
  • 答案正確但函式回傳值錯誤: 0.7 分
  • 記憶體錯誤(Segmentation Fault),備註顯示 SE: 該筆測資 0 分
  • 單筆測資執行時間超過 10 秒,備註顯示 TLE: 該筆測資 0 分
  • 輸出沒有降序排序: 該筆測資 0 分
  • 輸出多餘訊息: 不扣分

最後分數採四捨五入計算

測資與標準答案

測資請參考 hw0103.inhw0103.c 及 hw0103.in 連結,格式如下:

1(pFy size)
2(pFy pPowers)
1(pFy pCoefficients)
2(pFx size)
1 0(pFx pPowers)
4 -3(pFx pCoefficients)
...

答案請編譯 gcc hw0103.c yourprogram.c -o hw0103,執行 ./hw0103 後輸入測資編號。

1.4 Maze

可以直接編譯後執行程式,會直接得到成績

  • 一般測資佔 16 分,包含 5 個一般測資各 3 分跟一個範例測資 1 分
  • 一般測資 return val, cost, length, path 各佔該題的 1/4 分數
  • Error 測資共 4 個各一分
  • 我相信你們一定能看懂下面的測資的
  • 如果你們發現你分數沒有 20 但沒有寫 log ,那可能是你的程式在一半死掉了,你可以使用下面的測資檢查哪裡錯了。
typedef struct Testcase {
    sRoom *maze;
    uint8_t row;
    uint8_t col;
    sPath *min_path;

    char *expected_path;
    int expected_return;
    int expected_cost;
    int expected_length;
    double point;
} Testcase;


Testcase testcase[] = {
    {(sRoom[]){
        {1, 0b01110101}, {7, 0b11000011}, {2, 0b11011100}, {8, 0b11100101},
        {2, 0b00101111}, {5, 0b10111100}, {10, 0b01001010}, {2, 0b01111001},
        {9, 0b00101100}, {15, 0b01111011}, {7, 0b01111010}, {3, 0b10001101}
    }, 3, 4, NULL, "(0,0) (0,1) (0,2) (0,3) (1,3) (2,3) ", 1, 23, 6, 1.0},

    {(sRoom[]){
        {1, 0b00000000}, {7, 0b00000000}, {5, 0b00000000}, {8, 0b00000000},
        {2, 0b00000000}, {5, 0b00000000}, {9, 0b00000000}, {2, 0b00000000},
        {9, 0b00000000}, {15, 0b00000000}, {7, 0b00000000}, {3, 0b00000000}
    }, 3, 4, NULL, "(0,0) (1,0) (1,1) (1,2) (1,3) (2,3) ", 1, 22, 6, 3.0},

     {(sRoom[]){
        {1, 0b01110101}, {7, 0b11000011}, {2, 0b11011100}, {8, 0b11100101},
        {2, 0b00100011}, {5, 0b10111100}, {10, 0b01001010}, {2, 0b00111001},
        {9, 0b00101100}, {15, 0b01111011}, {7, 0b01111010}, {3, 0b10001101}
    }, 3, 4, NULL, "", 0, 0, 0, 3.0},

     {(sRoom[]){
        {10, 0b01110101}
    }, 1, 1, NULL, "(0,0) ", 1, 10, 1, 3.0},

     {(sRoom[]){
        {1, 0b01110101}, {7, 0b11000011}, {2, 0b11011100}, {8, 0b11100101},
        {2, 0b00001111}, {5, 0b10101100}, {10, 0b01011010}, {2, 0b01110001},
        {9, 0b11101100}, {15, 0b01111010}, {7, 0b01111011}, {3, 0b10001111}
    }, 3, 4, NULL, "(0,0) (0,1) (0,2) (0,3) (1,3) (1,2) (1,1) (1,0) (2,0) (2,1) (2,2) (2,3) ", 1, 71, 12, 3.0},

      {(sRoom[]){
        {1, 0b01000101}, {7, 0b11000011}, {2, 0b11011100}, {8, 0b11100101},
        {2, 0b01101111}, {5, 0b00110100}, {10, 0b01001010}, {2, 0b01111001},
        {9, 0b11111100}, {15, 0b01110011}, {100, 0b01101010}, {3, 0b10001101}
    }, 3, 4, NULL, "(0,0) (1,0) (2,0) (2,1) (1,1) (0,1) (0,2) (0,3) (1,3) (2,3) ", 1, 54, 10, 3.0},
};

error_return_val = find_min_path(testcase[0].maze, 0, 1, test_path);
error_return_val = find_min_path(testcase[0].maze, 1, 0, test_path);
error_return_val = find_min_path(NULL, 1, 1, test_path);
error_return_val = find_min_path(testcase[0].maze, 1, 1, NULL);

:::

1.5 Taiko Music Generator

測資歌曲

  1. Blue Rose Ruin
    • 5 pt
  2. いっそこのままで
    • 4 pt
  3. ミュージック・リボルバー
    • 4 pt
  4. 零の交響曲
    • 3 pt
  5. poxei◆DOON
    • 2 pt
  6. 23時54分、陽の旅路へのプレリュード
    • 2 pt

測資下載點此這裡

評分標準

  • 評分會依據:
    • 譜面指定難度下音符數量一致
    • 譜面的最簡單與最難難度去做驗證,採兩階段驗證:
      • 網頁生成的音樂聽起來合不合理
      • 作業輸出的譜面太鼓音符與正確測資的音符是否一致
      • 音符間作秒數差距對比,沒超過一秒都算正確
  • 因為這次作業不涉及檔案,我這次會幫沒有處理 CRLF 或 LF 檔案的作業做雙重測試,我有放 LF 的版本檔案在測資裡了,請留意一下
  • 如果你們對過正確測資或是用網頁聽過音樂之後覺得你們是對的,歡迎在 TA Hour 的時候要分
  • 如果你們要寄信詢問分數問題,在執行程式方面,無論是 redirection 或是手動操作,請確定你是在正常的 input (stdin) 與 output (stdout)動作的動作下在提出疑問

1.6 Bonus: _BitInt(N)

由於有時會出先有部分講對,部分講錯的情況,我可能會視情況給分,如果你認為這題你寫的沒錯,歡迎寄信要分。

  1. 2log2(N/8)
    (size 只會是 1, 2, 4, 8, 16 byte 喔,單純回答
    N/8
    是錯的)
  2. 會導致 overflow 僅保留後 N 位 (僅回答 overflow 或是 warning 不夠完整,我會算錯)
  3. Yes
  4. unsigned _BitInt
  5. Error