CUSIP: Difference between revisions
Content added Content deleted
m (Added more cusip tests. Same as Clojure) |
(Added solution for Action!) |
||
Line 190: | Line 190: | ||
CUSIP 68389X106 isn't valid |
CUSIP 68389X106 isn't valid |
||
CUSIP 68389X105 is valid |
CUSIP 68389X105 is valid |
||
</pre> |
|||
=={{header|Action!}}== |
|||
{{libheader|Action! Tool Kit}} |
|||
<lang Action!>INCLUDE "D2:CHARTEST.ACT" ;from the Action! Tool Kit |
|||
BYTE FUNC Verify(CHAR ARRAY code) |
|||
BYTE i,c,v |
|||
CARD sum |
|||
IF code(0)#9 THEN |
|||
RETURN (0) |
|||
ELSEIF IsDigit(code(1))=0 THEN |
|||
RETURN (0) |
|||
FI |
|||
sum=0 |
|||
FOR i=2 TO code(0) |
|||
DO |
|||
c=code(i) |
|||
IF IsDigit(c) THEN |
|||
v=c-'0 |
|||
ELSEIF IsAlpha(c) THEN |
|||
v=ToUpper(c)-'A+10 |
|||
ELSEIF c='* THEN |
|||
v=36 |
|||
ELSEIF c='@ THEN |
|||
v=37 |
|||
ELSEIF c='# THEN |
|||
v=38 |
|||
ELSE |
|||
RETURN (0) |
|||
FI |
|||
IF (i&1)=0 THEN |
|||
v==*2 |
|||
FI |
|||
sum==+v/10+v MOD 10 |
|||
OD |
|||
v=(10-(sum MOD 10)) MOD 10 |
|||
IF v#code(1)-'0 THEN |
|||
RETURN (0) |
|||
FI |
|||
RETURN (1) |
|||
PROC Test(CHAR ARRAY code) |
|||
Print(code) |
|||
IF Verify(code) THEN |
|||
PrintE(" is valid") |
|||
ELSE |
|||
PrintE(" is invalid") |
|||
FI |
|||
RETURN |
|||
PROC Main() |
|||
Put(125) PutE() ;clear the screen |
|||
Test("037833100") |
|||
Test("17275R102") |
|||
Test("38259P508") |
|||
Test("594918104") |
|||
Test("68389X106") |
|||
Test("68389X105") |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/CUSIP.png Screenshot from Atari 8-bit computer] |
|||
<pre> |
|||
037833100 is valid |
|||
17275R102 is valid |
|||
38259P508 is valid |
|||
594918104 is valid |
|||
68389X106 is invalid |
|||
68389X105 is valid |
|||
</pre> |
</pre> |
||