Hoje em dia, praticamente todas as lojas usam códigos de barras UPC ( Universal Product Code ) para simplificar o processo de check-out. Se o nome não significa nada para você, você certamente reconhecerá como eles são:
Formato
O sistema mais comum é o UPC-A, que usa 12 dígitos para representar cada produto específico. Cada dígito é codificado em uma série de faixas em preto e branco para permitir que as máquinas leiam o código, com um comprimento de sete bits. Há um total de 11 bits de padrões que indicam o início, o meio e o fim do código de barras. Isso resulta em um comprimento total de código de barras de 12 × 7 + 11 = 95 bits. (A partir de agora, quando binário for usado para se referir à cor de cada bit, 0
será branco e 1
preto).
O começo e o fim têm um padrão de 101
. Os dígitos são então divididos em 2 grupos de 6 e codificados como mostrado abaixo, com um padrão 01010
entre os grupos esquerdo e direito. Esta tabela lista o padrão para cada número. Observe que o padrão é diferente dependendo se o dígito estiver no lado direito ou esquerdo (Isso permite que o código de barras seja lido de cabeça para baixo). No entanto, o padrão da direita é o oposto (troque o preto pelo branco e vice-versa) do da esquerda.
Se você não conseguir ver a imagem acima, esse é o equivalente binário de cada número.
# 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
Exemplo
Digamos que você tenha o UPC 022000 125033
. (Esses não são números aleatórios. Deixe um comentário se você descobrir o significado deles.) Você começa com este padrão que é igual em todos os códigos de barras:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
Para os dígitos, você substitui cada um pela codificação correspondente do lado (esquerdo ou direito) em que está. Se você ainda estiver confuso, veja a imagem abaixo.
Aqui está a saída em binário com |
tubos que separam as peças.
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
Desafio
Escreva um programa que emita o código de barras UPC-A para a entrada do usuário. As dimensões da imagem devem ter 95 × 30 pixels, com cada "bit" com um pixel de largura e 30 pixels de altura. As listras pretas estão inseridas rgb(0, 0, 0)
e as brancas são consistentemente transparentes ou rgb(255, 255, 255)
.
Notas
- Pegue a entrada do stdin ou da linha de comando ou escreva uma função que use uma string ou um número inteiro (observe que a entrada pode ter zeros à esquerda e a maioria dos idiomas os remove ou converte o número em octal).
- Envie a imagem de uma das seguintes maneiras:
- Salve-o em um arquivo com um nome e formato (PNG, PBM etc.) de sua escolha.
- Exibi-lo na tela.
- Envie seus dados de arquivo para stdout.
- Você não pode usar bibliotecas ou componentes internos que geram códigos de barras ( estou olhando para você, Mathematica ), embora você possa usar bibliotecas de imagens ou gráficos.
- O último dígito de um UPC geralmente é um dígito de verificação , mas para esses fins, você não precisa se preocupar com isso.
Exemplos
Aqui estão mais alguns exemplos para testar seu código. A saída binária também é fornecida por conveniência.
Entrada: 012345678910
Resultado:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
Entrada: 777777222222
Resultado:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
Pontuação
Este é o código de golfe , portanto, o envio mais curto (em bytes vence). O desempatador vai para o primeiro post.
["777777","222222"]