Data update
This commit is contained in:
parent
4bb20c9b71
commit
cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions
63
Task/CUSIP/ANSI-BASIC/cusip.basic
Normal file
63
Task/CUSIP/ANSI-BASIC/cusip.basic
Normal 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
54
Task/CUSIP/Ada/cusip.adb
Normal 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;
|
||||
28
Task/CUSIP/Crystal/cusip.cr
Normal file
28
Task/CUSIP/Crystal/cusip.cr
Normal 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
|
||||
89
Task/CUSIP/Loglan82/cusip.loglan82
Normal file
89
Task/CUSIP/Loglan82/cusip.loglan82
Normal 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;
|
||||
60
Task/CUSIP/Oberon-07/cusip.oberon
Normal file
60
Task/CUSIP/Oberon-07/cusip.oberon
Normal 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.
|
||||
70
Task/CUSIP/Pascal-P/cusip.pas
Normal file
70
Task/CUSIP/Pascal-P/cusip.pas
Normal 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.
|
||||
33
Task/CUSIP/Pluto/cusip.pluto
Normal file
33
Task/CUSIP/Pluto/cusip.pluto
Normal 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
|
||||
48
Task/CUSIP/PowerShell/cusip.ps1
Normal file
48
Task/CUSIP/PowerShell/cusip.ps1
Normal 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] }
|
||||
61
Task/CUSIP/QuickBASIC/cusip.basic
Normal file
61
Task/CUSIP/QuickBASIC/cusip.basic
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue