Code-11 是一种主要用于标记电信设备的条形码编码系统。编码字符仅限于数字 0 到 9、连字符(“-”)以及出现在每个 Code-11 条形码开头和结尾的特殊起始/终止字符。
Code-11 是一个离散系统,每个字符独立编码。一个字符的编码由五个相邻的区域(即条)表示,这些条在深色和浅色之间交替,并以深色条开始。根据下方的编码方案,每个条的宽度要么是窄的,要么是宽的,其中 0 代表窄条,1 代表宽条。
| 字符 | 编码 |
|---|---|
| 0 | 00001 |
| 1 | 10001 |
| 2 | 01001 |
| 3 | 11000 |
| 4 | 00101 |
| 5 | 10100 |
| 6 | 01100 |
| 7 | 00011 |
| 8 | 10010 |
| 9 | 10000 |
| – | 00100 |
| 起始/终止 | 00110 |
因此,字符 1 被编码为:宽深条、窄浅条、窄深条、窄浅条,最后是宽深条。单个字符的条形码必须由一个窄浅条隔开,该窄浅条的唯一功能是分隔字符。
像 Code-11 这样使用双宽度编码具有简单性的优点。由于只需要区分窄条和宽条,Code-11 在低质量打印条件下具有很高的打印容差。
为了实现错误检测,我们使用的 Code-11 条形码在消息末尾(终止字符之前)添加了两个校验字符 C 和 K。如果待编码的 $n$ 个字符(从左到右)为 $c_1$ 到 $c_n$,则校验字符 C 的权重为:
$$\left( \sum_{i=1}^{n} ((n - i) \bmod 10 + 1) \times w(c_i) \right) \bmod 11$$
其中 $w(c_i)$ 是与字符 $c_i$ 关联的权重。数字 0 到 9 的权重为 0 到 9;连字符的权重为 10。(注意:$\bmod$ 的优先级高于 $+$。)
校验字符 K 的权重为:
$$\left( \sum_{i=1}^{n+1} ((n + 1 - i) \bmod 9 + 1) \times w(c_i) \right) \bmod 11$$
其中 $c_{n+1}$ 是校验字符 C。例如,假设要编码的消息是 123–45。那么校验字符 C 为 5,校验字符 K 为 2。这八个字符 123–4552 的条形码,在前后加上起始/终止字符的条形码,构成了该消息完整的 Code-11 条形码编码。
简单的条形码阅读器通过测量从条形码反射的光强度来工作,反射光被线性排列的数百个微小 CCD 传感器接收,每个传感器报告光或暗。软件识别出明暗区域,并利用每个区域的宽度来验证条形码并获取编码信息。由于条形码的方向不固定,软件必须能够解码从左向右或从右向左扫描的条形码。
你的任务是根据阅读器检测到的明暗区域宽度,解码扫描 Code-11 条形码所获得的信息。假设宽条的预期宽度是窄条的两倍。由于打印机的不一致性,条的宽度可能比预期值大或小最多 5%。不存在零长度的消息(条形码仅包含起始/终止字符、校验字符和字符间距)。
输入格式
输入包含多个测试用例,每个用例代表一次扫描尝试。每个用例的数据以一个整数 $m \le 150$ 开头,指定了条形码阅读器检测到的区域数量。随后是 $m$ 个整数 $d_1 \dots d_m$ ($1 \le d_i \le 200$),给出了每个区域中传感器的数量(在同一区域内,所有传感器报告相同的光强度)。每个测试用例的数据以深色条开始并以深色条结束(没有前导或尾随的空白)。
最后一个测试用例后跟一个整数 0。
输出格式
对于每个输入用例,显示一行包含用例编号和解码结果。如果条形码可以成功解码,则显示消息字符序列(不包含校验字符)。如果解码成功但校验字符 C 不正确,则显示 “bad C”。如果解码成功且校验字符 C 正确但校验字符 K 不正确,则显示 “bad K”。如果由于条宽度超出允许范围、缺少或无效的起始/终止代码或其他无效条件导致条形码无法成功解码,则显示 “bad code”。请遵循样例输出的格式。
样例
输入 1
59 10 20 20 10 10 10 20 10 10 20 10 10 10 10 20 10 20 10 10 10 20 10 20 10 20 10 20 10 10 10 10 10 20 10 10 10 10 10 10 20 20 10 20 10 10 20 10 10 20 10 10 10 20 10 10 20 20 10 10 35 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 35 10 10 20 20 10 10 20 10 10 10 20 10 10 20 10 10 20 10 10 10 20 10 20 10 20 10 10 10 10 10 10 10 20 20 10 0
输出 1
Case 1: 123-45 Case 2: bad code Case 3: bad K
Figure 1. Code-11 条形码示例