Oggi quasi tutti i negozi utilizzano codici a barre UPC ( Universal Product Code ) per semplificare il processo di checkout. Se il nome non significa nulla per te, riconoscerai sicuramente come sono:
Formato
Il sistema più comune è UPC-A, che utilizza 12 cifre per rappresentare ciascun prodotto specifico. Ogni cifra è codificata in una serie di strisce bianche e nere per consentire alle macchine di leggere il codice, una lunghezza di sette bit. Ci sono un totale di 11 bit di pattern che indicano l'inizio, la metà e la fine del codice a barre. Questo arriva a una lunghezza totale del codice a barre di 12 × 7 + 11 = 95 bit. (D'ora in poi, quando binario viene utilizzato per fare riferimento al colore di ciascun bit, 0
è bianco ed 1
è nero.)
L'inizio e la fine hanno entrambi uno schema di 101
. Le cifre vengono quindi divise in 2 gruppi di 6 e codificate come mostrato di seguito, con uno schema 01010
tra i gruppi sinistro e destro. Questa tabella elenca il modello per ciascun numero. Si noti che il motivo è diverso a seconda che la cifra si trovi sul lato destro o sinistro (ciò consente di scansionare il codice a barre sottosopra). Tuttavia, il motivo per la destra è l'opposto (scambia il nero per il bianco e viceversa) di quello della sinistra.
Se non riesci a vedere l'immagine sopra, questo è l'equivalente binario di ogni numero.
# 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
Esempio
Supponi di avere l'UPC 022000 125033
. (Questi non sono numeri casuali. Lascia un commento se ne capisci il significato.) Inizi con questa piastra della caldaia che è la stessa in ogni codice a barre:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
Per le cifre, si sostituisce ciascuna con la codifica corrispondente per il lato (sinistro o destro) che è attivo. Se sei ancora confuso, vedi l'immagine qui sotto.
Ecco l'output in binario con |
tubi che separano le parti.
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
Sfida
Scrivi un programma che emette il codice a barre UPC-A per l'input dell'utente. Le dimensioni dell'immagine dovrebbero essere 95 × 30 pixel, con ogni "bit" largo 1 pixel e alto 30 pixel. Le strisce nere sono dentro rgb(0, 0, 0)
e le strisce bianche sono costantemente trasparenti o rgb(255, 255, 255)
.
Appunti
- Prendi l'input da stdin o dalla riga di comando o scrivi una funzione che accetta una stringa o un numero intero (nota che l'input può avere zero iniziali e la maggior parte delle lingue li rimuove o converte il numero in ottale).
- Stampa l'immagine in uno dei seguenti modi:
- Salvalo in un file con un nome e un formato (PNG, PBM, ecc.) A tua scelta.
- Visualizzalo sullo schermo.
- Emette i dati del suo file su stdout.
- Non puoi usare librerie o builtin che generano codici a barre ( ti sto guardando, Mathematica ), sebbene tu possa usare librerie di immagini o grafiche.
- L'ultima cifra di un UPC è di solito una cifra di controllo , ma per questi scopi non devi preoccuparti.
Esempi
Ecco alcuni altri esempi con cui testare il tuo codice. L'output binario viene anche fornito per comodità.
Ingresso: 012345678910
Produzione:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
Ingresso: 777777222222
Produzione:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
punteggio
Questo è il golf del codice , quindi l'invio più breve (in byte vince). Tiebreaker arriva al primo post.
["777777","222222"]