29 lines
954 B
Forth
29 lines
954 B
Forth
open System
|
|
let Inputs = ["710889"; "B0YBKJ"; "406566"; "B0YBLH"; "228276"; "B0YBKL"
|
|
"557910"; "B0YBKR"; "585284"; "B0YBKT"; "B00030"]
|
|
|
|
let Vowels = set ['A'; 'E'; 'I'; 'O'; 'U']
|
|
let Weights = [1; 3; 1; 7; 3; 9; 1]
|
|
|
|
let inline isVowel c = Vowels.Contains (Char.ToUpper c)
|
|
|
|
let char2value c =
|
|
if Char.IsDigit c then int c - 0x30
|
|
else (['A'..'Z'] |> List.findIndex ((=) (Char.ToUpper c))) + 10
|
|
|
|
let sedolCheckDigit (input: string) =
|
|
if input.Length <> 6 || input |> Seq.exists isVowel then
|
|
failwithf "Input must be six characters long and not contain vowels: %s" input
|
|
|
|
let sum = Seq.map2 (fun ch weight -> (char2value ch) * weight) input Weights |> Seq.sum
|
|
(10 - sum%10)%10
|
|
|
|
let addCheckDigit inputs =
|
|
inputs |> List.map (fun s -> s + (sedolCheckDigit s).ToString())
|
|
|
|
let processDigits() =
|
|
try
|
|
addCheckDigit Inputs |> List.iter (printfn "%s")
|
|
with
|
|
ex -> printfn "ERROR: %s" ex.Message
|