OCR 數字

OCR 數字

簡單

簡介

你最好的朋友 Marta 最近找到了一份夢寐以求的工作,在當地一間歷史博物館負責館藏相關的事務。 Marta 知道你對程式設計有興趣,便向你吐露工作上遇到的難題:博物館即將舉辦一場關於運算歷史的展覽。 當地一所大學的數學系捐贈了好幾箱歷史列印資料,但由於文件狀況不佳,館方決定將這些文字數位化。 然而,大學那台老舊的印表機在呈現文字的方式上有一些古怪之處,你的朋友需要你帮忙,才能順利取出這些資料。

說明

光學字元辨識(OCR)是一種能把文字影像轉換成機器可讀文字的軟體。 給定一個由字元組成、代表某些數字的網格,請把這個網格轉換成數字字串。 如果網格包含多行格子,輸出時應該用","分隔各行。

  • 網格由一行或更多行的格子組成。
  • 網格的每一行由一個或多個格子組成。
  • 每個格子寬 3 欄、高 4 行(3x4),代表一個數字。
  • 數字是用豎線("|")、底線("_")和空格(" ")畫出來的。

邊界情況

  • 如果輸入的大小無效,你的程式應該表示發生了錯誤。
  • 如果輸入的大小正確,但某個格子無法辨識,你的程式應該為那個字元輸出"?"。

範例

以下的輸入(不含註解)會轉換成"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")
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Python Exercism

準備好開始 OCR 數字 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。