Реализации алгоритмов/Алгоритм Луна

Алгоритм Лу́на (англ. Luhn algorithm) — алгоритм вычисления контрольной цифры номера пластиковых карт в соответствии со стандартом ISO/IEC 7812.

ПаскальПравить

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;

Править

// Оригинальный алгоритм, описанный Луном
Функция АлгоритмЛуна(Текст)
	ДлинаНомера = СтрДлина(Текст);
	Сумма = 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