Luhn test of credit card numbers: Difference between revisions

m
imported>Thebeez
(Added uBasic/4tH version)
 
(7 intermediate revisions by 5 users not shown)
Line 1,827:
$ echo 1234567812345670 | beef luhn.bf
Pass</pre>
 
=={{header|Bruijn}}==
<syntaxhighlight lang="langurbruijn">val .luhntest = f(.s) {
:import std/Combinator .
:import std/Math .
:import std/List .
 
luhn number→list → reverse → check → (\mod (+10)) → zero?
check y [[[[0 [[[6 \5 (4 + (5 odd even)) 1]]] 1]]]] k (+0)
odd 2
even digit-sum (2 ⋅ (+2))
 
:test (luhn (+61789372994)) ([[1]])
:test (luhn (+49927398716)) ([[1]])
:test (luhn (+49927398717)) ([[0]])
:test (luhn (+1234567812345678)) ([[0]])
:test (luhn (+1234567812345670)) ([[1]])
</syntaxhighlight>
 
=={{header|Burlesque}}==
Line 2,855 ⟶ 2,873:
1234567812345678: fail
1234567812345670: pass</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight>
func luhn cc$ .
for i = len cc$ downto 1
odd = 1 - odd
dig = number substr cc$ i 1
if odd = 0
dig = 2 * dig
if dig >= 10
dig -= 9
.
.
sum += dig
.
return if sum mod 10 = 0
.
cc$[] = [ "49927398716" "49927398717" "1234567812345678" "1234567812345670" ]
for cc$ in cc$[]
write cc$ & " "
if luhn cc$ = 1
print "is valid"
else
print "is not valid"
.
.
</syntaxhighlight>
{{out}}
<pre>
49927398716 is valid
49927398717 is not valid
1234567812345678 is not valid
1234567812345670 is valid
</pre>
 
=={{header|EchoLisp}}==
Line 3,870 ⟶ 3,922:
=={{header|langur}}==
{{trans|Go}}
<syntaxhighlight lang="langur">val .luhntest = fn(.s) {
{{works with|langur|0.8.10}}
<syntaxhighlight lang="langur">val .luhntest = f(.s) {
val .t = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
val .numbers = s2n .s
Line 3,881 ⟶ 3,932:
}
 
val .tests = h{
"49927398716": true,
"49927398717": false,
Line 5,474 ⟶ 5,525:
ok 4 - 1234567812345670 passes the Luhn test.</pre>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
= <Test '49927398716'>
<Test '49927398717'>
<Test '1234567812345678'>
<Test '1234567812345670'>;
};
 
Test {
e.Digits = <Prout e.Digits ': ' <Luhn e.Digits>>;
};
 
Luhn {
(s.Sum) e.Digits s.Even s.Odd,
<Mul 2 <Numb s.Even>>: s.Even2,
<Divmod s.Even2 10>: (s.EvenD1) s.EvenD2,
<+ s.EvenD1 s.EvenD2>: s.EvenV,
<+ <Numb s.Odd> s.EvenV>: s.Step
= <Luhn (<+ s.Sum s.Step>) e.Digits>;
(s.Sum) s.Odd = <Luhn (<+ s.Sum <Numb s.Odd>>)>;
(s.Sum), <Divmod s.Sum 10>: (s.Rest) s.Last,
s.Last: {
0 = Valid;
s.X = Invalid;
};
e.Digits = <Luhn (0) e.Digits>;
};</syntaxhighlight>
{{out}}
<pre>49927398716: Valid
49927398717: Invalid
1234567812345678: Invalid
1234567812345670: Valid</pre>
=={{header|REXX}}==
===version 1===
Line 5,615 ⟶ 5,698:
=={{header|RPL}}==
Card numbers shall be entered as strings to avoid any rounding error when testing long ones.
{{works with|Halcyon CalcRPL|4.2.8HP48-C}}
{| class="wikitable"
! RPL code
Line 5,621 ⟶ 5,704:
|-
|
« 0 → card even
« 0
≪ 0 card SIZE 1 '''FOR''' j
card SIZE 1 card'''FOR''' j DUP SUB →STR
'''IF'''card j 2 MOD NOTDUP '''THENSUB '''OBJ→
'''IF''' 2 * 10 MOD LAST / FLOOR +even '''ENDTHEN'''
DUP + -110 MOD LASTARG / IP + '''STEPEND'''
10 MOD NOT + 1 'even' STO-
-1 '''STEP'''
≫ ≫ '<span style="color:blue">LUHN?</span>' STO
10 MOD NOT
» » '<span style="color:blue">LUHN?</span>' STO
|
<span style="color:blue">LUHN?</span> ''( "card_number" -- boolean ) ''
sum = 0 ; loop for j=n to 1
loop for j=n to 1
digit = card[j]
if even digit
multiply it by 2 and add digits
sum += digit ; reverse parity flag
return not(sum mod 10)
|}
{ "49927398716" "49927398717" "1234567812345678" "1234567812345670" } 1 « <span style="color:blue">LUHN?</span> cases» DOLIST
≪ { } 1 cases SIZE '''FOR''' j cases j GET <span style="color:blue">LUHN?</span> + '''NEXT''' ≫ ≫ EVAL
{{out}}
<pre>
885

edits