# Is my barcode valid?

## JavaScript (ES6), 4140 38 bytes

Saved 2 bytes thanks to @ETHProductions and 1 byte thanks to @Craig Ayre.

s=>s.map(e=>t+=e*(i^=2),t=i=1)|t%10==1


Takes input as a list of digits.

Determines the sum of all digits, including the checksum.

If the sum is a multiple of 10, then it's a valid barcode.

Test Cases

let f=

s=>s.map(e=>t+=e*(i^=2),t=i=1)|t%10==1

console.log(f([2,0,3,7,8,2,4,0]));
console.log(f([3,3,7,6,5,1,2,9]));
console.log(f([7,7,2,3,4,5,7,5]));
console.log(f([0,0,0,0,0,0,0,0]));

console.log(f([2,1,0,3,4,9,8,4]));
console.log(f([6,9,1,6,5,4,3,0]));
console.log(f([1,1,9,6,5,4,2,1]));
console.log(f([1,2,3,4,5,6,7,8]));

## Python 2, 644835 29 bytes

mypetlion saved 19 bytes

lambda x:sum(x[::2]*2+x)%10<1


Try it online!

## Jelly, 8 bytes

m2Ḥ+µS⁵ḍ


Try the test suite.

## Jelly, 9 bytes

JḂḤ‘×µS⁵ḍ


Try it online or Try the test suite.

### How this works

m2Ḥ+µS⁵ḍ ~ Full program.

m2       ~ Modular 2. Return every second element of the input.
Ḥ      ~ Double each.
+µ    ~ Append the input and start a new monadic chain.
S   ~ Sum.
⁵ḍ ~ Is divisible by 10?

JḂḤ‘×µS⁵ḍ  ~ Full program (monadic).

J          ~ 1-indexed length range.
Ḃ         ~ Bit; Modulo each number in the range above by 2.
Ḥ        ~ Double each.
‘       ~ Increment each.
×      ~ Pairwise multiplication with the input.
µ     ~ Starts a new monadic chain.
S    ~ Sum.
⁵ḍ  ~ Is the sum divisible by 10?


The result for the first 7 digits of the barcode and the checksum digit must add to a multiple of 10 for it to be valid. Thus, the checksum is valid iff the algorithm applied to the whole list is divisible by 10.