diff options
Diffstat (limited to 'day24')
-rw-r--r-- | day24/data-2.txt | 313 | ||||
-rw-r--r-- | day24/data.txt | 313 | ||||
-rw-r--r-- | day24/example.txt | 47 | ||||
-rw-r--r-- | day24/example_simple.txt | 10 | ||||
-rw-r--r-- | day24/go.mod | 3 | ||||
-rw-r--r-- | day24/main.go | 256 |
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 +} |