Luhn test of credit card numbers: Difference between revisions

Content deleted Content added
Midaz (talk | contribs)
Added Uiua solution
Greagle (talk | contribs)
→‎{{header|Lua}}: more simple and concise, based on Ada algorithm
 
(2 intermediate revisions by 2 users not shown)
Line 3,922:
=={{header|langur}}==
{{trans|Go}}
<syntaxhighlight lang="langur">val .luhntest = fn(.s) {
val luhntest = fn(s) {
val .t = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
val .numberst = s2n[0, .s2, 4, 6, 8, 1, 3, 5, 7, 9]
val .oddevennumbers = len(.numbers)s rem-> 2s2n
val oddeven = len(numbers) rem 2
 
for[=0] .i of .numbers {
_for += if(.i rem 2 == .oddeven: .numbers[.i]; .t[.numbers[.i]+1])
} div 10
}
 
val .tests = {
"49927398716": true,
"49927398717": false,
Line 3,939 ⟶ 3,940:
}
 
for .key ofin .sort(keys(tests)) {
val .pass = .luhntest(.key)
write .key, ": ", .pass
writeln if(.pass == .tests[.key]: ""; " (LUHN TEST FAILED)")
}
}</syntaxhighlight>
 
{{out}}
Line 4,068 ⟶ 4,070:
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">function luhn(n)
function luhn_test(cc_number)
n=string.reverse(n)
assert(type(cc_number) == 'string')
print(n)
local s1sum = 0
local s2is_odd =0 true
--sum odd digits
for iidx = #cc_number , 1 ,n:len(),2 -1 do -- reverse order
-- extract single character as string then convert to integer
s1=s1+n:sub(i,i)
local digit = cc_number:sub(idx, idx) + 0
end
if is_odd then
--evens
sum = sum + digit
local s2=0
else
for i=2,n:len(),2 do
sum = sum + ((digit * 2) % 10) + (digit // 5)
local doubled=n:sub(i,i)*2
end -- if
doubled=string.gsub(doubled,'(%d)(%d)',function(a,b)return a+b end)
is_odd = not is_odd -- toggle between odd and even
s2=s2+doubled
end -- for
return (sum % 10) == 0
print(s1)
end -- function luhn_test
print(s2)
local total=s1+s2
if total%10==0 then
return true
end
return false
end
 
for _, val in ipairs{"49927398716", "49927398717", "1234567812345678", "1234567812345670"} do
-- Note that this function takes strings, not numbers.
print(val, luhn_test(val))
-- 16-digit numbers tend to be problematic
end -- for
-- when looking at individual digits.
</syntaxhighlight>
print(luhn'49927398716')
print(luhn'49927398717')
print(luhn'1234567812345678')
print(luhn'1234567812345670')</syntaxhighlight>
 
=={{header|M2000 Interpreter}}==
Line 6,031 ⟶ 6,024:
s2Mapping[x[i] + 1];
</syntaxhighlight>
 
=={{header|SETL}}==
<syntaxhighlight lang="setl">program luhn_test;
tests := [
print(luhn' 49927398716'),
print(luhn' 49927398717'),
print(luhn' 1234567812345678'),
1234567812345670
];
 
loop for test in tests do
print(test, if luhn test then "pass" else "fail" end);
end loop;
 
op luhn(n);
fac := 2;
digits := [val d * (fac := 3-fac) : d in reverse str n];
return 0 = +/[d - if d>9 then 9 else 0 end : d in digits] mod 10;
end op;
end program;</syntaxhighlight>
{{out}}
<pre>49927398716 pass
49927398717 fail
1234567812345678 fail
1234567812345670 pass</pre>
 
=={{header|Shen}}==