Is my barcode valid?

JavaScript (ES6), 41 40 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, 64 48 35 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.