]> gitweb.factorcode.org Git - factor.git/commitdiff
vin: adding a VIN decoding tool.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 18 Nov 2021 23:11:27 +0000 (15:11 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 18 Nov 2021 23:11:27 +0000 (15:11 -0800)
extra/vin/authors.txt [new file with mode: 0644]
extra/vin/summary.txt [new file with mode: 0644]
extra/vin/vin.factor [new file with mode: 0644]

diff --git a/extra/vin/authors.txt b/extra/vin/authors.txt
new file mode 100644 (file)
index 0000000..e091bb8
--- /dev/null
@@ -0,0 +1 @@
+John Benediktsson
diff --git a/extra/vin/summary.txt b/extra/vin/summary.txt
new file mode 100644 (file)
index 0000000..79c502a
--- /dev/null
@@ -0,0 +1 @@
+VIN (Vehicle Identification Number)
diff --git a/extra/vin/vin.factor b/extra/vin/vin.factor
new file mode 100644 (file)
index 0000000..c4397f7
--- /dev/null
@@ -0,0 +1,405 @@
+! Copyright (C) 2021 John Benediktsson
+! See http://factorcode.org/license.txt for BSD license
+
+USING: assocs combinators combinators.short-circuit kernel make
+math sequences strings ;
+
+IN: vin
+
+<PRIVATE
+
+CONSTANT: TRANSLITERATION H{ }
+
+"0123456789" [ swap TRANSLITERATION set-at ] each-index
+"ABCDEFGH" [ 1 + swap TRANSLITERATION set-at ] each-index
+"JKLMNOPQR" [ 1 + swap TRANSLITERATION set-at ] each-index
+"STUVWXYZ" [ 2 + swap TRANSLITERATION set-at ] each-index
+CHAR: O TRANSLITERATION delete-at
+CHAR: Q TRANSLITERATION delete-at
+
+CONSTANT: WEIGHTS { 8 7 6 5 4 3 2 10 0 9 8 7 6 5 4 3 2 }
+
+PRIVATE>
+
+: 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&& ;
+
+<PRIVATE
+
+CONSTANT: MANUFACTURERS H{
+    { "AFA" "Ford South Africa" }
+    { "AAV" "Volkswagen South Africa" }
+    { "JA3" "Mitsubishi" }
+    { "JHM" "Honda" }
+    { "JHG" "Honda" }
+    { "JHL" "Honda" }
+    { "KM8" "Hyundai" }
+    { "KMH" "Hyundai" }
+    { "KNA" "Kia" }
+    { "KNB" "Kia" }
+    { "KNC" "Kia" }
+    { "KNM" "Renault Samsung" }
+    { "KPA" "Ssangyong" }
+    { "KPT" "Ssangyong" }
+    { "L56" "Renault Samsung" }
+    { "L5Y" "Merato Motorcycle Taizhou Zhongneng" }
+    { "LDY" "Zhongtong Coach, China" }
+    { "LGH" "Dong Feng (DFM), China" }
+    { "LKL" "Suzhou King Long, China" }
+    { "LSY" "Brilliance Zhonghua" }
+    { "LTV" "Toyota Tian Jin" }
+    { "LVS" "Ford Chang An" }
+    { "LVV" "Chery, China" }
+    { "LZM" "MAN China" }
+    { "LZE" "Isuzu Guangzhou, China" }
+    { "LZG" "Shaanxi Automobile Group, China" }
+    { "LZY" "Yutong Zhengzhou, China" }
+    { "MA1" "Mahindra" }
+    { "MA3" "Suzuki India" }
+    { "MA7" "Honda Siel Cars India" }
+    { "MAL" "Hyundai" }
+    { "MC2" "Volvo Eicher commercial vehicles limited." }
+    { "MHR" "Honda Indonesia" }
+    { "MNB" "Ford Thailand" }
+    { "MNT" "Nissan Thailand" }
+    { "MMB" "Mitsubishi Thailand" }
+    { "MMM" "Chevrolet Thailand" }
+    { "MMT" "Mitsubishi Thailand" }
+    { "MM8" "Mazda Thailand" }
+    { "MPA" "Isuzu Thailand" }
+    { "MP1" "Isuzu Thailand" }
+    { "MRH" "Honda Thailand" }
+    { "MR0" "Toyota Thailand" }
+    { "NLE" "Mercedes-Benz Turk Truck" }
+    { "NM0" "Ford Turkey" }
+    { "NM4" "Tofas Turk" }
+    { "NMT" "Toyota Turkiye" }
+    { "PE1" "Ford Phillipines" }
+    { "PE3" "Mazda Phillipines" }
+    { "PL1" "Proton, Malaysia" }
+    { "SAL" "Land Rover" }
+    { "SAJ" "Jaguar" }
+    { "SAR" "Rover" }
+    { "SCA" "Rolls Royce" }
+    { "SCC" "Lotus Cars" }
+    { "SCE" "DeLorean Motor Cars N. Ireland (UK)" }
+    { "SCF" "Aston" }
+    { "SDB" "Peugeot UK" }
+    { "SFD" "Alexander Dennis UK" }
+    { "SHS" "Honda UK" }
+    { "SJN" "Nissan UK" }
+    { "SU9" "Solaris Bus & Coach (Poland)" }
+    { "TK9" "SOR (Czech Republic)" }
+    { "TDM" "QUANTYA Swiss Electric Movement (Switzerland)" }
+    { "TMB" "Škoda (Czech Republic)" }
+    { "TMK" "Karosa (Czech Republic)" }
+    { "TMP" "Škoda trolleybuses (Czech Republic)" }
+    { "TMT" "Tatra (Czech Republic)" }
+    { "TM9" "Škoda trolleybuses (Czech Republic)" }
+    { "TN9" "Karosa (Czech Republic)" }
+    { "TRA" "Ikarus Bus" }
+    { "TRU" "Audi Hungary" }
+    { "TSE" "Ikarus Egyedi Autobuszgyar, (Hungary)" }
+    { "TSM" "Suzuki, (Hungary)" }
+    { "UU1" "Renault Dacia, (Romania)" }
+    { "VF1" "Renault" }
+    { "VF3" "Peugeot" }
+    { "VF6" "Renault (Trucks & Buses)" }
+    { "VF7" "Citroën" }
+    { "VF8" "Matra" }
+    { "VLU" "Scania France" }
+    { "VNE" "Irisbus (France)" }
+    { "VSE" "Suzuki Spain (Santana Motors)" }
+    { "VSK" "Nissan Spain" }
+    { "VSS" "SEAT" }
+    { "VSX" "Opel Spain" }
+    { "VS6" "Ford Spain" }
+    { "VS9" "Carrocerias Ayats (Spain)" }
+    { "VV9" "TAUROSpain" }
+    { "VWV" "Volkswagen Spain" }
+    { "VX1" "Zastava / Yugo Serbia" }
+    { "WAG" "Neoplan" }
+    { "WAU" "Audi" }
+    { "WBA" "BMW" }
+    { "WBS" "BMW M" }
+    { "WDB" "Mercedes-Benz" }
+    { "WDC" "DaimlerChrysler" }
+    { "WDD" "McLaren" }
+    { "WEB" "Evobus GmbH (Mercedes-Bus)" }
+    { "WF0" "Ford Germany" }
+    { "WMA" "MAN Germany" }
+    { "WMW" "MINI" }
+    { "WP0" "Porsche" }
+    { "W0L" "Opel" }
+    { "WVW" "Volkswagen" }
+    { "WV1" "Volkswagen Commercial Vehicles" }
+    { "WV2" "Volkswagen Bus/Van" }
+    { "XL9" "Spyker" }
+    { "XMC" "Mitsubishi (NedCar)" }
+    { "XTA" "Lada/AutoVaz (Russia)" }
+    { "YK1" "Saab" }
+    { "YS2" "Scania AB" }
+    { "YS3" "Saab" }
+    { "YS4" "Scania Bus" }
+    { "YV1" "Volvo Cars" }
+    { "YV4" "Volvo Cars" }
+    { "YV2" "Volvo Trucks" }
+    { "YV3" "Volvo Buses" }
+    { "ZAM" "Maserati Biturbo" }
+    { "ZAP" "Piaggio/Vespa/Gilera" }
+    { "ZAR" "Alfa Romeo" }
+    { "ZCG" "Cagiva SpA" }
+    { "ZDM" "Ducati Motor Holdings SpA" }
+    { "ZDF" "Ferrari Dino" }
+    { "ZD4" "Aprilia" }
+    { "ZFA" "Fiat" }
+    { "ZFC" "Fiat V.I." }
+    { "ZFF" "Ferrari" }
+    { "ZHW" "Lamborghini" }
+    { "ZLA" "Lancia" }
+    { "ZOM" "OM" }
+    { "1C3" "Chrysler" }
+    { "1C6" "Chrysler" }
+    { "1D3" "Dodge" }
+    { "1FA" "Ford Motor Company" }
+    { "1FB" "Ford Motor Company" }
+    { "1FC" "Ford Motor Company" }
+    { "1FD" "Ford Motor Company" }
+    { "1FM" "Ford Motor Company" }
+    { "1FT" "Ford Motor Company" }
+    { "1FU" "Freightliner" }
+    { "1FV" "Freightliner" }
+    { "1F9" "FWD Corp." }
+    { "1GC" "Chevrolet Truck USA" }
+    { "1GT" "GMC Truck USA" }
+    { "1G1" "Chevrolet USA" }
+    { "1G2" "Pontiac USA" }
+    { "1G3" "Oldsmobile USA" }
+    { "1G4" "Buick USA" }
+    { "1G6" "Cadillac USA" }
+    { "1GM" "Pontiac USA" }
+    { "1G8" "Saturn USA" }
+    { "1HD" "Harley-Davidson" }
+    { "1J4" "Jeep" }
+    { "1ME" "Mercury USA" }
+    { "1M1" "Mack Truck USA" }
+    { "1M2" "Mack Truck USA" }
+    { "1M3" "Mack Truck USA" }
+    { "1M4" "Mack Truck USA" }
+    { "1M9" "Mynatt Truck & Equipment" }
+    { "1NX" "NUMMI USA" }
+    { "1P3" "Plymouth USA" }
+    { "1R9" "Roadrunner Hay Squeeze USA" }
+    { "1VW" "Volkswagen USA" }
+    { "1XK" "Kenworth USA" }
+    { "1XP" "Peterbilt USA" }
+    { "1YV" "Mazda USA (AutoAlliance International)" }
+    { "2C3" "Chrysler Canada" }
+    { "2CN" "CAMI" }
+    { "2D3" "Dodge Canada" }
+    { "2FA" "Ford Motor Company Canada" }
+    { "2FB" "Ford Motor Company Canada" }
+    { "2FC" "Ford Motor Company Canada" }
+    { "2FM" "Ford Motor Company Canada" }
+    { "2FT" "Ford Motor Company Canada" }
+    { "2FU" "Freightliner" }
+    { "2FV" "Freightliner" }
+    { "2FZ" "Sterling" }
+    { "2G1" "Chevrolet Canada" }
+    { "2G2" "Pontiac Canada" }
+    { "2G3" "Oldsmobile Canada" }
+    { "2G4" "Buick Canada" }
+    { "2HG" "Honda Canada" }
+    { "2HK" "Honda Canada" }
+    { "2HM" "Hyundai Canada" }
+    { "2NV" "Nova Bus Canada" }
+    { "2P3" "Plymouth Canada" }
+    { "2V4" "Volkswagen Canada" }
+    { "2WK" "Western Star" }
+    { "2WL" "Western Star" }
+    { "2WM" "Western Star" }
+    { "3D3" "Dodge Mexico" }
+    { "3FA" "Ford Motor Company Mexico" }
+    { "3FE" "Ford Motor Company Mexico" }
+    { "3P3" "Plymouth Mexico" }
+    { "3VW" "Volkswagen Mexico" }
+    { "4RK" "Nova Bus USA" }
+    { "4US" "BMW USA" }
+    { "4UZ" "Frt-Thomas Bus" }
+    { "4V1" "Volvo" }
+    { "4V2" "Volvo" }
+    { "4V3" "Volvo" }
+    { "4V4" "Volvo" }
+    { "4V5" "Volvo" }
+    { "4V6" "Volvo" }
+    { "4VL" "Volvo" }
+    { "4VM" "Volvo" }
+    { "4VZ" "Volvo" }
+    { "5N1" "Nissan USA" }
+    { "5NP" "Hyundai USA" }
+    { "6AB" "MAN Australia" }
+    { "6F4" "Nissan Motor Company Australia" }
+    { "6F5" "Kenworth Australia" }
+    { "6FP" "Ford Motor Company Australia" }
+    { "6G1" "General Motors-Holden (post Nov 2002)" }
+    { "6G2" "Pontiac Australia (GTO & G8)" }
+    { "6H8" "General Motors-Holden (pre Nov 2002)" }
+    { "6MM" "Mitsubishi Motors Australia" }
+    { "6T1" "Toyota Motor Corporation Australia" }
+    { "6U9" "Privately Imported car in Australia" }
+    { "8AG" "Chevrolet Argentina" }
+    { "8GG" "Chevrolet Chile" }
+    { "8AP" "Fiat Argentina" }
+    { "8AF" "Ford Motor Company Argentina" }
+    { "8AD" "Peugeot Argentina" }
+    { "8GD" "Peugeot Chile" }
+    { "8A1" "Renault Argentina" }
+    { "8AK" "Suzuki Argentina" }
+    { "8AJ" "Toyota Argentina" }
+    { "8AW" "Volkswagen Argentina" }
+    { "93U" "Audi Brazil" }
+    { "9BG" "Chevrolet Brazil" }
+    { "935" "Citroën Brazil" }
+    { "9BD" "Fiat Brazil" }
+    { "9BF" "Ford Motor Company Brazil" }
+    { "93H" "Honda Brazil" }
+    { "9BM" "Mercedes-Benz Brazil" }
+    { "936" "Peugeot Brazil" }
+    { "93Y" "Renault Brazil" }
+    { "9BS" "Scania Brazil" }
+    { "93R" "Toyota Brazil" }
+    { "9BW" "Volkswagen Brazil" }
+    { "9FB" "Renault Colombia" }
+}
+
+H{
+    { "JA" "Isuzu" }
+    { "JF" "Fuji Heavy Industries" }
+    { "JK" "Kawasaki" }
+    { "JM" "Mazda" }
+    { "JN" "Nissan" }
+    { "JS" "Suzuki" }
+    { "JT" "Toyota" }
+    { "KL" "Daewoo General Motors South Korea" }
+    { "1G" "General Motors USA" }
+    { "1H" "Honda USA" }
+    { "1L" "Lincoln USA" }
+    { "1N" "Nissan USA" }
+    { "2G" "General Motors Canada" }
+    { "2M" "Mercury" }
+    { "2T" "Toyota Canada" }
+    { "3G" "General Motors Mexico" }
+    { "3H" "Honda Mexico" }
+    { "3N" "Nissan Mexico" }
+    { "4F" "Mazda USA" }
+    { "4M" "Mercury" }
+    { "4S" "Subaru-Isuzu Automotive" }
+    { "4T" "Toyota" }
+    { "5F" "Honda USA-Alabama" }
+    { "5L" "Lincoln" }
+    { "5T" "Toyota USA - trucks" }
+} [
+    swap "ABCDEFGHJKLMNPRSTUVWXYZ1234567890"
+    [ suffix MANUFACTURERS set-at ] 2with each
+] assoc-each
+
+CONSTANT: REGIONS H{ }
+
+{
+    { "12345" "North America" }
+    { "STUVWXYZ" "Europe" }
+    { "ABCDEFGH" "Africa" }
+    { "JKLMNPR" "Asia" }
+    { "67" "Oceania" }
+    { "890" "South America" }
+} [
+    swap [ REGIONS set-at ] with each
+] assoc-each
+
+CONSTANT: COUNTRIES H{ }
+
+{
+    { "South Africa" "A" "ABCDEFGH" }
+    { "Japan" "J" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "South Korea" "K" "LMNPR" }
+    { "China" "L" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "India" "M" "ABCDE" }
+    { "Indonesia" "M" "FGHJK" }
+    { "Thailand" "M" "LMNPR" }
+    { "Philippines" "P" "ABCDE" }
+    { "Malaysia" "P" "LMNPR" }
+    { "Taiwan" "R" "FG" }
+    { "United Kingdom" "A" "ABCDEFGHJKLM" }
+    { "Germany" "S" "NPRST" }
+    { "Germany" "W" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "Poland" "S" "UVWXYZ" }
+    { "Switzerland" "T" "ABCDEFGH" }
+    { "Czech Republic" "T" "JKLMNP" }
+    { "Hungary" "T" "RSTUV" }
+    { "Portugal" "T" "W" }
+    { "Austria" "V" "ABCDE" }
+    { "France" "V" "FGHJKLMNPR" }
+    { "Spain" "V" "STUVW" }
+    { "Yugoslavia" "V" "XYZ12" }
+    { "Netherlands" "X" "LMN" }
+    { "USSR" "X" "STUVW" }
+    { "Russia" "X" "34567890" }
+    { "Belgium" "Y" "ABCDE" }
+    { "Finland" "Y" "FGHJK" }
+    { "Sweden" "Y" "STUVW" }
+    { "Italy" "Z" "ABCDEFGHJKLMNPR" }
+    { "United States" "1" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "United States" "4" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "United States" "5" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "Canada" "2" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "Mexico" "3" "ABCDEFGHJKLMNPRSTUVWXYZ1234567890" }
+    { "Australia" "6" "ABCDEFGHJKLMNPRSTUVW" }
+    { "New Zealand" "7" "ABCDE" }
+    { "Argentina" "8" "ABCDE" }
+    { "Chile" "8" "FGHJ" }
+    { "Venezuela" "8" "XYZ12" }
+    { "Brazil" "9" "ABCDE" }
+    { "Brazil" "9" "3456789" }
+    { "Columbia" "9" "FGHJ" }
+} [
+    first3 [ suffix COUNTRIES set-at ] 2with each
+] each
+
+: wmi% ( wmi -- )
+    {
+        [ "wmi" ,, ]
+        [ MANUFACTURERS at "manufacturer" ,, ]
+        [ first REGIONS at "region" ,, ]
+        [ 2 head COUNTRIES at "country" ,, ]
+    } cleave ;
+
+: vds% ( vds -- )
+    {
+        [ "vds" ,, ]
+    } cleave ;
+
+: vis% ( vis -- )
+    {
+        [ "vis" ,, ]
+        [ first "123456789ABCDEFGHJKLMNPRSTVWXY" index [ 2001 + "year" ,, ] when* ]
+        [ second 1string "assembly_plant" ,, ]
+    } cleave ;
+
+PRIVATE>
+
+: parse-vin ( vin -- details )
+    [
+        {
+            [ [ 0 3 ] dip subseq wmi% ]
+            [ [ 3 9 ] dip subseq vds% ]
+            [ [ 9 17 ] dip subseq vis% ]
+        } cleave
+    ] H{ } make ;