Data update

This commit is contained in:
Ingy döt Net 2026-04-30 12:34:36 -04:00
parent 4bb20c9b71
commit cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions

View file

@ -0,0 +1,63 @@
100 REM CUSIP
110 DECLARE EXTERNAL SUB PrintVerdict
120 DECLARE EXTERNAL FUNCTION CusipCheckDigit
130 DECLARE EXTERNAL FUNCTION IsValidCusip
140 PRINT "CUSIP Verdict"
150 CALL PrintVerdict("037833100")
160 CALL PrintVerdict("17275R102")
170 CALL PrintVerdict("38259P508")
180 CALL PrintVerdict("594918104")
190 CALL PrintVerdict("68389X106")
200 CALL PrintVerdict("68389X105")
210 END
220 REM **
230 EXTERNAL FUNCTION CusipCheckDigit(Cusip$)
240 LET I = 1
250 LET Sum = 0
260 LET L = LEN(Cusip$)
270 DO WHILE I < L
280 LET C$ = Cusip$(I:I)
290 IF ("0" <= C$) AND (C$ <= "9") THEN
300 LET V = VAL(C$)
310 ELSEIF ("A" <= C$) AND (C$ <= "Z") THEN
320 LET V = ORD(C$) - 65 + 10
330 ELSEIF C$ = "*" THEN
340 LET V = 36
350 ELSEIF C$ = "@" THEN
360 LET V = 37
370 ELSEIF C$ = "#" THEN
380 LET V = 38
390 ELSE
400 LET CusipCheckDigit = -1
410 EXIT FUNCTION
420 END IF
430 IF MOD(I - 1, 2) = 1 THEN LET V = 2 * V
440 IF I <= 8 THEN LET Sum = Sum + INT(V / 10) + MOD(V, 10)
450 LET I = I + 1
460 LOOP
470 IF I <> 9 THEN
480 LET CusipCheckDigit = -1
490 ELSE
500 LET CusipCheckDigit = MOD(10 - MOD(Sum, 10), 10)
510 END IF
520 END FUNCTION
530 REM **
540 EXTERNAL FUNCTION IsValidCusip (Cusip$)
550 LET Check = CusipCheckDigit(Cusip$)
560 IF Check < 0 THEN
570 LET IsValidCusip = 0
580 ELSEIF Cusip$(9:9) = CHR$(48 + Check) THEN
590 LET IsValidCusip = -1
600 ELSE
610 LET IsValidCusip = 0
620 END IF
630 END FUNCTION
640 REM **
650 EXTERNAL SUB PrintVerdict (Cusip$)
660 PRINT Cusip$;
670 IF IsValidCusip(Cusip$) <>0 THEN
680 PRINT " : Valid"
690 ELSE
700 PRINT " : Invalid"
710 END IF
720 END SUB

54
Task/CUSIP/Ada/cusip.adb Normal file
View file

@ -0,0 +1,54 @@
with Ada.Text_IO;
procedure Cusip_Test is
use Ada.Text_IO;
subtype Cusip is String (1 .. 9);
function Check_Cusip (Code : Cusip) return Boolean is
Sum : Integer := 0;
V : Integer;
begin
for I in Code'First .. Code'Last - 1 loop
case Code (I) is
when '0' .. '9' =>
V := Character'Pos (Code (I)) - Character'Pos ('0');
when 'A' .. 'Z' =>
V := Character'Pos (Code (I)) - Character'Pos ('A') + 10;
when '*' => V := 36;
when '@' => V := 37;
when '#' => V := 38;
when others => return False;
end case;
if I mod 2 = 0 then
V := V * 2;
end if;
Sum := Sum + V / 10 + (V mod 10);
end loop;
return (10 - (Sum mod 10)) mod 10 =
Character'Pos (Code (Code'Last)) - Character'Pos ('0');
end Check_Cusip;
type Cusip_Array is array (Natural range <>) of Cusip;
Test_Array : Cusip_Array :=
("037833100",
"17275R102",
"38259P508",
"594918104",
"68389X106",
"68389X105");
begin
for I in Test_Array'Range loop
Put (Test_Array (I) & ": ");
if Check_Cusip (Test_Array (I)) then
Put_Line ("valid");
else
Put_Line ("not valid");
end if;
end loop;
end Cusip_Test;

View file

@ -0,0 +1,28 @@
def cusip_check (input)
return false unless input.size == 9
sum = 0
input.chars.each_with_index do |c, i|
break if i == 8
v = case c
when .ascii_number? then c.to_i
when .ascii_uppercase? then c.ord - 'A'.ord + 10
when '*' then 36
when '@' then 37
when '#' then 38
else return false
end
v *= 2 if (i+1).even?
sum += v // 10 + v % 10
end
input[-1].to_i? == (10 - sum % 10) % 10
end
["037833100",
"17275R102",
"38259P508",
"594918104",
"68389X106",
"68389X105"].each do |cusip|
print cusip, ": ", cusip_check(cusip) ? "valid" : "invalid", "\n"
end

View file

@ -0,0 +1,89 @@
(* CUSIP *)
block
unit check_digit: function (cusip: string): integer;
var
sum, v, i_first, i_last, i: integer,
c: character,
check_needed: boolean,
ccusip: arrayof character;
begin
sum := 0;
ccusip := unpack(cusip);
i, i_first := lower(ccusip);
i_last := upper(ccusip);
check_needed := true;
while (i < i_last) and check_needed
do
c := ccusip(i);
if ord(c) >= ord('0') and ord(c) <= ord('9')
then
v := ord(c) - ord('0')
else
if ord('A') <= ord(c) and ord(c) <= ord('Z')
then
v := ord(c) - ord('A') + 10
else
case c
when '*': v := 36;
when '@': v := 37;
when '#': v := 38;
otherwise
result := -1;
check_needed := false
esac
fi
fi;
if check_needed
then
if (i - i_first) mod 2 = 1 then v := 2 * v fi;
if i - i_first <= 7 then sum := sum + v div 10 + v mod 10 fi;
i := i + 1
fi;
od;
if check_needed
then
if i - i_first =/= 8
then
result := -1
else
result := (10 - sum mod 10) mod 10
fi;
fi;
end check_digit;
unit is_valid: function (cusip: string): boolean;
var
check: integer,
ccusip: arrayof character;
begin
check := check_digit(cusip);
if check < 0
then
result := false
else
ccusip := unpack(cusip);
result := ord(ccusip(lower(ccusip) + 8)) = ord('0') + check
fi;
end is_valid;
unit write_verdict: procedure (cusip: string);
begin
if is_valid(cusip)
then
writeln(cusip, " : Valid")
else
writeln(cusip, " : Invalid")
fi
end write_verdict;
begin
writeln("CUSIP Verdict");
call write_verdict("037833100");
call write_verdict("17275R102");
call write_verdict("38259P508");
call write_verdict("594918104");
call write_verdict("68389X106");
call write_verdict("68389X105");
end;

View file

