Помогите мне реорганизовать реализации Luhn algorithm, которая описывается следующим образом:Refactor рубин код алгоритма Лун
формула проверяет ряд против его включить контрольную цифру, которая обычно приложенном к частичному номер счета для создания полный номер . Этот номер счета должен пройти следующее тестирование:
- С самой правой цифры, которая является контрольной цифрой, перемещается влево, удваивает значение каждой второй цифры; если произведение этой операции удвоения больше 9 (например, 8 × 2 = 16), затем суммируют цифры продуктов (например, 16: 1 + 6 = 7, 18: 1 + 8 = 9).
- Возьмите сумму всех цифр.
- Если суммарный модуль 10 равен 0 (если сумма заканчивается на ноль), то число действует в соответствии с формулой Луна; иначе это неверно.
Предположим, пример номер счета "7992739871", который будет иметь контрольную цифру добавил, что делает его формы 7992739871x:
Account number 7 9 9 2 7 3 9 8 7 1 x
Double every other 7 18 9 4 7 6 9 16 7 2 -
Sum of digits 7 9 9 4 7 6 9 7 7 2 =67
Контрольная цифра (x) получается путем вычисления суммы d igits затем вычисляет 9 раз это значение по модулю 10 (в форме уравнения, (67 × 9 mod 10)). В форме алгоритма:
- Вычислить сумму цифр (67).
- Умножить на 9 (603).
- Последняя цифра, 3, является контрольной цифрой. Таким образом, x = 3.
Ниже приводится моя реализация, она работает, но может быть намного лучше, я считаю.
def credit_check(num)
verify = num.to_s.split('').map(&:to_i)
half1 = verify.reverse.select.each_with_index { |str, i| i.even? }
half1 = half1.inject(0) { |r,i| r + i }
# This implements rule 1
half2 = verify.reverse.select.each_with_index { |str, i| i.odd? }
double = half2.map { |n| n * 2 }
double = double.map { |n| n.to_s.split('') }
double = double.flatten.map(&:to_i)
double = double.inject(0) { |r,i| r + i }
final = double + half1
puts final % 10 == 0 && (num.to_s.length > 12 && num.to_s.length < 17) ? "VALID" : "INVALID"
end
Я вообще-то ранг нуб, очевидно. Но я ценю любую помощь, включая правильный стиль!
Первым шагом является использование редактора, который помогает обеспечить отступ. Это долгий путь к написанию правильного кода. –
Спасибо. Я использовал пико, который не помогает! – sarkon
Есть много хороших редакторов. Двумя основными моделями являются vim и emacs. Они немного кривая обучения, но они работают на нескольких платформах, поэтому, узнав, что один или другой вы можете использовать те же команды и конфигурации на других машинах. Я использую vim для Mac OS, Windows и Linux, все с одинаковыми конфигурациями. Также оба Sublime Text Editor и Textmate хороши; Sublime находится в непрерывном развитии, и Textmate, похоже, устарел. –