Реализации алгоритмов/Алгоритм Луна
Алгоритм Лу́на (англ. Luhn algorithm) — алгоритм вычисления контрольной цифры номера пластиковых карт в соответствии со стандартом ISO/IEC 7812.
Паскаль[править]
![]() |
Внимание! (Возможно не верная реализация, результат не совпадает с результатами реализаций на сайте https://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers) |
Num[1..N] — номер карты, Num[N] — контрольная цифра.
function Luhn(Num: array of Integer; var sum: Integer): Boolean;
var
i, p: integer;
begin
sum := 0;
for i := High(Num) downto Low(Num) do
begin
p := Num[i];
if i mod 2 = 0 then
p := 2 * p;
if p > 9 then
p := p - 9;
sum := sum + p;
end;
Result := sum mod 10 = 0;
sum := 10 - (sum mod 10);
if sum = 10 then
sum := 0;
end;
1С[править]
// Оригинальный алгоритм, описанный Луном Функция АлгоритмЛуна(Текст)
ДлинаНомера = СтрДлина(Текст); Сумма = 0; Для i = 1 по ДлинаНомера Цикл НомерЦифры = ДлинаНомера-i+1; Цифра = Число(Сред(Текст,НомерЦифры,1)); Сумма = Сумма+?(НомерЦифры%2=1,Цифра,Цифра*2%9); КонецЦикла;
Возврат Сумма%10 = 0;
КонецФункции
&НаСервере //Общепринятый алгоритм Функция ПроверкаНомераКарты(Текст) Экспорт
ДлинаНомера = СтрДлина(Текст); Сумма = 0; Если ДлинаНомера%2=0 Тогда //четная карта Для i = 0 по ДлинаНомера-1 Цикл НомерЦифры = i+1; Цифра = Число(Сред(Текст,НомерЦифры,1)); Сумма = Сумма+?(НомерЦифры%2=1,?(Цифра*2>9,Цифра*2-9,Цифра*2),Цифра); КонецЦикла; иначе Для i = 0 по ДлинаНомера-1 Цикл НомерЦифры = i+1; Цифра = Число(Сред(Текст,НомерЦифры,1)); Сумма = Сумма+?(НомерЦифры%2=0,?(Цифра*2>9,Цифра*2-9,Цифра*2),Цифра); КонецЦикла; КонецЕсли;
Возврат Сумма%10 = 0
КонецФункции
Ruby[править]
Выражение возвращает true если число (num) соответствует алгоритму Луна и false в противном случае.
num.to_s.reverse.split(//).each_slice(2).flat_map{|a,b| [a.to_i,2*b.to_i]}.join.split(//).map(&:to_i).reduce(:+)%10==0