How to resolve the algorithm SEDOLs step by step in the D programming language

Published on 12 May 2024 09:40 PM
#D

How to resolve the algorithm SEDOLs step by step in the D programming language

Table of Contents

Problem Statement

For each number list of 6-digit SEDOLs, calculate and append the checksum digit.

That is, given this input: Produce this output: Check each input is correctly formed, especially with respect to valid characters allowed in a SEDOL string.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm SEDOLs step by step in the D programming language

Source code in the d programming language

import std.stdio, std.algorithm, std.string, std.numeric, std.ascii;

char checksum(in char[] sedol) pure @safe /*@nogc*/
in {
    assert(sedol.length == 6);
    foreach (immutable c; sedol)
        assert(c.isDigit || (c.isUpper && !"AEIOU".canFind(c)));
} out (result) {
    assert(result.isDigit);
} body {
    static immutable c2v = (in dchar c) => c.isDigit ? c - '0' : (c - 'A' + 10);
    immutable int d = sedol.map!c2v.dotProduct([1, 3, 1, 7, 3, 9]);
    return digits[10 - (d % 10)];
}

void main() {
    foreach (const sedol; "710889 B0YBKJ 406566 B0YBLH 228276
                          B0YBKL 557910 B0YBKR 585284 B0YBKT".split)
        writeln(sedol, sedol.checksum);
}


import std.stdio, std.algorithm, std.string, std.numeric, std.ascii;

char sedolChecksum(in char[] sedol) pure nothrow @safe /*@nogc*/
in {
    assert(sedol.length == 6, "SEDOL must be 6 chars long.");
    enum uint mask = 0b11_1110_1111_1011_1110_1110_1110;

    foreach (immutable c; sedol)
        assert(c.isDigit ||
               (c > 'A' && c <= 'Z' && ((1U << (c - 'A')) & mask)),
               "SEDOL with wrong char.");
} out(result) {
    assert(result.isDigit);
    static int c2v(in dchar c) pure nothrow @safe @nogc {
        return c.isDigit ? c - '0' : c - 'A' + 10;
    }
    immutable int d = sedol.map!c2v.dotProduct([1, 3, 1, 7, 3, 9]);
    assert((d + result - '0') % 10 == 0);
} body {
    static immutable int[] weights = [1, 3, 1, 7, 3, 9];

    int sum = 0;
    foreach (immutable i, immutable c; sedol) {
        if (c.isDigit)
            sum += (c - '0') * weights[i];
        else
            sum += (c - 'A' + 10) * weights[i];
    }

    return '0' + 10 - (sum % 10);
}

void main() {
    foreach (immutable s; ["710889", "B0YBKJ", "406566", "B0YBLH",
                           "228276", "B0YBKL", "557910", "B0YBKR",
                           "585284", "B0YBKT"])
        writeln(s, s.sedolChecksum);
}


void main() {
    import std.stdio, std.algorithm, std.string, std.numeric,std.ascii;

    foreach (const s; "710889 B0YBKJ 406566 B0YBLH 228276
                       B0YBKL 557910 B0YBKR 585284 B0YBKT".split)
        writeln(s, '0' + 10 - s
                   .map!(c => c.isDigit ? c - '0' : c - 'A' + 10)
                   .dotProduct([1, 3, 1, 7, 3, 9]) % 10);
}


  

You may also check:How to resolve the algorithm I before E except after C step by step in the uBasic/4tH programming language
You may also check:How to resolve the algorithm Hamming numbers step by step in the Arturo programming language
You may also check:How to resolve the algorithm Matrix transposition step by step in the True BASIC programming language
You may also check:How to resolve the algorithm Naming conventions step by step in the zkl programming language
You may also check:How to resolve the algorithm Split a character string based on change of character step by step in the Dyalect programming language