k873. Python駭客題-遞增數列
標籤 : Python 函數 迴圈 邏輯運算 駭客題
通過比率 : 9人/11人 ( 82% ) [非即時]
評分方式:
Special

最近更新 : 2023-06-17 18:42

內容
☆解題須知☆
本題是「駭客題」,與一般的競賽解題不同,
解題者不必根據題目撰寫解題的程式碼,
題目本身會提供一個存在問題的程式碼,
解題者的目標是構造出一個合理的輸入,
使得該程式執行後會導致錯誤(WA 或 RE 等等)。
 
Alice 和 Bob 是正在學習 Python 的學生,他們在順利完成「判斷數字」之後決定繼續挑戰 Snail 老師出的其它題目,其中一題是要求學生實作一個函數 isAscendingSequence(n),其輸入參數 n 為一個僅包含整數(int)的列表(list),該函數需要回傳一個布林值(bool)用以判斷整數列表 n 是否為「遞增數列」?若一個整數列表至少包含一個整數,且對於所有整數皆大於其前一項(如果存在的話)的整數,則我們稱該整數列表為「遞增數列」。
有鑑於上一次的經驗,Alice 和 Bob 這次決定先核對彼此所撰寫的函數是否會有相同的回傳值,他們將由 Alice 所完成的函數重新命名為 isAscendingSequenceAlice(n),而由 Bob 所完成的函數則是重新命名為 isAscendingSequenceBob(n),並且共同撰寫另一個函數 checkReturnValuesAreSame(n) 用以判斷對於輸入參數 n 來說兩者是否有相同的回傳值。
整體架構如下:
from typing import List

# Alice version
def isAscendingSequenceAlice(n: List[int]) -> bool:
    if not n:
        return False
    for i in range(1, len(n)):
        if n[i-1] >= n[i]:
            return False
    return True

# Bob version
def isAscendingSequenceBob(n: List[int]) -> bool:
    return n and all(a < b for a, b in zip(n, n[1:]))

# Checks if two functions have the same return value
def checkReturnValuesAreSame(n: List[int]) -> bool:
    return isAscendingSequenceAlice(n) == isAscendingSequenceBob(n)
在順利完成之後,Alice 和 Bob 卻發現了一個大問題,即使測試了許多不同的 n 兩人都有著相同的回傳值也並不代表兩人的所撰寫的函數皆是正確的,有可能是兩人尚未找到能使兩人的函數回傳值不同的 n,也有可能是恰好兩人所犯的錯相同而回傳了相同的錯誤回傳值。
正當兩人苦惱之時,十分倒楣的你恰巧路過他們旁邊,你隨即被請來幫助他們,聰明的你馬上就判斷出其中一方的函數是正確而另一方是錯誤的。現在你需要做的是先告訴他們誰的函數是正確的,另外為了方便說明,你還需要準備一個整數列表,該整數列表作為 checkReturnValuesAreSame(n) 的輸入參數時會回傳 False
你能夠順利幫助 Alice 和 Bob 嗎?
輸入說明
本題沒有輸入。
輸出說明
輸出包含兩個部分,其中輸出的第一行為第一部份,第二行為第二部份。
第一部份需輸出 Alice 或是 Bob,代表誰的程式碼是正確的。
第二部份的輸出將會被視為一個數列,數列由 $0$ 或多個「數字」所組成,彼此使用單一空白字元做分隔,「數字」的定義為連續的阿拉伯數字 0123456789 ,所有的「數字」轉換成 Python 整數型態時其值需介於 $\text{[} 0, 2^{31} \text{)} $ 範圍之內,該數列所含「數字」個數即數列長度不應超過 $100$,且當該數列作為整數列表 n 輸入 checkReturnValuesAreSame(n) 時,會使得該函數的回傳值為 False
!!請注意!!
  • 本題為「自訂比對」,
    故無法使用「測試執行」進行測試。
  • 本題的「範例輸出」僅作為輸出格式參考範本,
    除了格式之外其內容不具任何意義,
    直接輸出並無法 AC 本題。
  • 在第二部分中最後一個的「數字」之後,
    請勿含有多餘的空白,
    否則會使得評測程式解析錯誤,
    還請特別注意。
  • 若欲使第二部分的整數列表為空列表,
    於第二行輸出空字串即可。
  • 關於本題的換行,
    \n(U+000A) 單一字元作為輸出中第一部分與第二部分的結尾。
  • 關於本題的空白,
    (U+0020) 單一字元作為第二部分中分隔「數字」的字元。
範例輸入 #1


											
										
範例輸出 #1
Alice
1 2 3 4 5
測資資訊:
記憶體限制: 64 MB
公開 測資點#0 (100%): 1.0s , <1K
提示 :
評測說明🔍
下列情況皆會被視作答案錯誤(WA):
  • 輸出檔案過大
  • 沒有任何輸出
  • 無法正常解析輸出
  • 僅輸出一行
  • 輸出三行或以上
  • 第一部分並非輸出 Alice 或是 Bob
  • 第一部分回答錯誤
  • 第二部分包含非「數字」或空白以外的字元
  • 第二部分的「數字」轉換成 Python 整數型態後其數值超出 $\text{[} 0, 2^{31} \text{)} $ 範圍之外
  • 第二部分的「數字」並非以單一空白字元做分隔
  • 第二部分中在第一個「數字」之前或是最後一個「數字」之後存在多餘的空白字元
  • 第二部分轉換成 Python 整數列表後其長度超過 $100$
  • 第二部分的整數列表無法使得 checkReturnValuesAreSame(n) 回傳 False
另外,為了增加難度,
以及避免解題者從錯誤訊息中反推正確答案,
答案錯誤將會統一顯示 WA (line:1)
並且不會提供詳細的錯誤訊息。
題目更新日誌📝
2023/06/17
  • 公開題目
出題者的話💬
各位好,我是本題的出題者,
本題的出題想法源自上一題
主要是自己在撰寫 Special Judge 時自身採到的雷,
剛好又是多數 Python 初心者不容易注意到的問題,
因為覺得很有趣並且為了順便嘲諷自己
於是就又馬上出了一題。
本題有別於上一題,
單純猜測可能的答案就有機會 AC
如果是這種情況而 AC 的各位,
希望你能夠去探究造成該結果背後的原因,
錯誤一方的函數究竟錯在哪?
為什麼該輸入會導致錯誤的回傳值?
如此一來本題對你來說才具有價值,
若只是想提高 AC 數並無法讓你學到任何東西。
另外,作為出題者在此有個小小的請求,
對於順利 AC 本題的各位,
請不要於 解題報告 中直接給出答案或撰寫無關的內容,
如果能願意配合我會很感謝你的。
若對於題目有任何問題,
歡迎使用 本題討論 或站內信告知我,
如果我有看到將會盡速處理。
標籤:
Python 函數 迴圈 邏輯運算 駭客題
出處:
[管理者: lw310659 (面臨首次失敗又當不成『 』的我...) ]

本題狀況 本題討論 排行

編號 身分 題目 主題 人氣 發表日期
沒有發現任何「解題報告」