トラック
/
Go
Go
/
演習
/
OCR数字
OCR数字

OCR数字

中級

はじめに

親友のMartaは、最近、地元の歴史博物館のコレクションを扱う念願の仕事に就きました。 プログラミングに興味があることを知っているMartaは、コンピューティングの歴史に関する今度の展覧会に向けて、職場で困っていることを打ち明けてきました。 地元の大学の数学科が歴史的なプリントアウトを何箱か寄贈してくれたのですが、資料の状態が良くないため、そのテキストをデジタル化することになったのです。 ただ、大学の古いプリンターにはテキストの表現方法にちょっとした癖があり、データをうまく取り出すには助けが要りそうです。

説明

Optical Character Recognition(OCR)は、文字の画像を機械が読み取れるテキストに変換するソフトウェアです。 数字を表す文字のグリッドが与えられたら、そのグリッドを数字の文字列に変換します。 グリッドに複数の行のセルがある場合は、出力ではそれぞれの行を","で区切ります。

  • グリッドは、1行以上のセルの行でできています。
  • グリッドの各行は、1つ以上のセルでできています。
  • 各セルは横3列、縦4行(3x4)で、1つの数字を表します。
  • 数字は、縦棒("|")、アンダースコア("_")、スペース(" ")を使って描きます。

エッジケース

  • 入力のサイズが正しくない場合、プログラムはエラーがあることを示す必要があります。
  • 入力のサイズは正しいものの、セルを認識できない場合、プログラムはその文字の代わりに"?"を出力する必要があります。

例

次の入力(コメントを除く)は"1234567890"に変換されます。

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

次の入力は"123,456,789"に変換されます。

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

実装メモ

手順のステップ1で説明したとおりに関数recognizeDigitを定義します。ただし、0から9までの10個すべての数字を認識できるようにします。 引数と戻り値は好きなように決めてかまいませんが、ステップ2でサブルーチンとして使えるものにします。

ステップ2では、次の関数を定義します。

func Recognize(string) []string

そして、recognizeDigitを使ってこれを実装します。

ここでテストする入力文字列は、各行の先頭に\nがあり、最後の行には末尾の\nがありません。(こうすると、生文字列リテラルが読みやすくなります。)

さらに挑戦したい人は、形式の崩れたデータもうまく扱えるようにしてみましょう。 一部だけ欠けたセルはどう扱えばよいでしょうか? 捨てますか? スペースで埋めますか? それとも"?"という文字で報告しますか? 先頭の文字が\nでない場合はどうすればよいでしょうか?

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Go Exercism

OCR数字を始める準備はできましたか?

Exercismに登録すれば、34個のコンセプト165個の演習、そして本物の人間によるメンタリングとともに、Goを学んでマスターできます。すべて無料です。