Created
February 13, 2020 16:06
-
-
Save quarkgluant/fa1ffaf15e29353bec0e14d671275171 to your computer and use it in GitHub Desktop.
une solution pour le kata Luhn
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# luhn.rb | |
class Luhn | |
def initialize(input) | |
@input = input.delete(' ') # on enlève tous les espaces | |
end | |
def self.valid?(input) | |
new(input).valid? | |
end | |
# la méthode testée par le fihcier de test fourni dans le sujet est une méthode de classe. Je crée une méthode | |
# d'instance portant le même nom pour pouvoir travailler sur des instnaces, car il est déconseillé d'avoir une classe | |
# avec plein ET que des méthodes de classe quand on peut faire autrement | |
def valid? | |
return false if @input.length < 2 || @input =~ /[^\d]/ # j'utilise une RegEx pour vérifier s'il y a autre chose | |
# que des chiffres dans ma chaîne débarassée des espaces | |
checksum % 10 == 0 | |
end | |
private | |
# noter la création de plusierus petites méthodes utilitaires, on découpe le problème en petits bouts | |
def double(digit) | |
# petite méthode avec un ternaire (remplaçant un if-else-end) pour calcler le "double" | |
(digit * 2 > 9) ? digit * 2 - 9 : digit * 2 | |
end | |
def digits | |
# je transforme ma chaîne en array de chars, puis la mets à l'envers et enfin transforme chaque caractère en chiffre | |
@input.chars.reverse.map(&:to_i) | |
end | |
def checksum | |
digits.each_slice(2).sum { |first, second = 0| first + double(second) } | |
#regarder sur https://ruby-doc.org/core-2.6.5/Enumerable.html#method-i-each_slice pour voir ce que fait précisément | |
# each_slice, qui découpe pa tranche | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment