如今,几乎每家商店都使用通用产品代码(UPC)条形码来简化结帐流程。如果这个名称对您没有任何意义,那么您肯定会知道它们的外观:
格式
最常见的系统是UPC-A,它使用12位数字表示每个特定产品。每个数字被编码为一系列黑白条纹,以使机器可以读取代码,长度为7位。总共有11位的模式值指示条形码的开始,中间和结尾。条形码的总长度为12×7 + 11 = 95位。(从现在开始,当使用二进制表示每个位的颜色时,它0
是白色和1
黑色。)
开头和结尾都有的模式101
。然后将这些数字分为2组,每组6个,并按如下所示进行编码,并01010
在左右各组之间进行编码。下表列出了每个数字的模式。请注意,根据数字是在右侧还是在左侧,图案会有所不同(这允许条形码上下颠倒扫描)。但是,右边的图案与左边的图案相反(白色交换为黑色,反之亦然)。
如果看不到上面的图像,则这是每个数字的二进制等效项。
# Left Right
0 0001101 1110010
1 0011001 1100110
2 0010011 1101100
3 0111101 1000010
4 0100011 1011100
5 0110001 1001110
6 0101111 1010000
7 0111011 1000100
8 0110111 1001000
9 0001011 1110100
例
假设您拥有UPC 022000 125033
。(这些不是随机数。如果要弄清它们的含义,请留下评论。)从此样板开始,每个条形码中的样板都相同:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
对于数字,请用其侧面(左或右)的相应编码替换每个数字。如果您仍然感到困惑,请参见下图。
这是二进制的输出,其中|
管道将零件分开。
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
挑战
编写一个程序,输出用于用户输入的UPC-A条形码。图像的尺寸应为95×30像素,每个“位”为1像素宽和30像素高。黑色条纹进入rgb(0, 0, 0)
,白色条纹始终透明或透明rgb(255, 255, 255)
。
笔记
- 从stdin或命令行获取输入,或编写一个接受字符串或整数的函数(请注意,输入可以包含前导零,并且大多数语言都将其删除或将数字转换为八进制)。
- 通过以下方式之一输出图像:
- 将其保存到具有您选择的名称和格式(PNG,PBM等)的文件中。
- 在屏幕上显示。
- 将其文件数据输出到stdout。
- 尽管您可能使用图像或图形库,但是您可能不使用会生成条形码的库或内置程序(我正在看着您,Mathematica)。
- UPC的最后一位通常是一个校验位,但是出于这些目的,您不必担心。
例子
这里有一些更多的示例可用来测试您的代码。为了方便起见,还提供了二进制输出。
输入: 012345678910
输出:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
输入: 777777222222
输出:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
计分
这是代码高尔夫,因此提交时间最短(以字节为单位)。Tiebreaker去最早的职位。
["777777","222222"]