! Copyright (C) 2021 John Benediktsson ! See https://factorcode.org/license.txt for BSD license USING: assocs combinators combinators.short-circuit kernel make math sequences strings ; IN: vin : valid-vin? ( vin -- ? ) { [ length 17 = ] [ [ "ABCDEFGHJKLMNPRSTUVWXYZ0123456789" member? ] all? ] [ [ 8 swap nth ] [ WEIGHTS swap 0 [ TRANSLITERATION at * + ] 2reduce 11 mod ] bi dup 10 = [ drop CHAR: X = ] [ CHAR: 0 + = ] if ] } 1&& ; : parse-vin ( vin -- details ) [ { [ [ 0 3 ] dip subseq wmi% ] [ [ 3 9 ] dip subseq vds% ] [ [ 9 17 ] dip subseq vis% ] } cleave ] H{ } make ;