轨道
/
Go
Go
/
练习
/
OCR 数字
OCR 数字

OCR 数字

中等

简介

你的好朋友 Marta 最近得到了梦寐以求的工作,在当地一家历史博物馆的藏品部门工作。 他们知道你热爱编程,便向你倾诉了工作中遇到的一个难题:博物馆即将举办一场关于计算机历史的展览。 当地一所大学的数学系捐赠了几箱历史打印资料,但考虑到这些文件保存状况很差,大家决定把上面的文本数字化。 不过,那所大学的旧打印机在表示文本的方式上有一些古怪之处,你的朋友需要你的帮助才能顺利提取出数据。

说明

光学字符识别(OCR)是一种把文本图像转换成机器可读文本的软件。 给定一个由字符组成的网格,表示若干个数字,请把这个网格转换成由数字组成的字符串。 如果网格包含多行单元格,输出中的各行之间应该用","分隔。

  • 网格由一行或多行单元格组成。
  • 网格的每一行由一个或多个单元格组成。
  • 每个单元格宽三列、高四行(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,全部免费。