diff --git a/2024/Exploration.xlsx b/2024/Exploration.xlsx
index 6ef8f19..44f9558 100644
Binary files a/2024/Exploration.xlsx and b/2024/Exploration.xlsx differ
diff --git a/2024/ts/day-24/code.ts b/2024/ts/day-24/code.ts
new file mode 100644
index 0000000..f528116
--- /dev/null
+++ b/2024/ts/day-24/code.ts
@@ -0,0 +1,123 @@
+// Solution for day 24 of advent of code 2024
+
+import { readInputLines, readInput } from "../system/aoc-helper";
+import "../utils/array-helpers";
+import { Puzzle } from "../model/puzzle";
+
+type Wire = { name: string, value: "true" | "false" | "unknown" };
+
+type Gate = {
+ type: "AND" | "OR" | "XOR"
+ inputs: [string, string]
+ output: string
+}
+
+type Input = {
+ inputs: Wire[],
+ gates: Gate[],
+}
+
+const processInput = (day: number) => {
+ const lines = readInputLines(day);
+ let line = lines.shift()!;
+ let inputs: Wire[] = [];
+ while (line !== "") {
+ const [name, value] = line.split(": ");
+ inputs.push({
+ name,
+ value: value === "1" ? "true" : value === "0" ? "false" : "unknown"
+ });
+ line = lines.shift()!;
+ }
+ const gateRegex = /(\w+) (OR|AND|XOR) (\w+) -> (\w+)/;
+ const gates = lines.map(line => {
+ const match = line.match(gateRegex)!;
+ return {
+ type: match[2] as "AND" | "OR" | "XOR",
+ inputs: [match[1], match[3]],
+ output: match[4]
+ };
+ });
+ return { inputs, gates };
+};
+
+const partOne = ({inputs, gates}: Input, debug: boolean) => {
+
+ const wireNames = [...new Set(gates.flatMap(gate => [gate.output, ...gate.inputs]))].toSorted();
+ const wires = wireNames.map(name => {
+ const wire = inputs.find(wire => wire.name === name);
+ return { name, value: wire ? wire.value : "unknown" };
+ });
+
+ let done = wires.every(wire => wire.value !== "unknown");
+ while (!done) {
+ for (const gate of gates) {
+ // is the output known?
+ const outputWire = wires.find(wire => wire.name === gate.output);
+ if (outputWire?.value !== "unknown") {
+ continue;
+ }
+ // are the inputs known?
+ const input1 = wires.find(wire => wire.name === gate.inputs[0])!;
+ const input2 = wires.find(wire => wire.name === gate.inputs[1])!;
+ if (input1?.value === "unknown" || input2?.value === "unknown") {
+ continue;
+ }
+
+ // calculate the output
+ if (gate.type === "AND") {
+ outputWire.value = (input1.value === "true" && input2.value === "true") ? "true" : "false";
+ }
+ if (gate.type === "OR") {
+ outputWire.value = (input1.value === "true" || input2.value === "true") ? "true" : "false";
+ }
+ if (gate.type === "XOR") {
+ outputWire.value = (input1.value !== input2.value) ? "true" : "false";
+ }
+ }
+ done = wires.every(wire => wire.value !== "unknown");
+ }
+
+ const zvalue = wires.filter(wire => wire.name.startsWith("z")).map(zwire => zwire.value === "true" ? 1 : 0).toReversed();
+
+ let result = 0;
+ for (const value of zvalue) {
+ result = result * 2 + value;
+ }
+
+ return result;
+};
+
+const partTwo = (input: Input, debug: boolean) => {
+ if (debug) {
+ console.log("-------Debug-----");
+ }
+ return -1;
+};
+
+const resultOne = (_: any, result: number) => {
+ return `Result part one is ${result}`;
+};
+
+const resultTwo = (_: any, result: number) => {
+ return `Result part two is ${result}`;
+};
+
+const showInput = (input: Input) => {
+ console.log(input);
+};
+
+const test = (_: Input) => {
+ console.log("----Test-----");
+};
+
+export const solution: Puzzle = {
+ day: 24,
+ input: () => processInput(24),
+ partOne,
+ //partTwo,
+ resultOne: resultOne,
+ resultTwo: resultTwo,
+ showInput,
+ test,
+}
\ No newline at end of file
diff --git a/2024/ts/day-24/input.txt b/2024/ts/day-24/input.txt
new file mode 100644
index 0000000..718f023
--- /dev/null
+++ b/2024/ts/day-24/input.txt
@@ -0,0 +1,313 @@
+x00: 1
+x01: 0
+x02: 0
+x03: 1
+x04: 1
+x05: 0
+x06: 0
+x07: 0
+x08: 0
+x09: 0
+x10: 0
+x11: 1
+x12: 0
+x13: 1
+x14: 1
+x15: 0
+x16: 1
+x17: 1
+x18: 1
+x19: 1
+x20: 0
+x21: 0
+x22: 1
+x23: 0
+x24: 1
+x25: 1
+x26: 1
+x27: 1
+x28: 1
+x29: 0
+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: 1
+x43: 0
+x44: 1
+y00: 1
+y01: 0
+y02: 0
+y03: 1
+y04: 1
+y05: 1
+y06: 0
+y07: 0
+y08: 0
+y09: 1
+y10: 0
+y11: 0
+y12: 0
+y13: 1
+y14: 1
+y15: 1
+y16: 0
+y17: 0
+y18: 1
+y19: 0
+y20: 1
+y21: 1
+y22: 1
+y23: 0
+y24: 0
+y25: 1
+y26: 0
+y27: 0
+y28: 1
+y29: 1
+y30: 1
+y31: 1
+y32: 1
+y33: 0
+y34: 0
+y35: 0
+y36: 1
+y37: 1
+y38: 1
+y39: 0
+y40: 0
+y41: 1
+y42: 0
+y43: 0
+y44: 1
+
+mvq XOR chf -> z05
+chf AND mvq -> pnn
+nqp OR gqt -> ddt
+pnn OR ntm -> ttr
+kvq XOR ttr -> z06
+jqk XOR vnc -> z40
+kjf OR ftk -> sqn
+mwb XOR sbr -> z09
+x42 XOR y42 -> vvg
+x09 XOR y09 -> mwb
+x19 AND y19 -> scf
+x16 AND y16 -> gqt
+pgd AND wjd -> dqf
+fjc OR wdj -> jnh
+x37 XOR y37 -> fpb
+dqr XOR wnt -> z34
+x11 XOR y11 -> thj
+shh OR kcq -> sjk
+jwp OR dvc -> qhc
+sjr OR jrk -> tfq
+x20 AND y20 -> ssw
+jqp AND vkp -> fdv
+thj AND fgd -> ngq
+ccb OR kfg -> tqd
+x07 XOR y07 -> dgg
+nmt OR jrg -> sjq
+y40 AND x40 -> tcf
+x02 AND y02 -> rgb
+x15 AND y15 -> chh
+gqn XOR sjq -> pfw
+bhc AND fqq -> jvk
+hsk OR kwq -> kdv
+chh OR mqf -> pht
+x00 AND y00 -> mcg
+hhp AND hhg -> kbm
+cph OR qjc -> nff
+jnh XOR bdw -> z28
+y06 AND x06 -> qjc
+y30 AND x30 -> kfg
+y21 AND x21 -> kcq
+vgs AND skh -> bmg
+qgg AND bmw -> jwp
+chn XOR jjk -> z25
+y34 XOR x34 -> wnt
+sjk XOR dpc -> z22
+y11 AND x11 -> hqj
+kbg XOR tcv -> z30
+pww AND pvw -> mvv
+hqj OR ngq -> qgg
+x23 AND y23 -> cpq
+jnh AND bdw -> qhb
+y04 AND x04 -> ggg
+x25 AND y25 -> thm
+x34 AND y34 -> fbd
+pqk XOR srh -> z02
+y43 AND x43 -> gvv
+kkk OR rgb -> gkk
+jvk OR drq -> smj
+pww XOR pvw -> z24
+tcv AND kbg -> ccb
+wtw OR scf -> vcp
+x03 AND y03 -> ngs
+dqr AND wnt -> cgq
+tsf AND kpk -> tjr
+y18 AND x18 -> hsk
+y26 XOR x26 -> dtk
+y44 XOR x44 -> hhg
+x10 XOR y10 -> wjp
+kvq AND ttr -> cph
+y35 XOR x35 -> bhc
+wsw OR dqf -> pvj
+jsq XOR vcj -> shh
+pdf OR npr -> vkp
+y12 AND x12 -> dvc
+fsg XOR fdh -> z14
+dwf XOR rbf -> z32
+y24 XOR x24 -> pww
+sqn AND fmd -> mqf
+x35 AND y35 -> drq
+wjp AND dvh -> bdf
+smj AND tww -> ddk
+hrm AND jhc -> kwq
+jvv AND jww -> kff
+pvt AND gkk -> pwn
+hhg XOR hhp -> z44
+kdv XOR ntj -> z19
+y23 XOR x23 -> jww
+sdg OR trv -> dvh
+fdh AND fsg -> ftk
+x01 XOR y01 -> vcn
+y29 AND x29 -> ghw
+hsg XOR dct -> z08
+kff OR cpq -> pvw
+ddt AND nhg -> vft
+ggv OR thm -> skh
+mcg XOR vcn -> z01
+y41 AND x41 -> wsw
+x14 XOR y14 -> fsg
+y13 AND x13 -> rgp
+rgp OR crm -> fdh
+srh AND pqk -> kkk
+tcf OR cpp -> pgd
+y03 XOR x03 -> pvt
+x33 AND y33 -> mtw
+dgg AND nff -> gqk
+y30 XOR x30 -> kbg
+y07 AND x07 -> dvs
+x44 AND y44 -> spc
+y38 AND x38 -> nmt
+hkv AND tqd -> ckb
+y31 XOR x31 -> hkv
+y02 XOR x02 -> srh
+y17 AND x17 -> fjk
+vcp AND khd -> dsj
+qcr AND jgd -> wdj
+y19 XOR x19 -> ntj
+fpb XOR dds -> z37
+x16 XOR y16 -> rqv
+y17 XOR x17 -> nhg
+ssw OR dsj -> vcj
+fpb AND dds -> fqd
+pdr OR ggg -> mvq
+x38 XOR y38 -> tdj
+rqv XOR pht -> z16
+pfw OR kdd -> jqk
+x36 AND y36 -> sbn
+x33 XOR y33 -> jqp
+bns OR gvv -> hhp
+y32 XOR x32 -> rbf
+y36 XOR x36 -> tww
+pgd XOR wjd -> z41
+khd XOR vcp -> z20
+ckb OR sqr -> dwf
+x39 XOR y39 -> gqn
+wfj XOR vfk -> z04
+qhb OR kjs -> tsf
+kdv AND ntj -> wtw
+ksd OR hqw -> jvv
+x13 XOR y13 -> kdm
+y00 XOR x00 -> z00
+jvv XOR jww -> z23
+y12 XOR x12 -> bmw
+y22 AND x22 -> ksd
+x21 XOR y21 -> jsq
+x43 XOR y43 -> qtr
+bmg OR dtk -> qcr
+gqk OR dvs -> dct
+qgg XOR bmw -> z12
+mwb AND sbr -> sdg
+mcg AND vcn -> ndb
+kkg OR bdf -> fgd
+x04 XOR y04 -> wfj
+y22 XOR x22 -> dpc
+skh XOR vgs -> z26
+ddt XOR nhg -> z17
+bhc XOR fqq -> z35
+tdj XOR pnh -> z38
+kdm XOR qhc -> z13
+y31 AND x31 -> sqr
+vvg AND pvj -> sjr
+rbf AND dwf -> npr
+qtr AND tfq -> bns
+y18 XOR x18 -> hrm
+chn AND jjk -> ggv
+y28 AND x28 -> kjs
+mtw OR fdv -> z33
+nff XOR dgg -> z07
+y10 AND x10 -> kkg
+jsq AND vcj -> z21
+vft OR fjk -> jhc
+qtr XOR tfq -> z43
+gqn AND sjq -> kdd
+y15 XOR x15 -> fmd
+wfj AND vfk -> pdr
+y27 XOR x27 -> jgd
+y09 AND x09 -> trv
+x14 AND y14 -> kjf
+tww XOR smj -> z36
+jqk AND vnc -> cpp
+nkq OR fqd -> pnh
+x06 XOR y06 -> kvq
+y01 AND x01 -> gbh
+x37 AND y37 -> nkq
+x05 XOR y05 -> chf
+vdk OR cdm -> sbr
+y08 AND x08 -> vdk
+sqn XOR fmd -> z15
+x24 AND y24 -> dcj
+y25 XOR x25 -> jjk
+kbm OR spc -> z45
+hrm XOR jhc -> z18
+pvj XOR vvg -> z42
+wjp XOR dvh -> z10
+mvv OR dcj -> chn
+y42 AND x42 -> jrk
+tsf XOR kpk -> z29
+vkp XOR jqp -> dqr
+y41 XOR x41 -> wjd
+y32 AND x32 -> pdf
+y26 AND x26 -> vgs
+jgd XOR qcr -> z27
+y29 XOR x29 -> kpk
+ngs OR pwn -> vfk
+dpc AND sjk -> hqw
+qhc AND kdm -> crm
+rqv AND pht -> nqp
+x39 AND y39 -> z39
+thj XOR fgd -> z11
+tjr OR ghw -> tcv
+gkk XOR pvt -> z03
+y27 AND x27 -> fjc
+y28 XOR x28 -> bdw
+gbh OR ndb -> pqk
+tqd XOR hkv -> z31
+dct AND hsg -> cdm
+fbd OR cgq -> fqq
+x05 AND y05 -> ntm
+sbn OR ddk -> dds
+y40 XOR x40 -> vnc
+y20 XOR x20 -> khd
+x08 XOR y08 -> hsg
+tdj AND pnh -> jrg
\ No newline at end of file
diff --git a/2024/ts/model/puzzle.ts b/2024/ts/model/puzzle.ts
index be1397d..f676041 100644
--- a/2024/ts/model/puzzle.ts
+++ b/2024/ts/model/puzzle.ts
@@ -1,14 +1,14 @@
-export interface Puzzle {
+export interface Puzzle {
day: number;
input(): TInput;
showInput(input: TInput): void;
partOne(input: TInput, debug?: boolean) : TOutput
- partTwo?(input: TInput, debug?: boolean): TOutput;
+ partTwo?(input: TInput, debug?: boolean): TSecondOutput;
resultOne(input: TInput, result: TOutput): string;
- resultTwo?(input: TInput, result: TOutput): string;
+ resultTwo?(input: TInput, result: TSecondOutput): string;
test(input: TInput) : void;
}