@ -0,0 +1,60 @@
MODULE Cusip; (* validate CUSIP codes *)
IMPORT Strings, Out;
CONST cusipBase = 39;
cusipLength = 9;
VAR cusipDigits : ARRAY cusipBase + 1 OF CHAR; (* 39 digits + trailing nul *)
(* returns TRUE if cusip is a valid CUSIP code, FALSE otherwise *)
PROCEDURE isCusip( cusip : ARRAY OF CHAR ) : BOOLEAN;
VAR sum, digit, cPos, checkDigit : INTEGER;
isValid : BOOLEAN;
(* returns the base 39 digit corresponding to a character of a CUSIP code *)
PROCEDURE cusipDigit( cChar : CHAR ) : INTEGER;
VAR digit, dPos : INTEGER;
BEGIN
digit := -999;
dPos := 0;
WHILE ( dPos <= cusipBase ) & ( digit < 0 ) DO
IF cusipDigits[ dPos ] = cChar THEN digit := dPos END;
INC( dPos )
END
RETURN digit
END cusipDigit ;
BEGIN
IF Strings.Length( cusip ) # cusipLength THEN
isValid := FALSE (* invalid length code *)
ELSE
(* CUSIP code has the correct length *)
sum := 0;
checkDigit := cusipDigit( cusip[ cusipLength - 1 ] );
FOR cPos := 0 TO cusipLength - 2 DO
digit := cusipDigit( cusip[ cPos ] );
IF ODD( cPos ) THEN digit := digit * 2 END;
INC( sum, ( digit DIV 10 ) + ( digit MOD 10 ) )
END;
isValid := ( 10 - ( sum MOD 10 ) ) MOD 10 = checkDigit
END
RETURN isValid
END isCusip ;
PROCEDURE testCusip( cusip : ARRAY OF CHAR ) ;
BEGIN
Out.String( cusip );
IF isCusip( cusip ) THEN Out.String( " valid" ) ELSE Out.String( " invalid" ) END;
Out.Ln
END testCusip;
BEGIN
cusipDigits := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*@#";
testCusip( "037833100" );
testCusip( "17275R102" );
testCusip( "38259P508" );
testCusip( "594918104" );
testCusip( "68389X106" );
testCusip( "68389X105" )
END Cusip.

View file

@ -0,0 +1,70 @@
program cusip(output);
const
cusiplen = 9;
type
tcusip = array [1 .. cusiplen] of char;
function cusipcheckdigit(cusip: tcusip): integer;
(* Check digit *)
var
i, sum, v: integer;
c: char;
contcheck: boolean; (* Continue checking? *)
begin
i := 1;
sum := 0;
contcheck := true;
while (i <= cusiplen) and contcheck do
begin
c := cusip[i];
if ('0' <= c) and (c <= '9') then v := ord(c) - 48
else if ('A' <= c) and (c <= 'Z') then v := ord(c) - 65 + 10
else if c = '*' then v := 36
else if c = '@' then v := 37
else if c = '#' then v := 38
else
begin
cusipcheckdigit := -1;
contcheck := false;
end;
if contcheck then
begin
if (i - 1) mod 2 = 1 then v := 2 * v;
if i <= 8 then sum := sum + (v div 10) + (v mod 10);
i := i + 1;
end;
end;
if contcheck then
if i <> 10 then cusipcheckdigit := -1
else cusipcheckdigit := (10 - (sum mod 10)) mod 10;
end;
function isvalidcusip(cusip: tcusip): boolean;
var
check: integer;
begin
check := cusipcheckdigit(cusip);
if check < 0 then isvalidcusip := false
else isvalidcusip := (ord(cusip[9]) = ord(48 + check));
end;
procedure writeverdict(cusip: tcusip);
(* Write the verdict *)
begin
write(cusip);
if isvalidcusip(cusip) then writeln(' : Valid')
else writeln(' : Invalid');
end;
begin
writeln('CUSIP Verdict');
writeverdict('037833100');
writeverdict('17275R102');
writeverdict('38259P508');
writeverdict('594918104');
writeverdict('68389X106');
writeverdict('68389X105');
(* readln; *)
end.

View file

@ -0,0 +1,33 @@
local function is_cusip(s)
if #s != 9 then return false end
local sum = 0
for i = 1, 8 do
local c = s[i]
local v = switch true do
case c >= '0' and c <= '9' -> c:byte() - 48
case c >= 'A' and c <= 'Z' -> c:byte() - 55
case c == "*" -> 36
case c == "@" -> 37
case c == "#" -> 38
default -> nil
end
if !v then return false end
if i % 2 == 0 then v = v * 2 end -- check if even as using 1-based indexing
sum += v // 10 + v % 10
end
return s[9]:byte() - 48 == (10 - (sum % 10)) % 10
end
local candidates = {
"037833100",
"17275R102",
"38259P508",
"594918104",
"68389X106",
"68389X105"
}
for candidates as candidate do
local b = is_cusip(candidate) ? "correct" : "incorrect"
print($"{candidate} -> {b}")
end

View file

