你最好的朋友 Marta 最近找到了一份夢寐以求的工作,在當地一間歷史博物館負責館藏相關的事務。 Marta 知道你對程式設計有興趣,便向你吐露工作上遇到的難題:博物館即將舉辦一場關於運算歷史的展覽。 當地一所大學的數學系捐贈了好幾箱歷史列印資料,但由於文件狀況不佳,館方決定將這些文字數位化。 然而,大學那台老舊的印表機在呈現文字的方式上有一些古怪之處,你的朋友需要你帮忙,才能順利取出這些資料。
光學字元辨識(OCR)是一種能把文字影像轉換成機器可讀文字的軟體。
給定一個由字元組成、代表某些數字的網格,請把這個網格轉換成數字字串。
如果網格包含多行格子,輸出時應該用","分隔各行。
"|")、底線("_")和空格(" ")畫出來的。"?"。以下的輸入(不含註解)會轉換成"1234567890"。
_ _ _ _ _ _ _ _ #
| _| _||_||_ |_ ||_||_|| | # Decimal numbers.
||_ _| | _||_| ||_| _||_| #
# The fourth line is always blank,
以下的輸入會轉換成"123,456,789"。
_ _
| _| _|
||_ _|
_ _
|_||_ |_
| _||_|
_ _ _
||_||_|
||_| _|
有時候,你需要引發例外。這麼做時,一定要附上有意義的錯誤訊息,指出錯誤的來源。這能讓你的程式碼更容易閱讀,也對除錯大有幫助。如果已知錯誤來源會是某種型別,你可以選擇引發內建錯誤型別之一,但仍應附上有意義的訊息。
這個練習要求你在convert()函式收到不是有效 OCR 數字的字串時,使用raise 敘述來「拋出」ValueError。只有同時raise該exception並附上訊息時,測試才會通過。
若要引發帶有訊息的ValueError,請把訊息寫成exception型別的引數:
# when the rows aren't multiples of 4
raise ValueError("Number of input lines is not a multiple of four")
# when the columns aren't multiples of 3
raise ValueError("Number of input columns is not a multiple of three")