Still not doing these the day the come out but here's my Haskell solution.
Problems like these seem like work to me :P
{-# LANGUAGE LambdaCase #-}moduleDay4whereimportText.ParsecimportText.Parsec.StringimportControl.Monad(guard)importData.Maybe(mapMaybe,isJust)importData.List.Splithiding(sepBy,endBy,oneOf)importqualifiedData.MapasMimportData.Map(Map)importData.List((\\))importText.Read(readMaybe)importData.CharimportData.Semigroup(All(All),getAll)hush::Eitherea->Maybeahush(Left_)=Nothinghush(Righta)=Justaparse'::Parsera->String->Maybeaparse'p=hush.parsep""-- Part 1parsePassport::String->EitherParseError(MapStringString)parsePassport=fmapM.fromList.parse'(kvp`sepEndBy`space)wherekvp=(,)<$>manyTillanyChar(char':')<*>many(noneOf"\n ")hasRequiredFields::MapStringString->BoolhasRequiredFieldsm=null$["byr","ecl","eyr","hcl","hgt","iyr","pid"]\\M.keysmvalidatePassports::(MapStringString->Bool)->String->[MapStringString]validatePassportsv=filterv.mapMaybe(hush.parsePassport).splitOn"\n\n"solveP1::String->IntsolveP1=length.validatePassportshasRequiredFields-- Part 2typeValidationa=(a->Maybea)within::(Int,Int)->Int->Boolwithin(min,max)i=i>=min&&i<=maxyear::String->MaybeIntyears=parse'(4`times`digit)s>>=readMaybeyearBetween::(Int,Int)->String->MaybeStringyearBetweenrs=years>>=\n->guard(withinrn)>>puresbyr::ValidationStringbyr=yearBetween(1929,2020)iyr::ValidationStringiyr=yearBetween(2010,2020)eyr::ValidationStringeyr=yearBetween(2020,2030)hgt::ValidationStringhgt=parse'(mappend<$>many1digit<*>(try(string"cm")<|>try(string"in")))hcl::ValidationStringhcl=parse'(mappend<$>string"#"<*>6`times`anyChar)ecl::ValidationStringecls|s=="amb"=Justs|s=="blu"=Justs|s=="brn"=Justs|s=="gry"=Justs|s=="grn"=Justs|s=="hzl"=Justs|s=="oth"=Justs|otherwise=Nothingpid::ValidationStringpids=guard(lengths==9&&isNumbers)>>pureswhereisNumber=getAll.foldMap(All.isDigit)validateFields::MapStringString->Maybe(MapStringString)validateFields=M.traverseWithKeyvalidateAtKeywherevalidateAtKey=\case"byr"->byr"iyr"->iyr"eyr"->eyr"hgt"->hgt"hcl"->hcl"ecl"->ecl_->JustsolveP2::String->IntsolveP2=length.validatePassports(\x->hasRequiredFieldsx&&isJust(validateFieldsx))
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Still not doing these the day the come out but here's my Haskell solution.
Problems like these seem like work to me :P