summaryrefslogtreecommitdiff
path: root/day24
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-12-24 23:57:15 +0100
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-12-24 23:57:15 +0100
commit46859764ad4073da2c910ebd321320e1edb9b8c6 (patch)
treeb0b4cccb96547eb25a2953ff62572f2c61e3de83 /day24
parentc6ca510a5ccf232cbf0677a77453addb8d5d70be (diff)
Fucking day 24
Diffstat (limited to 'day24')
-rw-r--r--day24/data-2.txt313
-rw-r--r--day24/data.txt313
-rw-r--r--day24/example.txt47
-rw-r--r--day24/example_simple.txt10
-rw-r--r--day24/go.mod3
-rw-r--r--day24/main.go256
6 files changed, 942 insertions, 0 deletions
diff --git a/day24/data-2.txt b/day24/data-2.txt
new file mode 100644
index 0000000..3a863fb
--- /dev/null
+++ b/day24/data-2.txt
@@ -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: 0
+x14: 1
+x15: 1
+x16: 1
+x17: 0
+x18: 1
+x19: 1
+x20: 0
+x21: 0
+x22: 0
+x23: 0
+x24: 1
+x25: 1
+x26: 0
+x27: 0
+x28: 1
+x29: 1
+x30: 0
+x31: 1
+x32: 0
+x33: 0
+x34: 1
+x35: 1
+x36: 0
+x37: 0
+x38: 0
+x39: 0
+x40: 0
+x41: 0
+x42: 0
+x43: 1
+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: 0
+y14: 1
+y15: 0
+y16: 0
+y17: 1
+y18: 1
+y19: 0
+y20: 1
+y21: 1
+y22: 1
+y23: 1
+y24: 0
+y25: 0
+y26: 0
+y27: 0
+y28: 1
+y29: 1
+y30: 0
+y31: 1
+y32: 1
+y33: 0
+y34: 0
+y35: 1
+y36: 0
+y37: 0
+y38: 0
+y39: 1
+y40: 0
+y41: 0
+y42: 1
+y43: 0
+y44: 1
+
+fjm XOR gqp -> z14
+x18 XOR y18 -> hdn
+wbb AND vnp -> shd
+srq OR mpk -> cqw
+y30 AND x30 -> tjw
+x26 AND y26 -> qhf
+y10 XOR x10 -> nbd
+y43 XOR x43 -> swn
+sfj OR jks -> rkg
+y01 XOR x01 -> tct
+nsv XOR pjt -> z04
+dcq AND knt -> hfc
+hfh AND cjm -> jks
+hwv OR cpr -> ngm
+fsm AND btg -> nhn
+y16 AND x16 -> tqh
+qtf XOR nsp -> z06
+vjv AND vvn -> pbj
+y23 XOR x23 -> bpn
+tsm OR dnc -> tqq
+knt XOR dcq -> z19
+ktj AND cmb -> qqf
+ckh OR rrp -> cmb
+x43 AND y43 -> hrf
+mwc OR qjs -> pfv
+qpj XOR vmh -> z05
+y16 XOR x16 -> dgs
+x29 XOR y29 -> kcf
+qqf OR jjp -> jmf
+rnp XOR mbj -> z03
+x12 AND y12 -> cpr
+x06 AND y06 -> ksv
+swn XOR rkg -> z43
+x38 XOR y38 -> fkg
+x04 XOR y04 -> nsv
+x07 XOR y07 -> dhf
+bhp OR shd -> hfh
+pwm XOR jgj -> z33
+ddd AND hdn -> cfb
+qhf OR kqk -> bdh
+tcg AND rtn -> ckh
+mjj OR dcw -> wps
+pjk AND jsv -> sbj
+gfr OR ckc -> vts
+bnp AND mtq -> tsm
+y31 XOR x31 -> gtq
+vjv XOR vvn -> z44
+tnc XOR gbw -> z09
+pjt AND nsv -> tdr
+x09 AND y09 -> gcp
+x19 XOR y19 -> knt
+mkh OR pbj -> z45
+bnr AND jhf -> bwd
+x22 AND y22 -> kkt
+x41 AND y41 -> bhp
+x10 AND y10 -> kbs
+qnn AND gsw -> mjj
+tjw OR rds -> pns
+y35 XOR x35 -> srg
+pnj XOR srn -> z26
+rqp OR qbc -> wrd
+gtq XOR pns -> z31
+y40 AND x40 -> vpj
+y03 AND x03 -> bcm
+dgs AND wps -> ckr
+jwh OR gcp -> dnn
+sqd OR pvg -> qtf
+cmb XOR ktj -> z37
+vnp XOR wbb -> z41
+bpn AND pjm -> hvk
+cmj AND hpp -> ckb
+bnp XOR mtq -> z20
+hds AND cpw -> tmk
+jvr OR kbs -> jsv
+pcs OR kqm -> pnj
+y33 AND x33 -> jbr
+jww XOR mrf -> z30
+dnn XOR nbd -> z10
+x05 XOR y05 -> vmh
+x25 AND y25 -> pcs
+qbk XOR bpp -> z12
+y25 XOR x25 -> rpf
+x39 XOR y39 -> cmj
+vpj OR nhn -> wbb
+y18 AND x18 -> djn
+ctm XOR ngm -> z13
+pjb AND qtk -> ckc
+y15 XOR x15 -> qnn
+y31 AND x31 -> nqk
+x02 XOR y02 -> ndk
+jdv XOR rkk -> z22
+x19 AND y19 -> skb
+wrd AND nnd -> tjd
+y07 AND x07 -> rqp
+x01 AND y01 -> mwc
+y03 XOR x03 -> mbj
+pns AND gtq -> sfd
+bwd OR bwm -> jgj
+hrf OR grs -> vvn
+y17 AND x17 -> dmf
+ckr OR tqh -> nbt
+x00 AND y00 -> pgc
+tqq AND gmm -> ffk
+x39 AND y39 -> kqt
+pjm XOR bpn -> z23
+qrm OR ksv -> rrw
+x11 AND y11 -> krf
+nbd AND dnn -> jvr
+y30 XOR x30 -> mrf
+tdr OR psq -> qpj
+qnn XOR gsw -> z15
+x32 XOR y32 -> jhf
+wrd XOR nnd -> z08
+x44 AND y44 -> mkh
+jhf XOR bnr -> z32
+fjm AND gqp -> nbw
+jsv XOR pjk -> z11
+y21 AND x21 -> stc
+hwc OR mvv -> rnp
+y13 AND x13 -> rmd
+x42 AND y42 -> sfj
+y15 AND x15 -> dcw
+x28 XOR y28 -> tjn
+x38 AND y38 -> mrc
+jgj AND pwm -> hqs
+srn AND pnj -> kqk
+x33 XOR y33 -> pwm
+tmk OR fmr -> crw
+dhf XOR rrw -> z07
+y28 AND x28 -> nbj
+y36 AND x36 -> rrp
+rkg AND swn -> grs
+y17 XOR x17 -> chp
+hfh XOR cjm -> z42
+tnc AND gbw -> jwh
+x37 XOR y37 -> ktj
+y21 XOR x21 -> gmm
+pjb XOR qtk -> z34
+kjb OR nbj -> bvh
+nbt XOR chp -> z17
+rrw AND dhf -> qbc
+pfv XOR ndk -> z02
+y27 XOR x27 -> bkd
+qpj AND vmh -> sqd
+mrc OR ftb -> hpp
+hvk OR gpq -> cpw
+vts XOR srg -> z35
+vfr OR kkt -> pjm
+hpp XOR cmj -> z39
+y34 AND x34 -> gfr
+skb OR hfc -> bnp
+rkk AND jdv -> vfr
+kcf AND bvh -> crj
+ppq OR crj -> jww
+btg XOR fsm -> z40
+jmf XOR fkg -> z38
+y02 AND x02 -> mvv
+hdn XOR ddd -> z18
+ffk OR stc -> rkk
+x44 XOR y44 -> vjv
+y08 AND x08 -> vsw
+tjd OR vsw -> tnc
+pvc OR nbw -> gsw
+y42 XOR x42 -> cjm
+x06 XOR y06 -> nsp
+kcf XOR bvh -> z29
+y05 AND x05 -> pvg
+x36 XOR y36 -> rtn
+y24 AND x24 -> fmr
+mbj AND rnp -> ppp
+crw AND rpf -> kqm
+cpw XOR hds -> z24
+pgc XOR tct -> z01
+ndk AND pfv -> hwc
+x14 XOR y14 -> gqp
+qtf AND nsp -> qrm
+tct AND pgc -> qjs
+rmd OR wdq -> fjm
+x20 AND y20 -> dnc
+y13 XOR x13 -> ctm
+nbt AND chp -> cbf
+x40 XOR y40 -> fsm
+x32 AND y32 -> bwm
+jww AND mrf -> rds
+x00 XOR y00 -> z00
+dmf OR cbf -> ddd
+x29 AND y29 -> ppq
+crw XOR rpf -> z25
+qbk AND bpp -> hwv
+y11 XOR x11 -> pjk
+bdh AND bkd -> mpk
+wps XOR dgs -> z16
+sbj OR krf -> bpp
+kqt OR ckb -> btg
+x12 XOR y12 -> qbk
+y26 XOR x26 -> srn
+y34 XOR x34 -> qtk
+cqw XOR tjn -> z28
+sfd OR nqk -> bnr
+hqs OR jbr -> pjb
+y08 XOR x08 -> nnd
+bdh XOR bkd -> z27
+y37 AND x37 -> jjp
+tcg XOR rtn -> z36
+x04 AND y04 -> psq
+gmm XOR tqq -> z21
+bgp OR ntc -> tcg
+ngm AND ctm -> wdq
+y35 AND x35 -> bgp
+y23 AND x23 -> gpq
+vts AND srg -> ntc
+x09 XOR y09 -> gbw
+y41 XOR x41 -> vnp
+x22 XOR y22 -> jdv
+y20 XOR x20 -> mtq
+x24 XOR y24 -> hds
+cfb OR djn -> dcq
+jmf AND fkg -> ftb
+ppp OR bcm -> pjt
+y27 AND x27 -> srq
+tjn AND cqw -> kjb
+y14 AND x14 -> pvc
diff --git a/day24/data.txt b/day24/data.txt
new file mode 100644
index 0000000..0022370
--- /dev/null
+++ b/day24/data.txt
@@ -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: 0
+x14: 1
+x15: 1
+x16: 1
+x17: 0
+x18: 1
+x19: 1
+x20: 0
+x21: 0
+x22: 0
+x23: 0
+x24: 1
+x25: 1
+x26: 0
+x27: 0
+x28: 1
+x29: 1
+x30: 0
+x31: 1
+x32: 0
+x33: 0
+x34: 1
+x35: 1
+x36: 0
+x37: 0
+x38: 0
+x39: 0
+x40: 0
+x41: 0
+x42: 0
+x43: 1
+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: 0
+y14: 1
+y15: 0
+y16: 0
+y17: 1
+y18: 1
+y19: 0
+y20: 1
+y21: 1
+y22: 1
+y23: 1
+y24: 0
+y25: 0
+y26: 0
+y27: 0
+y28: 1
+y29: 1
+y30: 0
+y31: 1
+y32: 1
+y33: 0
+y34: 0
+y35: 1
+y36: 0
+y37: 0
+y38: 0
+y39: 1
+y40: 0
+y41: 0
+y42: 1
+y43: 0
+y44: 1
+
+fjm XOR gqp -> z14
+x18 XOR y18 -> hdn
+wbb AND vnp -> shd
+srq OR mpk -> cqw
+y30 AND x30 -> tjw
+x26 AND y26 -> qhf
+y10 XOR x10 -> kbs
+y43 XOR x43 -> swn
+sfj OR jks -> rkg
+y01 XOR x01 -> tct
+nsv XOR pjt -> z04
+dcq AND knt -> hfc
+hfh AND cjm -> jks
+hwv OR cpr -> ngm
+fsm AND btg -> nhn
+y16 AND x16 -> tqh
+qtf XOR nsp -> ksv
+vjv AND vvn -> pbj
+y23 XOR x23 -> bpn
+tsm OR dnc -> z20
+knt XOR dcq -> z19
+ktj AND cmb -> qqf
+ckh OR rrp -> cmb
+x43 AND y43 -> hrf
+mwc OR qjs -> pfv
+qpj XOR vmh -> z05
+y16 XOR x16 -> dgs
+x29 XOR y29 -> kcf
+qqf OR jjp -> jmf
+rnp XOR mbj -> z03
+x12 AND y12 -> cpr
+x06 AND y06 -> z06
+swn XOR rkg -> z43
+x38 XOR y38 -> fkg
+x04 XOR y04 -> nsv
+x07 XOR y07 -> dhf
+bhp OR shd -> hfh
+pwm XOR jgj -> z33
+ddd AND hdn -> cfb
+qhf OR kqk -> bdh
+tcg AND rtn -> ckh
+mjj OR dcw -> wps
+pjk AND jsv -> sbj
+gfr OR ckc -> vts
+bnp AND mtq -> tsm
+y31 XOR x31 -> gtq
+vjv XOR vvn -> z44
+tnc XOR gbw -> z09
+pjt AND nsv -> tdr
+x09 AND y09 -> gcp
+x19 XOR y19 -> knt
+mkh OR pbj -> z45
+bnr AND jhf -> bwd
+x22 AND y22 -> kkt
+x41 AND y41 -> bhp
+x10 AND y10 -> nbd
+qnn AND gsw -> mjj
+tjw OR rds -> pns
+y35 XOR x35 -> srg
+pnj XOR srn -> z26
+rqp OR qbc -> wrd
+gtq XOR pns -> z31
+y40 AND x40 -> vpj
+y03 AND x03 -> bcm
+dgs AND wps -> ckr
+jwh OR gcp -> dnn
+sqd OR pvg -> qtf
+cmb XOR ktj -> z37
+vnp XOR wbb -> z41
+bpn AND pjm -> hvk
+cmj AND hpp -> z39
+bnp XOR mtq -> tqq
+hds AND cpw -> tmk
+jvr OR kbs -> jsv
+pcs OR kqm -> pnj
+y33 AND x33 -> jbr
+jww XOR mrf -> z30
+dnn XOR nbd -> z10
+x05 XOR y05 -> vmh
+x25 AND y25 -> pcs
+qbk XOR bpp -> z12
+y25 XOR x25 -> rpf
+x39 XOR y39 -> cmj
+vpj OR nhn -> wbb
+y18 AND x18 -> djn
+ctm XOR ngm -> z13
+pjb AND qtk -> ckc
+y15 XOR x15 -> qnn
+y31 AND x31 -> nqk
+x02 XOR y02 -> ndk
+jdv XOR rkk -> z22
+x19 AND y19 -> skb
+wrd AND nnd -> tjd
+y07 AND x07 -> rqp
+x01 AND y01 -> mwc
+y03 XOR x03 -> mbj
+pns AND gtq -> sfd
+bwd OR bwm -> jgj
+hrf OR grs -> vvn
+y17 AND x17 -> dmf
+ckr OR tqh -> nbt
+x00 AND y00 -> pgc
+tqq AND gmm -> ffk
+x39 AND y39 -> kqt
+pjm XOR bpn -> z23
+qrm OR ksv -> rrw
+x11 AND y11 -> krf
+nbd AND dnn -> jvr
+y30 XOR x30 -> mrf
+tdr OR psq -> qpj
+qnn XOR gsw -> z15
+x32 XOR y32 -> jhf
+wrd XOR nnd -> z08
+x44 AND y44 -> mkh
+jhf XOR bnr -> z32
+fjm AND gqp -> nbw
+jsv XOR pjk -> z11
+y21 AND x21 -> stc
+hwc OR mvv -> rnp
+y13 AND x13 -> rmd
+x42 AND y42 -> sfj
+y15 AND x15 -> dcw
+x28 XOR y28 -> tjn
+x38 AND y38 -> mrc
+jgj AND pwm -> hqs
+srn AND pnj -> kqk
+x33 XOR y33 -> pwm
+tmk OR fmr -> crw
+dhf XOR rrw -> z07
+y28 AND x28 -> nbj
+y36 AND x36 -> rrp
+rkg AND swn -> grs
+y17 XOR x17 -> chp
+hfh XOR cjm -> z42
+tnc AND gbw -> jwh
+x37 XOR y37 -> ktj
+y21 XOR x21 -> gmm
+pjb XOR qtk -> z34
+kjb OR nbj -> bvh
+nbt XOR chp -> z17
+rrw AND dhf -> qbc
+pfv XOR ndk -> z02
+y27 XOR x27 -> bkd
+qpj AND vmh -> sqd
+mrc OR ftb -> hpp
+hvk OR gpq -> cpw
+vts XOR srg -> z35
+vfr OR kkt -> pjm
+hpp XOR cmj -> ckb
+y34 AND x34 -> gfr
+skb OR hfc -> bnp
+rkk AND jdv -> vfr
+kcf AND bvh -> crj
+ppq OR crj -> jww
+btg XOR fsm -> z40
+jmf XOR fkg -> z38
+y02 AND x02 -> mvv
+hdn XOR ddd -> z18
+ffk OR stc -> rkk
+x44 XOR y44 -> vjv
+y08 AND x08 -> vsw
+tjd OR vsw -> tnc
+pvc OR nbw -> gsw
+y42 XOR x42 -> cjm
+x06 XOR y06 -> nsp
+kcf XOR bvh -> z29
+y05 AND x05 -> pvg
+x36 XOR y36 -> rtn
+y24 AND x24 -> fmr
+mbj AND rnp -> ppp
+crw AND rpf -> kqm
+cpw XOR hds -> z24
+pgc XOR tct -> z01
+ndk AND pfv -> hwc
+x14 XOR y14 -> gqp
+qtf AND nsp -> qrm
+tct AND pgc -> qjs
+rmd OR wdq -> fjm
+x20 AND y20 -> dnc
+y13 XOR x13 -> ctm
+nbt AND chp -> cbf
+x40 XOR y40 -> fsm
+x32 AND y32 -> bwm
+jww AND mrf -> rds
+x00 XOR y00 -> z00
+dmf OR cbf -> ddd
+x29 AND y29 -> ppq
+crw XOR rpf -> z25
+qbk AND bpp -> hwv
+y11 XOR x11 -> pjk
+bdh AND bkd -> mpk
+wps XOR dgs -> z16
+sbj OR krf -> bpp
+kqt OR ckb -> btg
+x12 XOR y12 -> qbk
+y26 XOR x26 -> srn
+y34 XOR x34 -> qtk
+cqw XOR tjn -> z28
+sfd OR nqk -> bnr
+hqs OR jbr -> pjb
+y08 XOR x08 -> nnd
+bdh XOR bkd -> z27
+y37 AND x37 -> jjp
+tcg XOR rtn -> z36
+x04 AND y04 -> psq
+gmm XOR tqq -> z21
+bgp OR ntc -> tcg
+ngm AND ctm -> wdq
+y35 AND x35 -> bgp
+y23 AND x23 -> gpq
+vts AND srg -> ntc
+x09 XOR y09 -> gbw
+y41 XOR x41 -> vnp
+x22 XOR y22 -> jdv
+y20 XOR x20 -> mtq
+x24 XOR y24 -> hds
+cfb OR djn -> dcq
+jmf AND fkg -> ftb
+ppp OR bcm -> pjt
+y27 AND x27 -> srq
+tjn AND cqw -> kjb
+y14 AND x14 -> pvc
diff --git a/day24/example.txt b/day24/example.txt
new file mode 100644
index 0000000..94b6eed
--- /dev/null
+++ b/day24/example.txt
@@ -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
diff --git a/day24/example_simple.txt b/day24/example_simple.txt
new file mode 100644
index 0000000..8e277c1
--- /dev/null
+++ b/day24/example_simple.txt
@@ -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
diff --git a/day24/go.mod b/day24/go.mod
new file mode 100644
index 0000000..cab4acc
--- /dev/null
+++ b/day24/go.mod
@@ -0,0 +1,3 @@
+module stevenlr.com/aoc2024/day24
+
+go 1.23.3
diff --git a/day24/main.go b/day24/main.go
new file mode 100644
index 0000000..3d5e89a
--- /dev/null
+++ b/day24/main.go
@@ -0,0 +1,256 @@
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "sort"
+ "strings"
+)
+
+func main() {
+ fmt.Println(part1(readData("example_simple.txt")), 4)
+ fmt.Println(part1(readData("example.txt")), 2024)
+ fmt.Println(part1(readData("data.txt")), 49574189473968)
+ // fmt.Println(part2(readData("data.txt").gates))
+ fmt.Println(part2(readData("data-2.txt").gates))
+
+}
+
+const (
+ AND = "AND"
+ OR = "OR"
+ XOR = "XOR"
+)
+
+type Gate struct {
+ op string
+ a, b string
+}
+
+type Circuit struct {
+ values map[string]bool
+ gates map[string]Gate
+}
+
+func part1(input Circuit) (result uint64) {
+ queue := []string{}
+ for output := range input.gates {
+ queue = append(queue, output)
+ }
+
+ for len(queue) > 0 {
+ output := queue[len(queue)-1]
+ if _, alreadyComputed := input.values[output]; alreadyComputed {
+ queue = queue[:len(queue)-1]
+ continue
+ }
+
+ gate := input.gates[output]
+ valueA, okA := input.values[gate.a]
+ valueB, okB := input.values[gate.b]
+
+ if !okA || !okB {
+ if !okA {
+ queue = append(queue, gate.a)
+ }
+ if !okB {
+ queue = append(queue, gate.b)
+ }
+ } else {
+ input.values[output] = evaluate(gate.op, valueA, valueB)
+ queue = queue[:len(queue)-1]
+ }
+ }
+
+ zWires := []string{}
+ for wire := range input.values {
+ if wire[0] == 'z' {
+ zWires = append(zWires, wire)
+ }
+ }
+
+ sort.Sort(sort.Reverse(sort.StringSlice(zWires)))
+
+ for _, w := range zWires {
+ if input.values[w] {
+ result = result<<1 | 1
+ } else {
+ result = result << 1
+ }
+ }
+
+ return
+}
+
+func evaluate(op string, a, b bool) bool {
+ switch op {
+ case AND:
+ return a && b
+ case OR:
+ return a || b
+ case XOR:
+ return a != b
+ default:
+ panic("unknown operator")
+ }
+}
+
+func name(prefix byte, num int) string {
+ a := byte(num%10 + '0')
+ b := byte(num/10 + '0')
+ return string([]byte{prefix, b, a})
+}
+
+func evaluateAdder(gates map[string]Gate, a, b uint64) uint64 {
+ circuit := Circuit{gates: gates, values: make(map[string]bool)}
+ for i := range 50 {
+ x := a&(uint64(1)<<i) != 0
+ y := b&(uint64(1)<<i) != 0
+ circuit.values[name('x', i)] = x
+ circuit.values[name('y', i)] = y
+ }
+ return part1(circuit)
+}
+
+func printAround(w string, prefix string, gates map[string]Gate, depth int) {
+ if depth == 0 {
+ return
+ }
+ if g, ok := gates[w]; ok {
+ fmt.Println(prefix, w, g)
+ printAround(g.a, prefix+" ", gates, depth-1)
+ printAround(g.b, prefix+" ", gates, depth-1)
+ }
+}
+
+func part2(gates map[string]Gate) string {
+ // ckb-z39
+ // tqq-z20
+ // ksv-z06
+ // kbs-nbd
+ // ckb,kbs,ksv,nbd,tqq,z06,z20,z39
+
+ // fmt.Println("z without xor")
+ // for out, g := range gates {
+ // if out[0] == 'z' && g.op != XOR && out != "z45" {
+ // fmt.Println(out, g)
+ // }
+ // }
+ // z39 {0 cmj hpp} DONE
+ // z20 {1 tsm dnc} DONE
+
+ // z06 {AND x06 y06} DONE
+ // nsp {XOR x06 y06}
+ // ksv {XOR qtf nsp}
+
+ // printAround("z06", gates, 3)
+ // fmt.Println("")
+ // for out, g := range gates {
+ // if g.a == "nsp" || g.b == "nsp" {
+ // fmt.Println(out, g)
+ // }
+ // }
+ // fmt.Println("xor without x or y")
+ // for out, g := range gates {
+ // if g.op == XOR && (g.a[0] != 'x' && g.a[0] != 'y' && g.b[0] != 'x' && g.b[0] != 'y' && out[0] != 'z') {
+ // fmt.Println(out, g)
+ // }
+ // }
+ // ckb {2 hpp cmj} DONE
+ // tqq {2 bnp mtq} DONE
+ // ksv {2 qtf nsp} DONE
+
+ // for i := range uint64(50) {
+ // x := uint64(1) << i - 1
+ // res1 := evaluateAdder(gates, x, 1)
+ // res2 := x + 1
+ // if res1 != res2 {
+ // fmt.Println(i, res1, res2)
+ // }
+ // }
+ // Issue at 11
+ // printAround("z11", "", gates, 4)
+ // printAround("z10", "", gates, 4)
+ // z11 {XOR jsv pjk}
+ // jsv {OR jvr kbs}
+ // jvr {AND nbd dnn}
+ // nbd {AND x10 y10}
+ // dnn {OR jwh gcp}
+ // kbs {XOR y10 x10}
+ // pjk {XOR y11 x11}
+ //
+ // z10 {XOR dnn nbd}
+ // dnn {OR jwh gcp}
+ // jwh {AND tnc gbw}
+ // tnc {OR tjd vsw}
+ // gbw {XOR x09 y09}
+ // gcp {AND x09 y09}
+ // nbd {AND x10 y10}
+
+ // findGate := func(gate Gate) string {
+ // for output, g := range gates {
+ // if g.op == gate.op && ((g.a == gate.a && g.b == gate.b) || (g.a == gate.b && g.b == gate.a)) {
+ // return output
+ // }
+ // }
+ // return ""
+ // }
+
+ // carry := make([]string, 100)
+ // carry[0] = findGate(Gate{AND, "x00", "y00"})
+ // if carry[0] == "" {
+ // panic("Oh no")
+ // }
+
+ // for i := 1; i < 2; i++ {
+ // if tmpz0 := findGate(Gate{XOR, name('x', i), name('y', i)}); tmpz0 != "" {
+ // fmt.Println("tmpz0", i, name('x', i), name('y', i), "->", tmpz0)
+ // z := findGate(Gate{XOR, tmpz0, carry[i-1]})
+ // if z[0] == 'z' {
+ // fmt.Println("z", i, tmpz0, carry[i-1], "->", z)
+ // } else {
+ // fmt.Println("oh no")
+ // }
+ // } else if tmpz0 := findGate(Gate{XOR, name('x', i), carry[i-1]}); tmpz0 != "" {
+ // fmt.Println("tmpz0", i, name('x', i), carry[i-1], "->", tmpz0)
+ // } else if tmpz0 := findGate(Gate{XOR, name('y', i), carry[i-1]}); tmpz0 != "" {
+ // fmt.Println("tmpz0", i, name('y', i), carry[i-1], "->", tmpz0)
+ // }
+ // }
+
+ // // for output, g := range gates {
+
+ // // }
+
+ return ""
+}
+
+func readData(fileName string) (data Circuit) {
+ data = Circuit{
+ values: make(map[string]bool),
+ gates: make(map[string]Gate),
+ }
+
+ fp, _ := os.Open(fileName)
+ scanner := bufio.NewScanner(fp)
+
+ for scanner.Scan() {
+ line := strings.TrimSpace(scanner.Text())
+ if len(line) == 0 {
+ break
+ }
+
+ wire := line[0:3]
+ value := line[5] == '1'
+
+ data.values[wire] = value
+ }
+
+ for scanner.Scan() {
+ line := strings.Split(strings.TrimSpace(scanner.Text()), " ")
+ data.gates[line[4]] = Gate{line[1], line[0], line[2]}
+ }
+
+ return
+}