moduleMainwhereimportData.BitsimportqualifiedData.MapasMaptypeBitflip=Int->InttypeFloatAddress=Int->[Int]typeMask=([Bitflip],[FloatAddress])typeMaskParser=Int->String->Mask->MasktypeMemory=Map.MapIntIntdataOp=AsnIntInt|MaskMask------------------ Part 1 --------------------parseMask::MaskParserparseMask_[]mask=maskparseMaskpow('0':xs)(a,b)=parseMask(pow+1)xs((complement(2^pow).&.):a,b)parseMaskpow('1':xs)(a,b)=parseMask(pow+1)xs(((2^pow).|.):a,b)parseMaskpow('X':xs)(a,b)=parseMask(pow+1)xs(a,b)solve_1::[Op]->[Bitflip]->Memory->Intsolve_1[]_mem=sum$mapsnd$Map.toListmemsolve_1(Mask(bflips,_):xs)_mem=solve_1xsbflipsmemsolve_1(Asnab:xs)maskmem=solve_1xsmask(Map.inserta(foldl(flip($))bmask)mem)------------------ Part 2 --------------------writeFloating::Int->Int->[Int]writeFloatingpowi=[complement(2^pow).&.i,(2^pow).|.i]parseMask2::MaskParserparseMask2_[]mask=maskparseMask2pow('0':xs)mask=parseMask2(pow+1)xsmaskparseMask2pow('1':xs)(a,b)=parseMask2(pow+1)xs(((2^pow).|.):a,b)parseMask2pow('X':xs)(a,b)=parseMask2(pow+1)xs(a,writeFloatingpow:b)solve_2::[Op]->Mask->Memory->Intsolve_2[]_mem=sum$mapsnd$Map.toListmemsolve_2(Maskmask:xs)_mem=solve_2xsmaskmemsolve_2(Asnab:xs)(bflips,floats)memory=solve_2xs(bflips,floats)$foldl(flip(`Map.insert`b))memoryaddrswhereaddr=foldl(flip($))abflipsaddrs=foldl(>>=)[addr]floats------------------ Main --------------------parseOp::MaskParser->String->OpparseOpparsers=ifheadws=="mask"thenMask$parser0(reverse$ws!!2)([],[])elseAsn(read$takeWhile(/=']')$drop4(headws))(read(ws!!2))wherews=wordssmain::IO()main=doinput<-lines<$>readFile"input.txt"letops1=map(parseOpparseMask)inputops2=map(parseOpparseMask2)inputprint$solve_1(tailops1)((\(Maskm)->fstm)$headops1)Map.emptyprint$solve_2(tailops2)((\(Maskm)->m)$headops2)Map.empty
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.
My Haskell solution
Github repo available here github.com/cappe987/aoc-2020