From 6d0b1ab194ba725c4c841db47e351cc1f9b5b747 Mon Sep 17 00:00:00 2001 From: Dory Date: Tue, 24 Dec 2024 01:17:09 -0800 Subject: [PATCH] d24p2 --- day24/d24p2.swift | 34 ++++++++++++++++++++++------------ day24/input.txt | 16 ++++++++-------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/day24/d24p2.swift b/day24/d24p2.swift index 1aa3b68..74f3169 100644 --- a/day24/d24p2.swift +++ b/day24/d24p2.swift @@ -30,22 +30,15 @@ struct Circuit : CustomStringConvertible { func readInput(_ filePath: String) throws -> Circuit { let content = try String(contentsOfFile: filePath, encoding: .ascii) - let nodeRe = try Regex(#"([a-z0-9]+): (0|1)"#) let gateRe = try Regex(#"([a-z0-9]+) (AND|OR|XOR) ([a-z0-9]+) -> ([a-z0-9]+)"#) let opMap: [String: Op] = [ "AND": { $0 && $1 }, "OR": { $0 || $1 }, "XOR": { $0 != $1 } ] - var nodes: [String: Bool] = [:] var gates: [Gate] = [] var endNodes: Set = [] for line in content.split(separator: "\n") { - if let m = line.wholeMatch(of: nodeRe) { - let node = String(m.output[1].substring!) - let val = m.output[2].substring! == "1" - nodes[node] = val - } if let m = line.wholeMatch(of: gateRe) { let in1 = String(m.output[1].substring!) let op = opMap[String(m.output[2].substring!)]! @@ -57,16 +50,29 @@ func readInput(_ filePath: String) throws -> Circuit { } } } - return Circuit(gates: gates, nodes: nodes, pendingEndNodes: endNodes) + return Circuit(gates: gates, nodes: [:], pendingEndNodes: endNodes) } +extension Int { + func toNodes(_ prefix: String) -> [String: Bool] { + var nodes: [String: Bool] = [:] + for i in (0..<45) { + nodes[prefix + String(format: "%02d", i)] = ((self >> i) & 1) == 1 + } + return nodes + } +} + var circuit = try readInput(CommandLine.arguments[1]) +// generate random x y to try +let x = Int.random(in: 0..<(1<<45)) +let y = Int.random(in: 0..<(1<<45)) +circuit.nodes.merge(x.toNodes("x")) { l, r in l } +circuit.nodes.merge(y.toNodes("y")) { l, r in l } // just print out the wrong bits for manual debugging. See input.dot +// print(circuit) while true { - if let z = circuit.value(of: "z"), - let x = circuit.value(of: "x"), - let y = circuit.value(of: "y") - { + if let z = circuit.value(of: "z") { print("x: " + String(x, radix: 2).reversed()) print("y: " + String(y, radix: 2).reversed()) let zStr = String(z, radix: 2).reversed() @@ -82,3 +88,7 @@ while true { circuit.run() } +// use graphviz to render input.dot to svg +// run program to find out first bit that failed (highlighted in red) +// look at svg around that for irregularities (regular full adders are obvious) +// in this case z16 <-> fkb and z31 <-> rdn diff --git a/day24/input.txt b/day24/input.txt index 8713b19..0e1c09e 100644 --- a/day24/input.txt +++ b/day24/input.txt @@ -109,7 +109,7 @@ rhk AND btv -> rmv fjs XOR bmv -> z44 btv XOR rhk -> z25 wgk OR ppp -> vnc -kcm XOR grr -> fkb +kcm XOR grr -> z16 fkb AND rcc -> fbb dbd XOR shb -> z15 y38 XOR x38 -> vsq @@ -145,7 +145,7 @@ x11 XOR y11 -> ftq y04 XOR x04 -> mtb vnm AND mgr -> phc jfq OR tsw -> ksh -gcg XOR nbm -> rrn +gcg XOR nbm -> z37 wdv OR qph -> mcv x19 AND y19 -> pdb rqf XOR hvv -> z21 @@ -169,17 +169,17 @@ y22 XOR x22 -> jck tph AND hbk -> jhd x34 AND y34 -> hrd ssf XOR hqr -> z19 -y37 AND x37 -> z37 +y37 AND x37 -> rrn y04 AND x04 -> dgw qft AND twj -> qpn -tnn OR bss -> z16 +tnn OR bss -> fkb x12 AND y12 -> ppp kmf OR cdb -> qnf vsq XOR jrg -> z38 ccs XOR rsj -> z29 y01 XOR x01 -> jnj mtb XOR jdk -> z04 -y21 AND x21 -> rqf +y21 AND x21 -> nnr hnq XOR dwd -> z18 x19 XOR y19 -> ssf y34 XOR x34 -> hnk @@ -188,7 +188,7 @@ x08 XOR y08 -> twj fvc OR pkv -> thm x41 AND y41 -> gtv x06 AND y06 -> qmr -qsj AND tjk -> z31 +qsj AND tjk -> rdn vhj OR rrn -> jrg jrg AND vsq -> tkt y15 AND x15 -> svk @@ -211,7 +211,7 @@ y32 AND x32 -> scw dgr AND vnc -> jrk thm XOR dnf -> z43 bgj OR chb -> qsj -qsj XOR tjk -> rdn +qsj XOR tjk -> z31 thq OR knv -> rbk sqr AND njb -> smh x15 XOR y15 -> shb @@ -244,7 +244,7 @@ x13 XOR y13 -> dgr jnj AND prt -> cdb x10 XOR y10 -> vmf y37 XOR x37 -> gcg -x21 XOR y21 -> nnr +x21 XOR y21 -> rqf qst XOR hbc -> z24 rcm AND fjc -> pfb y18 AND x18 -> pnv