@ -0,0 +1,48 @@
function Get-CheckDigitCUSIP {
[CmdletBinding()]
[OutputType([int])]
Param ( # Validate input
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern( '^[A-Z0-9@#*]{8}\d$' )] # @#*
[ValidateScript({$_.Length -eq 9})]
[string]
$cusip
)
$sum = 0
0..7 | ForEach { $c = $cusip[$_] ; $v = $null
if ([Char]::IsDigit($c)) { $v = [char]::GetNumericValue($c) }
if ([Char]::IsLetter($c)) { $v = [int][char]$c - [int][char]'A' +10 }
if ($c -eq '*') { $v = 36 }
if ($c -eq '@') { $v = 37 }
if ($c -eq '#') { $v = 38 }
if($_ % 2){ $v += $v }
$sum += [int][Math]::Floor($v / 10 ) + ($v % 10)
}
[int]$checkDigit_calculated = ( 10 - ($sum % 10) ) % 10
return( $checkDigit_calculated )
}
function Test-IsCUSIP {
[CmdletBinding()]
[OutputType([bool])]
Param (
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern( '^[A-Z0-9@#*]{8}\d$' )]
[ValidateScript({$_.Length -eq 9})]
[string]
$cusip
)
[int]$checkDigit_told = $cusip[-1].ToString()
$checkDigit_calculated = Get-CheckDigitCUSIP $cusip
($checkDigit_calculated -eq $checkDigit_told)
}
$data = @"
037833100`tApple Incorporated
17275R102`tCisco Systems
38259P508`tGoogle Incorporated
594918104`tMicrosoft Corporation
68389X106`tOracle Corporation (incorrect)
68389X105`tOracle Corporation
"@ -split "`n"
$data |%{ Test-IsCUSIP $_.Split("`t")[0] }

View file

@ -0,0 +1,61 @@
' CUSIP
DECLARE SUB PrintVerdict (Cusip$)
DECLARE FUNCTION CusipCheckDigit% (Cusip$)
DECLARE FUNCTION IsValidCusip% (Cusip$)
CONST TRUE% = -1, FALSE% = 0
PRINT "CUSIP Verdict"
PrintVerdict "037833100"
PrintVerdict "17275R102"
PrintVerdict "38259P508"
PrintVerdict "594918104"
PrintVerdict "68389X106"
PrintVerdict "68389X105"
END
FUNCTION CusipCheckDigit% (Cusip$)
I% = 1
Sum% = 0
L% = LEN(Cusip$)
DO WHILE I% < L%
IF ("0" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "9") THEN
V% = ASC(MID$(Cusip$, I%, 1)) - 48 ' 0
ELSEIF ("A" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "Z") THEN
V% = ASC(MID$(Cusip$, I%, 1)) - 65 + 10
ELSEIF MID$(Cusip$, I%, 1) = "*" THEN
V% = 36
ELSEIF MID$(Cusip$, I%, 1) = "@" THEN
V% = 37
ELSEIF MID$(Cusip$, I%, 1) = "#" THEN
V% = 38
ELSE
CusipCheckDigit% = -1
EXIT FUNCTION
END IF
IF (I% - 1) MOD 2 = 1 THEN V% = 2 * V%
IF I% <= 8 THEN Sum% = Sum% + (V% \ 10) + (V% MOD 10)
I% = I% + 1
LOOP
IF I% <> 9 THEN
CusipCheckDigit% = -1
ELSE
CusipCheckDigit% = (10 - (Sum% MOD 10)) MOD 10
END IF
END FUNCTION
FUNCTION IsValidCusip% (Cusip$)
Check% = CusipCheckDigit%(Cusip$)
IF Check% < 0 THEN
IsValidCusip% = FALSE
ELSE
IsValidCusip% = (MID$(Cusip$, 9, 1) = CHR$(48 + Check%))
END IF
END FUNCTION
SUB PrintVerdict (Cusip$)
PRINT Cusip$;
IF IsValidCusip%(Cusip$) THEN
PRINT " : Valid"
ELSE
PRINT " : Invalid"
END IF
END SUB