Last active
July 9, 2018 23:44
-
-
Save caioertai/3739edb59c423a94385429ba8ce10983 to your computer and use it in GitHub Desktop.
Monday, July 9th - Le Wagon Livecode - Batch #169
This file contains 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
'01': Ain | |
'02': Aisne | |
'03': Allier | |
'04': Alpes-de-Haute-Provence | |
'05': Hautes-Alpes | |
'06': Alpes-Maritimes | |
'07': Ardèche | |
'08': Ardennes | |
'09': Ariège | |
'10': Aube | |
'11': Aude | |
'12': Aveyron | |
'13': Bouches-du-Rhône | |
'14': Calvados | |
'15': Cantal | |
'16': Charente | |
'17': Charente-Maritime | |
'18': Cher | |
'19': Corrèze | |
'2A': Corse-du-Sud | |
'2B': Haute-Corse | |
'21': Côte-d'Or | |
'22': Côtes-d'Armor | |
'23': Creuse | |
'24': Dordogne | |
'25': Doubs | |
'26': Drôme | |
'27': Eure | |
'28': Eure-et-Loir | |
'29': Finistère | |
'30': Gard | |
'31': Haute-Garonne | |
'32': Gers | |
'33': Gironde | |
'34': Hérault | |
'35': Ille-et-Vilaine | |
'36': Indre | |
'37': Indre-et-Loire | |
'38': Isère | |
'39': Jura | |
'40': Landes | |
'41': Loir-et-Cher | |
'42': Loire | |
'43': Haute-Loire | |
'44': Loire-Atlantique | |
'45': Loiret | |
'46': Lot | |
'47': Lot-et-Garonne | |
'48': Lozère | |
'49': Maine-et-Loire | |
'50': Manche | |
'51': Marne | |
'52': Haute-Marne | |
'53': Mayenne | |
'54': Meurthe-et-Moselle | |
'55': Meuse | |
'56': Morbihan | |
'57': Moselle | |
'58': Nièvre | |
'59': Nord | |
'60': Oise | |
'61': Orne | |
'62': Pas-de-Calais | |
'63': Puy-de-Dôme | |
'64': Pyrénées-Atlantiques | |
'65': Hautes-Pyrénées | |
'66': Pyrénées-Orientales | |
'67': Bas-Rhin | |
'68': Haut-Rhin | |
'69': Rhône | |
'70': Haute-Saône | |
'71': Saône-et-Loire | |
'72': Sarthe | |
'73': Savoie | |
'74': Haute-Savoie | |
'75': Paris | |
'76': Seine-Maritime | |
'77': Seine-et-Marne | |
'78': Yvelines | |
'79': Deux-Sèvres | |
'80': Somme | |
'81': Tarn | |
'82': Tarn-et-Garonne | |
'83': Var | |
'84': Vaucluse | |
'85': Vendée | |
'86': Vienne | |
'87': Haute-Vienne | |
'88': Vosges | |
'89': Yonne | |
'90': Territoire de Belfort | |
'91': Essonne | |
'92': Hauts-de-Seine | |
'93': Seine-Saint-Denis | |
'94': Val-de-Marne | |
'95': Val-d'Oise |
This file contains 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
require 'date' | |
require 'yaml' | |
PATTERN = /\A(?<gender>1|2)\s*(?<yob>\d\d)\s*(?<mob>0[1-9]|1[0-2])\s*(?<dept>0[1-9]|[1-9]\d)\s*\d{3}\s*\d{3}\s*(?<key>\d{2})\z/ | |
def french_ssn_info(ssn) | |
# Checks for a match with our PATTERN | |
# tip: it will be nil if no match, and MatchData if it matches | |
match_ssn = ssn.match(PATTERN) | |
# Checks if the ssn both matches the regexp AND fulfills the key condition to be valid | |
if match_ssn && validate_ssn_key(match_ssn) | |
# Returns man or woman according to the first number of the SSN | |
gender = match_ssn[:gender] == "1" ? "man" : "woman" | |
# Converts the year of bith into the 4 digits format | |
yob = "19#{match_ssn[:yob]}" | |
# Uses ruby's Date library to convert numbers into month names | |
mob = Date::MONTHNAMES[match_ssn[:mob].to_i] | |
# Checks our #french_departments method for the name relative to the deparment | |
# number we got from the SSN | |
dept = french_departments[match_ssn[:dept]] | |
return "a #{gender}, born in #{mob}, #{yob} in #{dept}." | |
else | |
return "The number is invalid" | |
end | |
end | |
def validate_ssn_key(match_ssn) | |
# Grabs the whole matched string from the MatchData object | |
# and removes the spaces (/\s+/) with gsub | |
# tip: Whole matched string is always on position [0] | |
ssn = match_ssn[0].gsub(/\s+/, '') | |
# Returns the whole SSN except the last 2 characters (the ssn key) | |
# from the string and then convert it to an integer | |
# tip: in [0..-1] 0 would mean the first character and -1 the last one | |
# so [0..-3] means all except the last 2 | |
ssn_without_key = ssn[0..-3].to_i | |
# Does the required operation over the ssn to match its key | |
((97 - ssn_without_key) % 97) == match_ssn[:key].to_i | |
end | |
def french_departments | |
# Creates a hash from a YAML file | |
YAML.load_file('data/french_departments.yml') | |
end |
This file contains 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
require_relative "../french_ssn" | |
describe "#french_ssn_info" do | |
it "should return a man, born in December, 1984 in Seine-Maritime when SSN is 1 84 12 76 451 089 46" do | |
actual = french_ssn_info("1 84 12 76 451 089 46") | |
expected = "a man, born in December, 1984 in Seine-Maritime." | |
expect(actual).to eq(expected) | |
end | |
it "should return The number is invalid when SSN is 123" do | |
actual = french_ssn_info("123") | |
expected = "The number is invalid" | |
expect(actual).to eq(expected) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment