Skip to content

Instantly share code, notes, and snippets.

@quarkgluant
Created February 13, 2020 16:06
Show Gist options
  • Save quarkgluant/fa1ffaf15e29353bec0e14d671275171 to your computer and use it in GitHub Desktop.
Save quarkgluant/fa1ffaf15e29353bec0e14d671275171 to your computer and use it in GitHub Desktop.
une solution pour le kata Luhn
# 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