Add solution day 24
This commit is contained in:
parent
096208c2e5
commit
134bf147e9
10
day_24/example.txt
Normal file
10
day_24/example.txt
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
|
313
day_24/input.txt
Normal file
313
day_24/input.txt
Normal file
@ -0,0 +1,313 @@
|
||||
x00: 1
|
||||
x01: 0
|
||||
x02: 1
|
||||
x03: 1
|
||||
x04: 0
|
||||
x05: 0
|
||||
x06: 1
|
||||
x07: 1
|
||||
x08: 0
|
||||
x09: 1
|
||||
x10: 1
|
||||
x11: 1
|
||||
x12: 1
|
||||
x13: 0
|
||||
x14: 1
|
||||
x15: 0
|
||||
x16: 0
|
||||
x17: 0
|
||||
x18: 0
|
||||
x19: 0
|
||||
x20: 1
|
||||
x21: 1
|
||||
x22: 0
|
||||
x23: 1
|
||||
x24: 0
|
||||
x25: 0
|
||||
x26: 1
|
||||
x27: 1
|
||||
x28: 1
|
||||
x29: 1
|
||||
x30: 1
|
||||
x31: 1
|
||||
x32: 1
|
||||
x33: 1
|
||||
x34: 0
|
||||
x35: 1
|
||||
x36: 1
|
||||
x37: 1
|
||||
x38: 0
|
||||
x39: 1
|
||||
x40: 1
|
||||
x41: 0
|
||||
x42: 0
|
||||
x43: 1
|
||||
x44: 1
|
||||
y00: 1
|
||||
y01: 0
|
||||
y02: 0
|
||||
y03: 1
|
||||
y04: 1
|
||||
y05: 0
|
||||
y06: 0
|
||||
y07: 0
|
||||
y08: 0
|
||||
y09: 0
|
||||
y10: 0
|
||||
y11: 1
|
||||
y12: 0
|
||||
y13: 1
|
||||
y14: 0
|
||||
y15: 0
|
||||
y16: 0
|
||||
y17: 1
|
||||
y18: 1
|
||||
y19: 1
|
||||
y20: 1
|
||||
y21: 0
|
||||
y22: 0
|
||||
y23: 0
|
||||
y24: 1
|
||||
y25: 1
|
||||
y26: 0
|
||||
y27: 0
|
||||
y28: 1
|
||||
y29: 1
|
||||
y30: 1
|
||||
y31: 1
|
||||
y32: 1
|
||||
y33: 1
|
||||
y34: 1
|
||||
y35: 1
|
||||
y36: 1
|
||||
y37: 0
|
||||
y38: 1
|
||||
y39: 1
|
||||
y40: 0
|
||||
y41: 0
|
||||
y42: 0
|
||||
y43: 1
|
||||
y44: 1
|
||||
|
||||
ktr XOR cpc -> z27
|
||||
hbk XOR fbg -> z13
|
||||
rbm XOR tjp -> z36
|
||||
y44 XOR x44 -> njr
|
||||
x08 XOR y08 -> cfd
|
||||
gwg XOR ggg -> z04
|
||||
y09 XOR x09 -> dsc
|
||||
ctp OR rjr -> msw
|
||||
hwk AND jsw -> fnt
|
||||
x41 XOR y41 -> qvg
|
||||
bqj OR dqj -> tsk
|
||||
y37 XOR x37 -> stv
|
||||
njr XOR tkm -> z44
|
||||
x34 XOR y34 -> gjj
|
||||
x07 AND y07 -> sqm
|
||||
x20 XOR y20 -> ckr
|
||||
x05 XOR y05 -> skf
|
||||
hrn XOR bfj -> z32
|
||||
tkm AND njr -> rfc
|
||||
tgj OR fcp -> kkf
|
||||
tsk XOR mwp -> z38
|
||||
nfs XOR cfd -> z08
|
||||
y40 XOR x40 -> fts
|
||||
x27 AND y27 -> vvc
|
||||
x18 AND y18 -> ksj
|
||||
pwm XOR cwd -> z10
|
||||
bqd OR fns -> bwp
|
||||
kjh XOR kkc -> z01
|
||||
ncw XOR btr -> z07
|
||||
krw AND wnm -> njt
|
||||
x33 AND y33 -> ffv
|
||||
qsg XOR msw -> z29
|
||||
fvf OR crb -> bdk
|
||||
rsm OR npk -> std
|
||||
qnr AND mpn -> qth
|
||||
y14 AND x14 -> bvm
|
||||
y39 XOR x39 -> kjv
|
||||
qnr XOR mpn -> z06
|
||||
bgk OR fdc -> hrn
|
||||
x35 AND y35 -> pbr
|
||||
y11 XOR x11 -> hwk
|
||||
mwp AND tsk -> jhw
|
||||
hgw OR jjg -> qph
|
||||
hkn OR tmf -> vfn
|
||||
x32 AND y32 -> wsv
|
||||
fhv OR rrh -> nwf
|
||||
bjh AND stv -> dqj
|
||||
y12 XOR x12 -> wnm
|
||||
y27 XOR x27 -> cpc
|
||||
jsw XOR hwk -> z11
|
||||
mts OR bvm -> dks
|
||||
x17 AND y17 -> tfc
|
||||
hmc AND gjj -> tmf
|
||||
rdg OR dqs -> nmr
|
||||
x03 XOR y03 -> dnk
|
||||
x06 AND y06 -> wgj
|
||||
fts AND qrk -> fgm
|
||||
vfw OR nqq -> bjh
|
||||
knp OR ffv -> hmc
|
||||
x19 AND y19 -> sgm
|
||||
y36 AND x36 -> vfw
|
||||
msh OR rfc -> z45
|
||||
qwg AND wvj -> qhq
|
||||
y15 XOR x15 -> qff
|
||||
wvj XOR qwg -> cmv
|
||||
x33 XOR y33 -> snw
|
||||
x42 XOR y42 -> qcn
|
||||
y15 AND x15 -> kbj
|
||||
x29 XOR y29 -> qsg
|
||||
x06 XOR y06 -> mpn
|
||||
qmm AND std -> mts
|
||||
y04 XOR x04 -> ggg
|
||||
qtk OR qwc -> jsw
|
||||
y05 AND x05 -> fqb
|
||||
kkf XOR pbw -> rmj
|
||||
y35 XOR x35 -> gmv
|
||||
dhk OR ntq -> knj
|
||||
y29 AND x29 -> dhk
|
||||
x43 AND y43 -> scr
|
||||
x23 AND y23 -> frg
|
||||
y24 AND x24 -> vjw
|
||||
y13 AND x13 -> rsm
|
||||
kfr OR wjq -> gwg
|
||||
rnk OR fgm -> mng
|
||||
hbk AND fbg -> npk
|
||||
qcn XOR msr -> z42
|
||||
fqb OR jrk -> qnr
|
||||
dnk AND wcj -> wjq
|
||||
kgr XOR kdt -> z28
|
||||
nmr AND kqt -> bgk
|
||||
wbk AND hdt -> nws
|
||||
bdk AND njp -> fcp
|
||||
kkf AND pbw -> z23
|
||||
y21 XOR x21 -> jkg
|
||||
qff XOR dks -> z15
|
||||
y17 XOR x17 -> wvj
|
||||
x44 AND y44 -> msh
|
||||
pkh AND hqn -> gtq
|
||||
qcn AND msr -> dnf
|
||||
drf XOR mtd -> z19
|
||||
y40 AND x40 -> rnk
|
||||
hdt XOR wbk -> z43
|
||||
bmw XOR dwn -> z26
|
||||
wgj OR qth -> ncw
|
||||
njt OR fjp -> fbg
|
||||
jvk AND jpt -> nnt
|
||||
y32 XOR x32 -> bfj
|
||||
y38 AND x38 -> mwp
|
||||
x08 AND y08 -> fhv
|
||||
kjv XOR dqg -> z39
|
||||
x10 AND y10 -> qwc
|
||||
gdv OR mnf -> dwn
|
||||
gtq OR vjw -> tcr
|
||||
nvs OR nnt -> wcj
|
||||
y14 XOR x14 -> qmm
|
||||
cfd AND nfs -> rrh
|
||||
qvg XOR mng -> z41
|
||||
dsc XOR nwf -> z09
|
||||
cmv AND fwm -> wbw
|
||||
gmv AND vfn -> dbr
|
||||
mng AND qvg -> wcp
|
||||
x31 AND y31 -> fdc
|
||||
cwd AND pwm -> qtk
|
||||
x41 AND y41 -> rpp
|
||||
y30 XOR x30 -> rvp
|
||||
x28 XOR y28 -> kdt
|
||||
y22 AND x22 -> tgj
|
||||
krw XOR wnm -> z12
|
||||
dbr OR pbr -> tjp
|
||||
kjh AND kkc -> jjv
|
||||
gwk OR rwb -> qrk
|
||||
bdk XOR njp -> z22
|
||||
wcp OR rpp -> msr
|
||||
y00 XOR x00 -> z00
|
||||
kdt AND kgr -> ctp
|
||||
dmf XOR ckr -> z20
|
||||
wsv OR wqs -> kpd
|
||||
x21 AND y21 -> fvf
|
||||
kpd AND snw -> knp
|
||||
y38 XOR x38 -> btb
|
||||
mhj OR sgm -> dmf
|
||||
y20 AND x20 -> bqd
|
||||
wcj XOR dnk -> z03
|
||||
y12 AND x12 -> fjp
|
||||
ktr AND cpc -> hvq
|
||||
ckr AND dmf -> fns
|
||||
y02 XOR x02 -> jvk
|
||||
dnf OR hqj -> hdt
|
||||
x13 XOR y13 -> hbk
|
||||
x02 AND y02 -> nvs
|
||||
x00 AND y00 -> kkc
|
||||
skf AND qph -> jrk
|
||||
nws OR scr -> tkm
|
||||
tfc OR qhq -> z17
|
||||
x30 AND y30 -> z30
|
||||
npn OR jjv -> jpt
|
||||
kjv AND dqg -> gwk
|
||||
y03 AND x03 -> kfr
|
||||
jkg AND bwp -> crb
|
||||
y18 XOR x18 -> fwm
|
||||
bmw AND dwn -> gjh
|
||||
sqm OR qnk -> nfs
|
||||
x10 XOR y10 -> pwm
|
||||
y37 AND x37 -> bqj
|
||||
ksj OR wbw -> mtd
|
||||
std XOR qmm -> z14
|
||||
kbw XOR wnf -> z16
|
||||
x28 AND y28 -> rjr
|
||||
y07 XOR x07 -> btr
|
||||
fts XOR qrk -> z40
|
||||
y16 XOR x16 -> wnf
|
||||
dsc AND nwf -> ctj
|
||||
mtd AND drf -> mhj
|
||||
hrn AND bfj -> wqs
|
||||
cmv XOR fwm -> z18
|
||||
qff AND dks -> ttr
|
||||
y01 XOR x01 -> kjh
|
||||
bjh XOR stv -> z37
|
||||
qwd OR swm -> qwg
|
||||
kbj OR ttr -> kbw
|
||||
y26 XOR x26 -> bmw
|
||||
x16 AND y16 -> qwd
|
||||
x42 AND y42 -> hqj
|
||||
kpd XOR snw -> z33
|
||||
knj XOR rvp -> rdg
|
||||
x24 XOR y24 -> hqn
|
||||
nhb XOR tcr -> z25
|
||||
ncw AND btr -> qnk
|
||||
tpp OR ctj -> cwd
|
||||
y39 AND x39 -> rwb
|
||||
x31 XOR y31 -> kqt
|
||||
msw AND qsg -> ntq
|
||||
frg OR rmj -> pkh
|
||||
qph XOR skf -> z05
|
||||
y09 AND x09 -> tpp
|
||||
y01 AND x01 -> npn
|
||||
x19 XOR y19 -> drf
|
||||
y36 XOR x36 -> rbm
|
||||
jpd OR gjh -> ktr
|
||||
nmr XOR kqt -> z31
|
||||
x26 AND y26 -> jpd
|
||||
jpt XOR jvk -> z02
|
||||
y43 XOR x43 -> wbk
|
||||
tjp AND rbm -> nqq
|
||||
x11 AND y11 -> gfg
|
||||
nhb AND tcr -> gdv
|
||||
y34 AND x34 -> hkn
|
||||
hvq OR vvc -> kgr
|
||||
y25 AND x25 -> mnf
|
||||
gwg AND ggg -> hgw
|
||||
pkh XOR hqn -> z24
|
||||
fnt OR gfg -> krw
|
||||
x23 XOR y23 -> pbw
|
||||
wnf AND kbw -> swm
|
||||
gmv XOR vfn -> z35
|
||||
x22 XOR y22 -> njp
|
||||
x25 XOR y25 -> nhb
|
||||
knj AND rvp -> dqs
|
||||
gjj XOR hmc -> z34
|
||||
btb OR jhw -> dqg
|
||||
x04 AND y04 -> jjg
|
||||
jkg XOR bwp -> z21
|
47
day_24/larger_example.txt
Normal file
47
day_24/larger_example.txt
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
|
123
day_24/solve_1.ts
Normal file
123
day_24/solve_1.ts
Normal file
@ -0,0 +1,123 @@
|
||||
export type Operation =
|
||||
'and' |
|
||||
'or' |
|
||||
'xor';
|
||||
|
||||
export type BitValue = 0 | 1;
|
||||
|
||||
export type InputData = {
|
||||
inputs: {
|
||||
name: string,
|
||||
value: BitValue
|
||||
}[],
|
||||
|
||||
gates: {
|
||||
lhs: string,
|
||||
rhs: string,
|
||||
operation: Operation,
|
||||
result: string,
|
||||
}[]
|
||||
};
|
||||
|
||||
export async function readData(path: string): Promise<InputData> {
|
||||
const text = await Deno.readTextFile(path);
|
||||
const [
|
||||
inputsText,
|
||||
gatesText
|
||||
] = text.replaceAll("\r", "").trim().split('\n\n');
|
||||
|
||||
const inputs = inputsText.split('\n').map(x => {
|
||||
const [name, value] = x.split(':');
|
||||
return {
|
||||
name: name.trim(),
|
||||
value: value.trim() === '1' ? 1 : 0 as BitValue
|
||||
};
|
||||
});
|
||||
|
||||
const r = /(\w+) (\w+) (\w+) -> (\w+)/;
|
||||
const gates = gatesText.split('\n').map(x => {
|
||||
const [_, lhs, operation, rhs, result] = x.match(r)!;
|
||||
return {
|
||||
lhs,
|
||||
operation: operation.toLowerCase() as Operation,
|
||||
rhs,
|
||||
result
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
inputs,
|
||||
gates
|
||||
};
|
||||
}
|
||||
|
||||
export function and(lhs: BitValue, rhs: BitValue): BitValue {
|
||||
return (lhs & rhs) as BitValue;
|
||||
}
|
||||
|
||||
export function or(lhs: BitValue, rhs: BitValue): BitValue {
|
||||
return (lhs | rhs) as BitValue;
|
||||
}
|
||||
|
||||
export function xor(lhs: BitValue, rhs: BitValue): BitValue {
|
||||
return (lhs ^ rhs) as BitValue;
|
||||
}
|
||||
|
||||
export function opGate(lhs: BitValue, rhs: BitValue, operation: Operation): BitValue {
|
||||
switch (operation) {
|
||||
case 'and': return and(lhs, rhs);
|
||||
case 'or': return or(lhs, rhs);
|
||||
case 'xor': return xor(lhs, rhs);
|
||||
}
|
||||
}
|
||||
|
||||
export class Executer {
|
||||
private inputs: Map<string, BitValue> = new Map();
|
||||
private gates: InputData['gates'];
|
||||
private results: Map<string, BitValue> = new Map();
|
||||
|
||||
|
||||
constructor(data: InputData) {
|
||||
this.gates = data.gates;
|
||||
for (const input of data.inputs) {
|
||||
this.inputs.set(input.name, input.value);
|
||||
}
|
||||
}
|
||||
|
||||
execute(name: string): BitValue {
|
||||
if (this.inputs.has(name)) {
|
||||
return this.inputs.get(name)!;
|
||||
}
|
||||
if (this.results.has(name)) {
|
||||
return this.results.get(name)!;
|
||||
}
|
||||
const gate = this.gates.find(x => x.result === name);
|
||||
if (!gate) {
|
||||
throw new Error(`Gate ${name} not found`);
|
||||
}
|
||||
const lhs = this.execute(gate.lhs);
|
||||
const rhs = this.execute(gate.rhs);
|
||||
const result = opGate(lhs, rhs, gate.operation);
|
||||
this.results.set(name, result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
const data = await readData('input.txt');
|
||||
console.log(data);
|
||||
const executer = new Executer(data);
|
||||
|
||||
const zs = data.gates.filter(gate => gate.result.startsWith("z"))
|
||||
.map(gate => gate.result);
|
||||
zs.sort();
|
||||
console.log(zs);
|
||||
let r = 0n;
|
||||
let i = 0;
|
||||
for (const z of zs) {
|
||||
const result = await executer.execute(z);
|
||||
const digit = BigInt(result) << BigInt(i++);
|
||||
r = r | digit;
|
||||
}
|
||||
console.log(r);
|
||||
}
|
260
day_24/solve_2.ts
Normal file
260
day_24/solve_2.ts
Normal file
@ -0,0 +1,260 @@
|
||||
import { BitValue, Executer, InputData, readData } from "./solve_1.ts";
|
||||
import { red, green } from "jsr:@std/fmt/colors";
|
||||
|
||||
// export function dependencies(data: InputData): Map<string, Set<string>> {
|
||||
// const deps = new Map<string, Set<string>>();
|
||||
// for (const gate of data.gates) {
|
||||
// // check visited.
|
||||
// // if visited, skip
|
||||
// if (deps.has(gate.result)) {
|
||||
// continue;
|
||||
// }
|
||||
// const stack = [gate.result];
|
||||
// while (stack.length > 0) {
|
||||
// const current = stack.pop()!;
|
||||
// const node = data.gates.find(x => x.result === current)!;
|
||||
// stack.push(node.lhs);
|
||||
// stack.push(node.rhs);
|
||||
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
function swapResult(data: InputData, a: string, b: string) {
|
||||
data.gates.forEach(gate => {
|
||||
if (gate.result === a) {
|
||||
gate.result = b;
|
||||
}
|
||||
else if (gate.result === b) {
|
||||
gate.result = a;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function drawMermaidGraph(data: InputData, options: { print?: (str: string) => void } = {
|
||||
print: console.log
|
||||
}) {
|
||||
const print = options.print ?? console.log;
|
||||
print("graph TD");
|
||||
data.inputs.forEach(x => print(` ${x.name}(${x.name} ${x.value})`));
|
||||
data.gates.forEach(gate => {
|
||||
print(` ${gate.lhs} -->|${gate.operation}| ${gate.result}`);
|
||||
print(` ${gate.rhs} -->|${gate.operation}| ${gate.result}`);
|
||||
});
|
||||
}
|
||||
|
||||
function renameGates(data: InputData, from: string, to: string) {
|
||||
data.gates.forEach(gate => {
|
||||
if (gate.lhs === from) {
|
||||
gate.lhs = to;
|
||||
}
|
||||
if (gate.rhs === from) {
|
||||
gate.rhs = to;
|
||||
}
|
||||
if (gate.result === from) {
|
||||
gate.result = to;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function renameForAddOperation(data: InputData): InputData {
|
||||
const newData = {
|
||||
inputs: data.inputs,
|
||||
gates: data.gates.map(gate => ({ ...gate }))
|
||||
};
|
||||
const isRenamed = (name: string) => {
|
||||
return name.length !== 3;
|
||||
}
|
||||
const renameGate = (from: string, to: string) => {
|
||||
if (isRenamed(from)) {
|
||||
return;
|
||||
}
|
||||
renameGates(newData, from, to);
|
||||
}
|
||||
|
||||
for (let i = 0; i < newData.gates.length; i++) {
|
||||
const gate = newData.gates[i];
|
||||
const lhs = /(x|y)(\d+)/.exec(gate.lhs);
|
||||
const rhs = /(x|y)(\d+)/.exec(gate.rhs);
|
||||
if (lhs && rhs
|
||||
&& lhs[1] != rhs[1]
|
||||
&& lhs[2] === rhs[2]) {
|
||||
if (gate.operation === "and") {
|
||||
const newName = `CarryHalf${lhs[2]}_${gate.result}`;
|
||||
renameGate(gate.result, newName);
|
||||
}
|
||||
else if (gate.operation === "xor") {
|
||||
const newName = `SumHalf${lhs[2]}_${gate.result}`;
|
||||
renameGate(gate.result, newName);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let loop = 0; loop < newData.gates.length * 40; loop++) {
|
||||
|
||||
for (let i = 0; i < newData.gates.length; i++) {
|
||||
const gate = newData.gates[i];
|
||||
const lhs = /(Carry|Sum)/.exec(gate.lhs);
|
||||
const rhs = /(Carry|Sum)/.exec(gate.rhs);
|
||||
if (lhs && rhs
|
||||
&& lhs[1] != rhs[1]) {
|
||||
if (gate.operation === "and") {
|
||||
// C_in and (A xor B) + A and B = C_out
|
||||
const newName = `ProgressCarryFull_${gate.result}`;
|
||||
renameGate(gate.result, newName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < newData.gates.length; i++) {
|
||||
const gate = newData.gates[i];
|
||||
const lhs = /(ProgressCarryFull|CarryHalf)/.exec(gate.lhs);
|
||||
const rhs = /(ProgressCarryFull|CarryHalf)/.exec(gate.rhs);
|
||||
if (lhs && rhs
|
||||
&& lhs[1] != rhs[1]) {
|
||||
if (gate.operation === "or") {
|
||||
const newName = `CarryFull_${gate.result}`;
|
||||
renameGate(gate.result, newName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < newData.gates.length; i++) {
|
||||
const gate = newData.gates[i];
|
||||
const lhs = /(CarryFull|SumHalf)/.exec(gate.lhs);
|
||||
const rhs = /(CarryFull|SumHalf)/.exec(gate.rhs);
|
||||
if (lhs && rhs
|
||||
&& lhs[1] !== rhs[1]) {
|
||||
if (gate.operation === "xor") {
|
||||
const newName = `SumFull_${gate.result}`;
|
||||
renameGate(gate.result, newName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
function getXvalue(data: InputData): number {
|
||||
return data.inputs.filter(x => x.name.startsWith('x'))
|
||||
.toSorted((a, b) => b.name.localeCompare(a.name))
|
||||
.map(x => x.value)
|
||||
.reduce<number>((acc, val) => acc * 2 + val, 0);
|
||||
}
|
||||
|
||||
function getYvalue(data: InputData): number {
|
||||
return data.inputs.filter(x => x.name.startsWith('y'))
|
||||
.toSorted((a, b) => b.name.localeCompare(a.name))
|
||||
.map(x => {
|
||||
return x.value
|
||||
})
|
||||
.reduce<number>((acc, val) => acc * 2 + val, 0);
|
||||
}
|
||||
|
||||
function setInputs(data: InputData, x: number, y: number) {
|
||||
const len = data.inputs.filter(x => x.name.startsWith('x')).length;
|
||||
const xBits = x.toString(2).padStart(len, '0').split('').map(x => parseInt(x));
|
||||
const yBits = y.toString(2).padStart(len, '0').split('').map(x => parseInt(x));
|
||||
data.inputs.forEach(v => {
|
||||
const r = /(\w)(\d+)/.exec(v.name);
|
||||
if (r && r[1] === 'x') {
|
||||
v.value = xBits[len - 1 - parseInt(r[2])] as BitValue;
|
||||
}
|
||||
if (r && r[1] === 'y') {
|
||||
v.value = yBits[len - 1 - parseInt(r[2])] as BitValue;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
const data = await readData('input.txt');
|
||||
|
||||
swapResult(data, 'cmv', 'z17');
|
||||
swapResult(data, 'rmj', 'z23');
|
||||
swapResult(data, 'rdg', 'z30');
|
||||
swapResult(data, 'btb', 'mwp');
|
||||
|
||||
const errorBitIndex = [];
|
||||
const len = data.inputs.filter(x => x.name.startsWith('x')).length;
|
||||
for (let i = 0; i < len; i++) {
|
||||
// 0 1 check add
|
||||
// 1 1 check carry
|
||||
for (const c of [[0,1],[1,1]]) {
|
||||
const x = c[0] * 2 ** i;
|
||||
const y = c[1] * 2 ** i;
|
||||
setInputs(data, x, y);
|
||||
const xVal = getXvalue(data);
|
||||
const yVal = getYvalue(data);
|
||||
const desiredZvalue = xVal + yVal;
|
||||
console.log(xVal, yVal, desiredZvalue);
|
||||
const zNames = data.gates.filter(gate => gate.result.startsWith("z"))
|
||||
.map(gate => gate.result)
|
||||
.toSorted((a, b) => a.localeCompare(b));
|
||||
const desiredZvalueBits = desiredZvalue.toString(2).padStart(zNames.length, '0').split('').toReversed().map(x => parseInt(x));
|
||||
const executer = new Executer(data);
|
||||
const actualZValues = zNames.map(name => executer.execute(name))
|
||||
let str = '';
|
||||
let diff = false;
|
||||
for (let i = zNames.length - 1; i >= 0; i--) {
|
||||
const actual = actualZValues[i];
|
||||
const desired = desiredZvalueBits[i];
|
||||
diff ||= actual !== desired;
|
||||
str += actual === desired ? green(actual.toString()) : red(actual.toString());
|
||||
}
|
||||
if (diff) {
|
||||
errorBitIndex.push(i);
|
||||
}
|
||||
console.log(i, c);
|
||||
console.log("",x.toString(2).padStart(len, '0'));
|
||||
console.log("",y.toString(2).padStart(len, '0'));
|
||||
console.log(str);
|
||||
}
|
||||
}
|
||||
console.log(errorBitIndex);
|
||||
|
||||
|
||||
// const xVal = getXvalue(data);
|
||||
// const yVal = getYvalue(data);
|
||||
// console.log(yVal, yVal.toString(2));
|
||||
// const desiredZvalue = xVal + yVal;
|
||||
// // console.log(xVal + yVal);
|
||||
// // console.log(desiredZvalueBits);
|
||||
|
||||
// const zNames = data.gates.filter(gate => gate.result.startsWith("z"))
|
||||
// .map(gate => gate.result)
|
||||
// .toSorted((a, b) => a.localeCompare(b));
|
||||
// const desiredZvalueBits = desiredZvalue.toString(2).padStart(zNames.length, '0').split('');
|
||||
// const executer = new Executer(data);
|
||||
// const actualZValues = zNames.map(name => executer.execute(name)).toReversed()
|
||||
// // console.log(actualZValues);
|
||||
|
||||
// console.log("actual\t",actualZValues.join(''));
|
||||
// console.log("desired\t",desiredZvalueBits.join(''));
|
||||
// // print differences
|
||||
// let str = '';
|
||||
// for (let i = 0; i < zNames.length; i++) {
|
||||
// const actual = actualZValues[i].toString();
|
||||
// const desired = desiredZvalueBits[i];
|
||||
// str += actual === desired ? green(actual.toString()) : red(actual.toString());
|
||||
// }
|
||||
// console.log("difference",str);
|
||||
|
||||
const file = Deno.openSync('graph.log', { write: true, create: true, truncate: false });
|
||||
drawMermaidGraph(data, { print: (str) =>{
|
||||
file.writeSync(new TextEncoder().encode(str + '\n'));
|
||||
} });
|
||||
file.close();
|
||||
const renamed = renameForAddOperation(data);
|
||||
const file2 = Deno.openSync('graph2.log', { write: true, create: true, truncate: false });
|
||||
drawMermaidGraph(renamed, { print: (str) =>{
|
||||
file2.writeSync(new TextEncoder().encode(str + '\n'));
|
||||
} });
|
||||
file2.close();
|
||||
|
||||
const solve = ['cmv', 'z17',
|
||||
'rmj', 'z23',
|
||||
'rdg', 'z30',
|
||||
'btb', 'mwp'].sort();
|
||||
console.log(solve.join(","));
|
||||
}
|
Loading…
Reference in New Issue
Block a user