Skip to content

Commit 9286bf0

Browse files
Update docs on Tue Dec 24 10:23:58 UTC 2024
1 parent 6730f3a commit 9286bf0

File tree

1 file changed

+47
-51
lines changed

1 file changed

+47
-51
lines changed

2024/24/index.html

Lines changed: 47 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -297,104 +297,100 @@ <h2 id="problem-name">Crossed Wires</h2>
297297
using System.Collections.Generic;
298298
using System.Linq;
299299
using System.Text.RegularExpressions;
300+
using Circuit = System.Collections.Generic.Dictionary&lt;string, Gate&gt;;
300301

301-
record struct Rule(string in1, string in2, string kind, string output);
302+
record struct Gate(string in1, string kind, string in2);
302303

303304
[ProblemName(&quot;Crossed Wires&quot;)]
304305
class Solution : Solver {
305306

306307
public object PartOne(string input) {
307-
var gate = Parse(input);
308-
var bits = gate.Keys.Where(k =&gt; k.StartsWith(&quot;z&quot;)).OrderByDescending(x =&gt; x).ToArray();
308+
var (inputs, circuit) = Parse(input);
309+
310+
var outputs = from label in circuit.Keys where label.StartsWith(&quot;z&quot;) select label;
311+
309312
var res = 0L;
310-
foreach (var b in bits) {
311-
res = res * 2 + gate[b]();
313+
foreach (var label in outputs.OrderByDescending(label=&gt;label)) {
314+
res = res * 2 + Evaluate(label, circuit, inputs);
312315
}
313316
return res;
314317
}
315318

319+
int Evaluate(string label, Circuit circuit, Dictionary&lt;string, int&gt; inputs) {
320+
if (inputs.TryGetValue(label, out var res)) {
321+
return res;
322+
} else {
323+
return circuit[label] switch {
324+
Gate(var in1, &quot;AND&quot;, var in2) =&gt; Evaluate(in1, circuit, inputs) &amp; Evaluate(in2, circuit, inputs),
325+
Gate(var in1, &quot;OR&quot;, var in2) =&gt; Evaluate(in1, circuit, inputs) | Evaluate(in2, circuit, inputs),
326+
Gate(var in1, &quot;XOR&quot;, var in2) =&gt; Evaluate(in1, circuit, inputs) ^ Evaluate(in2, circuit, inputs),
327+
_ =&gt; throw new Exception(circuit[label].ToString()),
328+
};
329+
}
330+
}
331+
316332
public object PartTwo(string input) {
317-
var swaps = Fix(ParseRules(input.Split(&quot;\n\n&quot;)[1]));
318-
return string.Join(&quot;,&quot;, swaps.OrderBy(x =&gt; x));
333+
var circuit = Parse(input).circuit;
334+
return string.Join(&quot;,&quot;, Fix(circuit).OrderBy(label =&gt; label));
319335
}
320336

321-
// the rules should define a full adder for two 44 bit numbers
337+
// the circuit should define a full adder for two 44 bit numbers
322338
// this fixer is specific to my input.
323-
IEnumerable&lt;string&gt; Fix(List&lt;Rule&gt; rules) {
324-
var cin = Output(rules, &quot;x00&quot;, &quot;AND&quot;, &quot;y00&quot;);
339+
IEnumerable&lt;string&gt; Fix(Circuit circuit) {
340+
var cin = Output(circuit, &quot;x00&quot;, &quot;AND&quot;, &quot;y00&quot;);
325341
for (var i = 1; i &lt; 45; i++) {
326342
var x = $&quot;x{i:D2}&quot;;
327343
var y = $&quot;y{i:D2}&quot;;
328344
var z = $&quot;z{i:D2}&quot;;
329345

330-
var xor1 = Output(rules, x, &quot;XOR&quot;, y);
331-
var and1 = Output(rules, x, &quot;AND&quot;, y);
332-
333-
var and2 = Output(rules, cin, &quot;AND&quot;, xor1);
334-
var xor2 = Output(rules, cin, &quot;XOR&quot;, xor1);
346+
var xor1 = Output(circuit, x, &quot;XOR&quot;, y);
347+
var and1 = Output(circuit, x, &quot;AND&quot;, y);
348+
var xor2 = Output(circuit, cin, &quot;XOR&quot;, xor1);
349+
var and2 = Output(circuit, cin, &quot;AND&quot;, xor1);
335350

336351
if (xor2 == null &amp;&amp; and2 == null) {
337-
return Swap(rules, xor1, and1);
352+
return SwapAndFix(circuit, xor1, and1);
338353
}
339354

340-
var carry = Output(rules, and1, &quot;OR&quot;, and2);
355+
var carry = Output(circuit, and1, &quot;OR&quot;, and2);
341356
if (xor2 != z) {
342-
return Swap(rules,z,xor2);
357+
return SwapAndFix(circuit, z, xor2);
343358
} else {
344359
cin = carry;
345360
}
346361
}
347362
return [];
348363
}
349364

350-
string Output(IEnumerable&lt;Rule&gt; rules, string x, string gate, string y) =&gt;
351-
rules.SingleOrDefault(rule =&gt;
352-
(rule.in1 == x &amp;&amp; rule.kind == gate &amp;&amp; rule.in2 == y) ||
353-
(rule.in1 == y &amp;&amp; rule.kind == gate &amp;&amp; rule.in2 == x)
354-
).output;
355-
356-
IEnumerable&lt;string&gt; Swap(List&lt;Rule&gt; rules, string out1, string out2) {
357-
rules = rules.Select(rule =&gt;
358-
rule.output == out1 ? rule with {output = out2} :
359-
rule.output == out2 ? rule with {output = out1} :
360-
rule
361-
).ToList();
362-
363-
return Fix(rules).Concat([out1, out2]);
365+
IEnumerable&lt;string&gt; SwapAndFix(Circuit circuit, string out1, string out2) {
366+
(circuit[out1], circuit[out2]) = (circuit[out2], circuit[out1]);
367+
return Fix(circuit).Concat([out1, out2]);
364368
}
365369

366-
List&lt;Rule&gt; ParseRules(string input) =&gt; input
367-
.Split(&quot;\n&quot;)
368-
.Select(line =&gt; {
369-
var parts = line.Split(&quot; &quot;);
370-
return new Rule(in1: parts[0], in2: parts[2], kind: parts[1], output: parts[4]);
371-
})
372-
.ToList();
373-
Dictionary&lt;string, Gate&gt; Parse(string input) {
370+
string Output(Circuit circuit, string x, string kind, string y) =&gt;
371+
circuit.SingleOrDefault(pair =&gt;
372+
(pair.Value.in1 == x &amp;&amp; pair.Value.kind == kind &amp;&amp; pair.Value.in2 == y) ||
373+
(pair.Value.in1 == y &amp;&amp; pair.Value.kind == kind &amp;&amp; pair.Value.in2 == x)
374+
).Key;
374375

375-
var res = new Dictionary&lt;string, Gate&gt;();
376+
(Dictionary&lt;string, int&gt; inputs, Circuit circuit) Parse(string input) {
377+
var inputs = new Dictionary&lt;string, int&gt;();
378+
var circuit = new Circuit();
376379

377380
var blocks = input.Split(&quot;\n\n&quot;);
378381

379382
foreach (var line in blocks[0].Split(&quot;\n&quot;)) {
380383
var parts = line.Split(&quot;: &quot;);
381-
res.Add(parts[0], () =&gt; int.Parse(parts[1]));
384+
inputs.Add(parts[0], int.Parse(parts[1]));
382385
}
383386

384387
foreach (var line in blocks[1].Split(&quot;\n&quot;)) {
385388
var parts = Regex.Matches(line, &quot;[a-zA-z0-9]+&quot;).Select(m =&gt; m.Value).ToArray();
386-
Gate gate = (parts[0], parts[1], parts[2]) switch {
387-
(var in1, &quot;AND&quot;, var in2) =&gt; () =&gt; res[in1]() &amp; res[in2](),
388-
(var in1, &quot;OR&quot;, var in2) =&gt; () =&gt; res[in1]() | res[in2](),
389-
(var in1, &quot;XOR&quot;, var in2) =&gt; () =&gt; res[in1]() ^ res[in2](),
390-
_ =&gt; throw new Exception(),
391-
};
392-
res.Add(parts[3], gate);
389+
circuit.Add(parts[3], new Gate(in1: parts[0], kind: parts[1], in2: parts[2]));
393390
}
394-
return res;
391+
return (inputs, circuit);
395392
}
396393

397-
delegate int Gate();
398394
}</code></pre></div>
399395
<div id="code-location"> <p>Please ☆ my <a href="https://github.com/encse/adventofcode/">repo</a> if you like it!</p></div>
400396
</div>

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy