user
|  |
| --- |
| This page uses content from **Wikipedia**. The original article was at CUSIP. The list of authors can be seen in the page history. As with Rosetta Code, the text of Wikipedia is available under the GNU FDL. (See links for details on variance) |

A   **CUSIP**   is a nine-character alphanumeric code that identifies a North American financial security for the purposes of facilitating clearing and settlement of trades. The CUSIP was adopted as an American National Standard under Accredited Standards X9.6.

Task

Ensure the last digit   (i.e., the   *check digit*)   of the **CUSIP** code (the 1st column) is correct, against the following:

* 037833100       Apple Incorporated
* 17275R102       Cisco Systems
* 38259P508       Google Incorporated
* 594918104       Microsoft Corporation
* 68389X106       Oracle Corporation   (*incorrect*)
* 68389X105       Oracle Corporation

Example pseudo-code below.

```
algorithm Cusip-Check-Digit(cusip) is
   Input: an 8-character CUSIP

   sum := 0
   for 1 ≤ i ≤ 8 do
      c := the ith character of cusip
      if c is a digit then
         v := numeric value of the digit c
      else if c is a letter then
         p := ordinal position of c in the alphabet (A=1, B=2...)
         v := p + 9
      else if c = "*" then
         v := 36
      else if c = "@" then
         v := 37
      else if' c = "#" then
         v := 38
      end if
      if i is even then
         v := v × 2
      end if

      sum := sum + int ( v div 10 ) + v mod 10
   repeat
   
   return (10 - (sum mod 10)) mod 10
end function

```

See related tasks

* SEDOL
* ISIN
assistant
(formerly Perl 6)

**Works with**: Rakudo version 2017.01

```
sub divmod ($v, $r) { $v div $r, $v mod $r }
my %chr = (flat 0..9, 'A'..'Z', <* @ #>) Z=> 0..*;

sub cuisp-check ($cuisp where *.chars == 9) {
    my ($code, $chk) = $cuisp.comb(8);
    my $sum = [+] $code.comb.kv.map: { [+] (($^k % 2 + 1) * %chr{$^v}).&divmod(10) };
    so (10 - $sum mod 10) mod 10 eq $chk;
}

# TESTING
say "$_: ", $_.&cuisp-check for <
037833100
17275R102
38259P508
594918104
68389X106
68389X105
>

```

Output:

```
037833100: True
17275R102: True
38259P508: True
594918104: True
68389X106: False
68389X105: True
```