2024-24 part 1 in haskell
This commit is contained in:
parent
fbbe5d517f
commit
ade8a22794
4 changed files with 457 additions and 0 deletions
10
2024/24-Crossed_Wires/example
Normal file
10
2024/24-Crossed_Wires/example
Normal file
|
@ -0,0 +1,10 @@
|
|||
x00: 1
|
||||
x01: 1
|
||||
x02: 1
|
||||
y00: 0
|
||||
y01: 1
|
||||
y02: 0
|
||||
|
||||
x00 AND y00 -> z00
|
||||
x01 XOR y01 -> z01
|
||||
x02 OR y02 -> z02
|
47
2024/24-Crossed_Wires/example2
Normal file
47
2024/24-Crossed_Wires/example2
Normal file
|
@ -0,0 +1,47 @@
|
|||
x00: 1
|
||||
x01: 0
|
||||
x02: 1
|
||||
x03: 1
|
||||
x04: 0
|
||||
y00: 1
|
||||
y01: 1
|
||||
y02: 1
|
||||
y03: 1
|
||||
y04: 1
|
||||
|
||||
ntg XOR fgs -> mjb
|
||||
y02 OR x01 -> tnw
|
||||
kwq OR kpj -> z05
|
||||
x00 OR x03 -> fst
|
||||
tgd XOR rvg -> z01
|
||||
vdt OR tnw -> bfw
|
||||
bfw AND frj -> z10
|
||||
ffh OR nrd -> bqk
|
||||
y00 AND y03 -> djm
|
||||
y03 OR y00 -> psh
|
||||
bqk OR frj -> z08
|
||||
tnw OR fst -> frj
|
||||
gnj AND tgd -> z11
|
||||
bfw XOR mjb -> z00
|
||||
x03 OR x00 -> vdt
|
||||
gnj AND wpb -> z02
|
||||
x04 AND y00 -> kjc
|
||||
djm OR pbm -> qhw
|
||||
nrd AND vdt -> hwm
|
||||
kjc AND fst -> rvg
|
||||
y04 OR y02 -> fgs
|
||||
y01 AND x02 -> pbm
|
||||
ntg OR kjc -> kwq
|
||||
psh XOR fgs -> tgd
|
||||
qhw XOR tgd -> z09
|
||||
pbm OR djm -> kpj
|
||||
x03 XOR y03 -> ffh
|
||||
x00 XOR y04 -> ntg
|
||||
bfw OR bqk -> z06
|
||||
nrd XOR fgs -> wpb
|
||||
frj XOR qhw -> z04
|
||||
bqk OR frj -> z07
|
||||
y03 OR x01 -> nrd
|
||||
hwm AND bqk -> z03
|
||||
tgd XOR rvg -> z12
|
||||
tnw OR pbm -> gnj
|
87
2024/24-Crossed_Wires/first.hs
Normal file
87
2024/24-Crossed_Wires/first.hs
Normal file
|
@ -0,0 +1,87 @@
|
|||
-- requires cabal install --lib megaparsec parser-combinators heap vector
|
||||
module Main (main) where
|
||||
|
||||
import Control.Monad (void, when)
|
||||
import Data.Functor
|
||||
import qualified Data.List as L
|
||||
import qualified Data.Map as M
|
||||
import Data.Maybe
|
||||
import Data.Ord (comparing)
|
||||
import Data.Void (Void)
|
||||
import Text.Megaparsec
|
||||
import Text.Megaparsec.Char
|
||||
|
||||
import Debug.Trace
|
||||
|
||||
exampleExpectedOutput = 4
|
||||
example2ExpectedOutput = 2024
|
||||
|
||||
type In = (String, Bool)
|
||||
data Op = And | Or | Xor deriving (Show, Eq)
|
||||
type Gate = (String, Op, String, String)
|
||||
data Input = Input [In] [Gate] deriving Show
|
||||
|
||||
type Parser = Parsec Void String
|
||||
|
||||
parseIn :: Parser In
|
||||
parseIn = (,) <$> some alphaNumChar <* string ": "
|
||||
<*> (char '1' $> True <|> char '0' $> False)
|
||||
|
||||
parseOp :: Parser Op
|
||||
parseOp = string "AND" $> And
|
||||
<|> string "OR" $> Or
|
||||
<|> string "XOR" $> Xor
|
||||
|
||||
parseGate :: Parser Gate
|
||||
parseGate = (,,,) <$> some alphaNumChar <* space
|
||||
<*> parseOp <* space
|
||||
<*> some alphaNumChar <* string " -> "
|
||||
<*> some alphaNumChar
|
||||
|
||||
parseInput' :: Parser Input
|
||||
parseInput' = Input <$> some (parseIn <* eol) <* eol
|
||||
<*> some (parseGate <* eol) <* eof
|
||||
|
||||
parseInput :: String -> IO Input
|
||||
parseInput filename = do
|
||||
input <- readFile filename
|
||||
case runParser parseInput' filename input of
|
||||
Left bundle -> error $ errorBundlePretty bundle
|
||||
Right input' -> return input'
|
||||
|
||||
exec And = ( && )
|
||||
exec Or = ( || )
|
||||
exec Xor = ( /= )
|
||||
|
||||
type Gates = M.Map String Bool
|
||||
|
||||
compute :: Input -> Int
|
||||
compute (Input ins gates) = sum [if b then 2^i else 0 | (b, i) <- zip outs [0..]]
|
||||
where
|
||||
outs = map (fullMap M.!) $ M.keys $ M.filterWithKey (\(z:_) _ -> z == 'z') gatesMap
|
||||
startMap = M.fromList ins
|
||||
gatesMap = M.fromList $ map (\(a, b, c, d) -> (d, (a, b, c))) gates
|
||||
fullMap = M.foldlWithKey compute' startMap $ gatesMap
|
||||
compute' :: Gates -> String -> (String, Op, String) -> Gates
|
||||
compute' gates c (a, op, b) = case M.lookup c gates of
|
||||
Just _ -> gates
|
||||
Nothing -> let (va, gates') = case M.lookup a gates of
|
||||
Just g -> (g, gates)
|
||||
Nothing -> let gates' = compute' gates a $ gatesMap M.! a
|
||||
in (gates' M.! a, gates')
|
||||
(vb, gates'') = case M.lookup b gates' of
|
||||
Just g -> (g, gates')
|
||||
Nothing -> let gates'' = compute' gates b $ gatesMap M.! b
|
||||
in (gates'' M.! b, gates'')
|
||||
in M.insert c (exec op va vb) gates''
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
example <- parseInput "example"
|
||||
let exampleOutput = compute example
|
||||
when (exampleOutput /= exampleExpectedOutput) (error $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput)
|
||||
example2 <- parseInput "example2"
|
||||
let example2Output = compute example2
|
||||
when (example2Output /= example2ExpectedOutput) (error $ "example2 failed: got " ++ show example2Output ++ " instead of " ++ show example2ExpectedOutput)
|
||||
input <- parseInput "input"
|
||||
print $ compute input
|
313
2024/24-Crossed_Wires/input
Normal file
313
2024/24-Crossed_Wires/input
Normal file
|
@ -0,0 +1,313 @@
|
|||
x00: 1
|
||||
x01: 1
|
||||
x02: 0
|
||||
x03: 0
|
||||
x04: 0
|
||||
x05: 1
|
||||
x06: 0
|
||||
x07: 1
|
||||
x08: 1
|
||||
x09: 0
|
||||
x10: 1
|
||||
x11: 0
|
||||
x12: 0
|
||||
x13: 1
|
||||
x14: 0
|
||||
x15: 1
|
||||
x16: 0
|
||||
x17: 1
|
||||
x18: 0
|
||||
x19: 1
|
||||
x20: 0
|
||||
x21: 1
|
||||
x22: 0
|
||||
x23: 1
|
||||
x24: 0
|
||||
x25: 0
|
||||
x26: 1
|
||||
x27: 0
|
||||
x28: 1
|
||||
x29: 0
|
||||
x30: 1
|
||||
x31: 1
|
||||
x32: 0
|
||||
x33: 0
|
||||
x34: 1
|
||||
x35: 0
|
||||
x36: 1
|
||||
x37: 0
|
||||
x38: 1
|
||||
x39: 0
|
||||
x40: 0
|
||||
x41: 0
|
||||
x42: 0
|
||||
x43: 0
|
||||
x44: 1
|
||||
y00: 1
|
||||
y01: 0
|
||||
y02: 1
|
||||
y03: 1
|
||||
y04: 0
|
||||
y05: 0
|
||||
y06: 1
|
||||
y07: 1
|
||||
y08: 0
|
||||
y09: 1
|
||||
y10: 1
|
||||
y11: 1
|
||||
y12: 1
|
||||
y13: 1
|
||||
y14: 0
|
||||
y15: 1
|
||||
y16: 1
|
||||
y17: 0
|
||||
y18: 0
|
||||
y19: 0
|
||||
y20: 0
|
||||
y21: 0
|
||||
y22: 0
|
||||
y23: 0
|
||||
y24: 0
|
||||
y25: 1
|
||||
y26: 0
|
||||
y27: 0
|
||||
y28: 1
|
||||
y29: 1
|
||||
y30: 1
|
||||
y31: 0
|
||||
y32: 1
|
||||
y33: 0
|
||||
y34: 0
|
||||
y35: 0
|
||||
y36: 1
|
||||
y37: 0
|
||||
y38: 1
|
||||
y39: 0
|
||||
y40: 0
|
||||
y41: 0
|
||||
y42: 0
|
||||
y43: 0
|
||||
y44: 1
|
||||
|
||||
y33 AND x33 -> bfn
|
||||
y32 XOR x32 -> rck
|
||||
x30 AND y30 -> gns
|
||||
y36 XOR x36 -> hbh
|
||||
cng XOR mwt -> z42
|
||||
bsw OR bfp -> pwp
|
||||
x00 XOR y00 -> z00
|
||||
y26 XOR x26 -> wkb
|
||||
x31 AND y31 -> hjq
|
||||
jhg AND gfd -> bbr
|
||||
y43 XOR x43 -> fhk
|
||||
mrg OR hjq -> ftq
|
||||
jks OR cwn -> qvq
|
||||
wrc XOR hbw -> z17
|
||||
skh XOR rkt -> z15
|
||||
x27 AND y27 -> kbf
|
||||
jgg OR cmm -> qpm
|
||||
y17 XOR x17 -> hbw
|
||||
khf AND djt -> khs
|
||||
qqw XOR gkc -> wpd
|
||||
rms XOR sgf -> z31
|
||||
gww XOR jmf -> z24
|
||||
x01 XOR y01 -> kjs
|
||||
pwp AND nnn -> dwg
|
||||
tjq OR hhj -> cmb
|
||||
x05 XOR y05 -> fds
|
||||
x07 AND y07 -> jbw
|
||||
y32 AND x32 -> wnt
|
||||
x14 XOR y14 -> cgg
|
||||
rhf AND cgg -> smd
|
||||
djt XOR khf -> z35
|
||||
tcq OR rjb -> pfc
|
||||
qtv OR khs -> rfq
|
||||
y41 XOR x41 -> jhg
|
||||
jbw OR trv -> tmg
|
||||
y21 XOR x21 -> csw
|
||||
jkm XOR dmp -> z13
|
||||
rkh OR cqg -> jkr
|
||||
y20 XOR x20 -> bvw
|
||||
pwb OR jdc -> smt
|
||||
x13 AND y13 -> rbg
|
||||
wvt XOR sbt -> z03
|
||||
jhg XOR gfd -> z41
|
||||
x01 AND y01 -> fqg
|
||||
wfc XOR cmp -> mdd
|
||||
cgg XOR rhf -> z14
|
||||
wkb XOR jkr -> z26
|
||||
y36 AND x36 -> jdc
|
||||
x08 AND y08 -> gdd
|
||||
fds AND whf -> vvs
|
||||
y19 AND x19 -> z19
|
||||
x31 XOR y31 -> rms
|
||||
nss AND jmv -> vtd
|
||||
pwp XOR nnn -> z30
|
||||
x23 XOR y23 -> mcp
|
||||
jvf XOR jth -> z04
|
||||
y38 AND x38 -> jhv
|
||||
kjs AND hjp -> wkq
|
||||
sqj AND wts -> qdn
|
||||
y16 XOR x16 -> rvn
|
||||
kbf OR mqr -> msf
|
||||
y25 XOR x25 -> prp
|
||||
y26 AND x26 -> tjq
|
||||
cgv OR gmf -> mkf
|
||||
y12 XOR x12 -> htn
|
||||
kdd AND msf -> dpr
|
||||
vtd OR bnw -> khf
|
||||
smd OR ttv -> rkt
|
||||
fnc OR mmk -> jmf
|
||||
ppk OR hwb -> jbd
|
||||
jbd AND nns -> nnq
|
||||
mcp XOR mkf -> z23
|
||||
kbb AND wpb -> jmp
|
||||
pbb OR mdd -> hvn
|
||||
dts XOR wmq -> z33
|
||||
x42 AND y42 -> hnh
|
||||
rck AND ftq -> hfc
|
||||
rfq XOR hbh -> z36
|
||||
y05 AND x05 -> hpn
|
||||
nns XOR jbd -> z40
|
||||
x14 AND y14 -> ttv
|
||||
jmv XOR nss -> z34
|
||||
vth OR gdd -> wpb
|
||||
y08 XOR x08 -> rjs
|
||||
y42 XOR x42 -> cng
|
||||
x35 AND y35 -> qtv
|
||||
y02 XOR x02 -> rvm
|
||||
mcp AND mkf -> mmk
|
||||
y28 AND x28 -> rsv
|
||||
wfm OR mts -> wfc
|
||||
wnt OR hfc -> dts
|
||||
sgf AND rms -> mrg
|
||||
bbr OR ncf -> mwt
|
||||
wpb XOR kbb -> z09
|
||||
x06 XOR y06 -> jtg
|
||||
sbw OR bfn -> jmv
|
||||
kmr XOR rmb -> z10
|
||||
rvn XOR kbq -> z16
|
||||
y09 XOR x09 -> kbb
|
||||
gsk XOR fhk -> z43
|
||||
y23 AND x23 -> fnc
|
||||
y29 XOR x29 -> hvc
|
||||
wwp AND bvr -> cgv
|
||||
tnc OR dbj -> hks
|
||||
tvf XOR cmb -> z27
|
||||
bvw XOR hvn -> z20
|
||||
x44 XOR y44 -> jsg
|
||||
rsv OR dpr -> tsk
|
||||
sqj XOR wts -> z38
|
||||
x40 AND y40 -> bdn
|
||||
qpc AND qmb -> trv
|
||||
qvq XOR hns -> z18
|
||||
x41 AND y41 -> ncf
|
||||
qdn OR jhv -> fkq
|
||||
y27 XOR x27 -> tvf
|
||||
rvm XOR vdq -> z02
|
||||
whf XOR fds -> z05
|
||||
tmg AND rjs -> vth
|
||||
y34 AND x34 -> bnw
|
||||
y21 AND x21 -> nrg
|
||||
gsk AND fhk -> tnc
|
||||
x38 XOR y38 -> sqj
|
||||
y18 AND x18 -> wfm
|
||||
hvc AND tsk -> bfp
|
||||
jqf OR kjk -> kbq
|
||||
dmp AND jkm -> qpw
|
||||
x19 XOR y19 -> cmp
|
||||
y24 XOR x24 -> gww
|
||||
prp AND pfc -> rkh
|
||||
rmb AND kmr -> fws
|
||||
nnq OR bdn -> gfd
|
||||
y39 XOR x39 -> vqf
|
||||
qpm XOR csw -> z21
|
||||
smt XOR wpp -> wts
|
||||
x12 AND y12 -> bnn
|
||||
x10 XOR y10 -> rmb
|
||||
y33 XOR x33 -> wmq
|
||||
x18 XOR y18 -> hns
|
||||
vvs OR hpn -> cfn
|
||||
jmf AND gww -> rjb
|
||||
nrg OR mvs -> bvr
|
||||
cmp AND wfc -> pbb
|
||||
kbq AND rvn -> vtm
|
||||
gfk OR dpv -> jth
|
||||
y25 AND x25 -> cqg
|
||||
wvt AND sbt -> dpv
|
||||
cmb AND tvf -> mqr
|
||||
hjp XOR kjs -> z01
|
||||
y00 AND x00 -> hjp
|
||||
x35 XOR y35 -> djt
|
||||
mwt AND cng -> hbm
|
||||
y24 AND x24 -> tcq
|
||||
tsk XOR hvc -> z29
|
||||
rkt AND skh -> kjk
|
||||
jth AND jvf -> whn
|
||||
x02 AND y02 -> nhp
|
||||
hns AND qvq -> mts
|
||||
y04 XOR x04 -> jvf
|
||||
pfc XOR prp -> z25
|
||||
y03 XOR x03 -> sbt
|
||||
csw AND qpm -> mvs
|
||||
y29 AND x29 -> bsw
|
||||
wkb AND jkr -> hhj
|
||||
x03 AND y03 -> gfk
|
||||
vqf XOR fkq -> z39
|
||||
x15 XOR y15 -> jqf
|
||||
wpd OR dpf -> dtq
|
||||
nrv OR jsp -> z45
|
||||
jtg AND cfn -> qhk
|
||||
rhd OR vtm -> wrc
|
||||
y30 XOR x30 -> nnn
|
||||
htn AND dtq -> gvh
|
||||
y43 AND x43 -> dbj
|
||||
x17 AND y17 -> cwn
|
||||
htn XOR dtq -> z12
|
||||
y20 AND x20 -> jgg
|
||||
vdq AND rvm -> hmk
|
||||
jgw OR rhh -> z37
|
||||
jsg XOR hks -> z44
|
||||
gns OR dwg -> sgf
|
||||
fqg OR wkq -> vdq
|
||||
vqf AND fkq -> hwb
|
||||
x04 AND y04 -> gwv
|
||||
msf XOR kdd -> z28
|
||||
rjs XOR tmg -> z08
|
||||
x16 AND y16 -> rhd
|
||||
x06 AND y06 -> hhw
|
||||
gkc AND qqw -> z11
|
||||
x28 XOR y28 -> kdd
|
||||
fws OR gvj -> qqw
|
||||
y39 AND x39 -> ppk
|
||||
rfq AND hbh -> pwb
|
||||
y11 AND x11 -> dpf
|
||||
x40 XOR y40 -> nns
|
||||
hbm OR hnh -> gsk
|
||||
y09 AND x09 -> csb
|
||||
y37 XOR x37 -> wpp
|
||||
hmk OR nhp -> wvt
|
||||
x34 XOR y34 -> nss
|
||||
rck XOR ftq -> z32
|
||||
jsg AND hks -> nrv
|
||||
y37 AND x37 -> rhh
|
||||
wpp AND smt -> jgw
|
||||
y11 XOR x11 -> gkc
|
||||
x07 XOR y07 -> qpc
|
||||
qpw OR rbg -> rhf
|
||||
x15 AND y15 -> skh
|
||||
y22 XOR x22 -> wwp
|
||||
hhw OR qhk -> qmb
|
||||
jmp OR csb -> kmr
|
||||
hbw AND wrc -> jks
|
||||
x13 XOR y13 -> dmp
|
||||
gwv OR whn -> whf
|
||||
dts AND wmq -> sbw
|
||||
bnn OR gvh -> jkm
|
||||
qmb XOR qpc -> z07
|
||||
bvw AND hvn -> cmm
|
||||
y10 AND x10 -> gvj
|
||||
x44 AND y44 -> jsp
|
||||
jtg XOR cfn -> z06
|
||||
wwp XOR bvr -> z22
|
||||
y22 AND x22 -> gmf
|
Loading…
Add table
Add a link
Reference in a new issue