Luhn test of credit card numbers: Difference between revisions

Content added Content deleted
No edit summary
(Added solution for Action!)
Line 478: Line 478:
> (luhn 1234567812345670)
> (luhn 1234567812345670)
T</pre>
T</pre>

=={{header|Action!}}==
<lang Action!>PROC ReverseDigits(CHAR ARRAY n,rev)
BYTE i,j

i=n(0)
WHILE i>0 AND n(i)='0
DO
i==-1
OD

j=1
WHILE i>0
DO
rev(j)=n(i)
j==+1 i==-1
OD
rev(0)=j-1
RETURN

BYTE FUNC SumOddDigits(CHAR ARRAY n)
BYTE sum,i

sum=0
FOR i=1 TO n(0) STEP 2
DO
sum==+ValB(n(i))
OD
RETURN(sum)

BYTE FUNC SumEvenDigitsMultiplied(CHAR ARRAY n)
BYTE sum,i,v

sum=0
FOR i=2 TO n(0) STEP 2
DO
v=ValB(n(i))*2
IF v>9 THEN v==-9 FI
sum==+v
OD
RETURN(sum)

BYTE FUNC Luhn(CHAR ARRAY n)
CHAR ARRAY rev(20)
BYTE s1,s2

ReverseDigits(n,rev)
s1=SumOddDigits(rev)
s2=SumEvenDigitsMultiplied(rev)

IF (s1+s2) MOD 10=0 THEN
RETURN(1)
FI
RETURN(0)
PROC Test(CHAR ARRAY n)
PrintF("%S is ",n)
IF Luhn(n) THEN
PrintE("valid")
ELSE
PrintE("invalid")
FI
RETURN

PROC Main()
Test("49927398716")
Test("49927398717")
Test("1234567812345678")
Test("1234567812345670")
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Luhn_test_of_credit_card_numbers.png Screenshot from Atari 8-bit computer]
<pre>
49927398716 is valid
49927398717 is invalid
1234567812345678 is invalid
1234567812345670 is valid
</pre>


=={{header|ActionScript}}==
=={{header|ActionScript}}==