學習軌道
/
Go
Go
/
練習
/
OCR 數字
OCR 數字

OCR 數字

中等

簡介

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

說明

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

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

邊界情況

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

範例

以下的輸入(不含註解)會轉換成"1234567890"。

      _  _     _  _  _  _  _  _  #
    | _| _||_||_ |_   ||_||_|| | # Decimal numbers.
    ||_  _|  | _||_|  ||_| _||_| #
                                 # The fourth line is always blank,

以下的輸入會轉換成"123,456,789"。

    _  _ 
  | _| _|
  ||_  _|
         
    _  _ 
|_||_ |_ 
  | _||_|
         
 _  _  _ 
  ||_||_|
  ||_| _|
         

實作注意事項

依照說明第 1 步所述定義一個名為 recognizeDigit 的函式,但要讓它能辨識 0 到 9 這十個數字。 參數和回傳值想怎麼定都可以,但要讓它能當作第 2 步的子常式來用。

第 2 步請定義,

func Recognize(string) []string

並用 recognizeDigit 來實作。

這裡測試的輸入字串,每一行開頭都有一個 \n,最後一行結尾則沒有 \n。(這樣原始字串常值讀起來比較清楚。)

想拿加分的話,請優雅地處理格式錯誤的資料。 遇到不完整的格子該怎麼辦? 直接丟掉? 用空格補齊? 還是用 "?" 字元回報? 如果第一個字元不是 \n 又該怎麼辦?

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Go Exercism

準備好開始 OCR 數字 了嗎?

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