From ab4216488fd2cc345ac85cffc5dc7f21476e268e Mon Sep 17 00:00:00 2001 From: Alexander Vogt Date: Thu, 9 May 2024 18:54:55 +0200 Subject: [PATCH] 2016 8,9,10 --- 2016/08/task.ts | 1 - 2016/09/runner.ts | 29 ++++++++ 2016/09/task.ts | 62 ++++++++++++++++++ 2016/10/runner.ts | 29 ++++++++ 2016/10/task.ts | 164 ++++++++++++++++++++++++++++++++++++++++++++++ 2016/11/runner.ts | 29 ++++++++ 2016/11/task.ts | 162 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 2016/09/runner.ts create mode 100644 2016/09/task.ts create mode 100644 2016/10/runner.ts create mode 100644 2016/10/task.ts create mode 100644 2016/11/runner.ts create mode 100644 2016/11/task.ts diff --git a/2016/08/task.ts b/2016/08/task.ts index 4669b54..cf97e27 100644 --- a/2016/08/task.ts +++ b/2016/08/task.ts @@ -24,7 +24,6 @@ export async function taskTwo(input: string[]): Promise { } console.log(r) } - // ZJHRKCPLYJ } function perform(input: string[]) { diff --git a/2016/09/runner.ts b/2016/09/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2016/09/runner.ts @@ -0,0 +1,29 @@ +import { readFile } from "fs/promises"; +import { taskOne, taskTwo } from "./task"; + +async function main() { + let lastArgument = process.argv.pop() as string; + let taskNumber = 1; + let isTest = false; + + if (lastArgument === "test") { + isTest = true; + taskNumber = parseInt(process.argv.pop() as string); + } else { + taskNumber = parseInt(lastArgument) + } + + const fileToLoad = isTest ? "test.in" : "solve.in"; + const fileContents = await readFile(fileToLoad, "utf-8") + + const lines = fileContents.split("\n"); + + if (taskNumber === 1) { + await taskOne(lines); + } + if (taskNumber === 2) { + await taskTwo(lines); + } +} + +void main(); \ No newline at end of file diff --git a/2016/09/task.ts b/2016/09/task.ts new file mode 100644 index 0000000..fa44191 --- /dev/null +++ b/2016/09/task.ts @@ -0,0 +1,62 @@ +export async function taskOne(_input: string[]): Promise { + let len = 0 + let i = 0 + const input = _input[0].replace(' ', '') + //console.log(input) + while(i < input.length) { + if (input[i] == '(') { + let first = '' + let second = '' + i++ + while(input[i] != 'x') { + first += input[i] + i++ + } + i++ + while(input[i] != ')') { + second += input[i] + i++ + } + //console.log(input.substring(i+1), first, second, len) + len += parseInt(first) * parseInt(second) + i += parseInt(first) + //console.log(input.substring(i+1), len) + //console.log('') + } else { + len++ + } + i++ + } + console.log(len) +} + +export async function taskTwo(input: string[]): Promise { + const inp = input[0].replace(' ', '') + console.log(nested(inp)) + function nested(input: string): number { + let len = 0 + let i = 0 + while(i < input.length) { + if (input[i] == '(') { + let first = '' + let second = '' + i++ + while(input[i] != 'x') { + first += input[i] + i++ + } + i++ + while(input[i] != ')') { + second += input[i] + i++ + } + len += nested(input.substring(i+1, i+1+parseInt(first))) * parseInt(second) + i += parseInt(first) + } else { + len++ + } + i++ + } + return len + } +} \ No newline at end of file diff --git a/2016/10/runner.ts b/2016/10/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2016/10/runner.ts @@ -0,0 +1,29 @@ +import { readFile } from "fs/promises"; +import { taskOne, taskTwo } from "./task"; + +async function main() { + let lastArgument = process.argv.pop() as string; + let taskNumber = 1; + let isTest = false; + + if (lastArgument === "test") { + isTest = true; + taskNumber = parseInt(process.argv.pop() as string); + } else { + taskNumber = parseInt(lastArgument) + } + + const fileToLoad = isTest ? "test.in" : "solve.in"; + const fileContents = await readFile(fileToLoad, "utf-8") + + const lines = fileContents.split("\n"); + + if (taskNumber === 1) { + await taskOne(lines); + } + if (taskNumber === 2) { + await taskTwo(lines); + } +} + +void main(); \ No newline at end of file diff --git a/2016/10/task.ts b/2016/10/task.ts new file mode 100644 index 0000000..2dc1b85 --- /dev/null +++ b/2016/10/task.ts @@ -0,0 +1,164 @@ +export async function taskOne(input: string[]): Promise { + let maxID = 0 + input.forEach(i => { + let r = /value ([0-9]+) goes to bot ([0-9]+)/.exec(i) + if (r) { + maxID = Math.max(maxID, parseInt(r[2])) + return + } + r = /bot ([0-9]+) gives low to (bot|output) ([0-9]+) and high to (bot|output) ([0-9]+)/.exec(i) + if (r) { + maxID = Math.max(maxID, parseInt(r[1])) + if (r[2] == 'bot') maxID = Math.max(maxID, parseInt(r[3])) + if (r[4] == 'bot') maxID = Math.max(maxID, parseInt(r[5])) + return + } + throw i + }) + const numbers: [number, number][] = Array.from({length: maxID+1}, () => [-1, -1]) + const ins: Instrcution[] = Array.from({length: maxID+1}, () => [(n)=>{}, (n)=>{}]) + input.forEach(i => { + let r = /value ([0-9]+) goes to bot ([0-9]+)/.exec(i) + if (r) { + const rob = parseInt(r[2]) + addNum(rob, parseInt(r[1])) + return + } + r = /bot ([0-9]+) gives low to (bot|output) ([0-9]+) and high to (bot|output) ([0-9]+)/.exec(i) + if (r) { + const rob = parseInt(r[1]) + const a = r[2] + const b = parseInt(r[3]) + const c = r[4] + const d = parseInt(r[5]) + if (a == 'bot') { + ins[rob][0] = (n: number) => addNum(b, n) + } + if (c == 'bot') { + ins[rob][1] = (n: number) => addNum(d, n) + } + return + } + throw i + }) + + function base(lower: number, higher: number) { + if (lower == 17 && higher == 61) return true + return false + } + function addNum(rob: number, v: number) { + if(numbers[rob][0] < 0) { + numbers[rob][0] = v + } else { + numbers[rob][1] = v + } + } + + let i = 0 + + while(true) { + if (i >= numbers.length) i = 0 + try { + if (numbers[i][0] >= 0 && numbers[i][1] >= 0) { + const min = Math.min(numbers[i][0], numbers[i][1]) + const max = Math.max(numbers[i][0], numbers[i][1]) + if (base(min, max)) { + console.log(i) + break; + } + ins[i][0](min) + ins[i][1](max) + numbers[i] = [-1,-1] + } + } catch(e) { + console.log(i) + throw e + } + + i++ + } +} + +export async function taskTwo(input: string[]): Promise { + let maxID = 0 + let maxOut = 0 + input.forEach(i => { + let r = /value ([0-9]+) goes to bot ([0-9]+)/.exec(i) + if (r) { + maxID = Math.max(maxID, parseInt(r[2])) + return + } + r = /bot ([0-9]+) gives low to (bot|output) ([0-9]+) and high to (bot|output) ([0-9]+)/.exec(i) + if (r) { + maxID = Math.max(maxID, parseInt(r[1])) + if (r[2] == 'bot') maxID = Math.max(maxID, parseInt(r[3])) + else maxOut = Math.max(maxOut, parseInt(r[3])) + if (r[4] == 'bot') maxID = Math.max(maxID, parseInt(r[5])) + else maxOut = Math.max(maxOut, parseInt(r[5])) + return + } + throw i + }) + const numbers: [number, number][] = Array.from({length: maxID+1}, () => [-1, -1]) + const ins: Instrcution[] = Array.from({length: maxID+1}, () => [(n)=>{}, (n)=>{}]) + const out: number[][] = Array.from({length: maxOut+1}, ()=>[]) + input.forEach(i => { + let r = /value ([0-9]+) goes to bot ([0-9]+)/.exec(i) + if (r) { + const rob = parseInt(r[2]) + addNum(rob, parseInt(r[1])) + return + } + r = /bot ([0-9]+) gives low to (bot|output) ([0-9]+) and high to (bot|output) ([0-9]+)/.exec(i) + if (r) { + const rob = parseInt(r[1]) + const a = r[2] + const b = parseInt(r[3]) + const c = r[4] + const d = parseInt(r[5]) + if (a == 'bot') { + ins[rob][0] = (n: number) => addNum(b, n) + } else { + ins[rob][0] = (n: number) => out[b].push(n) + } + if (c == 'bot') { + ins[rob][1] = (n: number) => addNum(d, n) + } else { + ins[rob][1] = (n: number) => out[d].push(n) + } + return + } + throw i + }) + + function addNum(rob: number, v: number) { + if(numbers[rob][0] < 0) { + numbers[rob][0] = v + } else { + numbers[rob][1] = v + } + } + + let i = 0 + + while(true) { + if (i >= numbers.length) i = 0 + if (numbers[i][0] >= 0 && numbers[i][1] >= 0) { + const min = Math.min(numbers[i][0], numbers[i][1]) + const max = Math.max(numbers[i][0], numbers[i][1]) + ins[i][0](min) + ins[i][1](max) + numbers[i] = [-1,-1] + } + + if (out[0].length > 0 && out[1].length > 0 && out[2].length > 0) { + console.log(out[0][0]*out[1][0]*out[2][0]) + break + } + + i++ + } +} + +type F = (num: number) => void +type Instrcution = [F, F] diff --git a/2016/11/runner.ts b/2016/11/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2016/11/runner.ts @@ -0,0 +1,29 @@ +import { readFile } from "fs/promises"; +import { taskOne, taskTwo } from "./task"; + +async function main() { + let lastArgument = process.argv.pop() as string; + let taskNumber = 1; + let isTest = false; + + if (lastArgument === "test") { + isTest = true; + taskNumber = parseInt(process.argv.pop() as string); + } else { + taskNumber = parseInt(lastArgument) + } + + const fileToLoad = isTest ? "test.in" : "solve.in"; + const fileContents = await readFile(fileToLoad, "utf-8") + + const lines = fileContents.split("\n"); + + if (taskNumber === 1) { + await taskOne(lines); + } + if (taskNumber === 2) { + await taskTwo(lines); + } +} + +void main(); \ No newline at end of file diff --git a/2016/11/task.ts b/2016/11/task.ts new file mode 100644 index 0000000..3a1d041 --- /dev/null +++ b/2016/11/task.ts @@ -0,0 +1,162 @@ +export async function taskOne(_input: string[]): Promise { + const input = _input.map(i=> i.split("contains")[1]) + let id = 0 + let floorCount = input.length + const nameMap: Record = {} + input.forEach(i => { + if (i.includes('nothing relevant.')) return + i.split(',').forEach(j => { + let r = /a (.+) generator/.exec(j) + if (r) { + nameMap[r[1]] = id + id++ + return + } + r = /a (.+)-compatible microchip/.exec(j) + if (r) { + return + } + throw i + " | " + j + }) + }) + + const floors: boolean[][] = [] + for (let i of input) { + floors.push(Array.from({length: id*2}, ()=> false)) + } + input.forEach((i, idx) => { + if (i.includes('nothing relevant.')) return + i.split(',').forEach(j => { + let r = /a (.+) generator/.exec(j) + if (r) { + floors[idx][nameMap[r[1]]* 2] = true + return + } + r = /a (.+)-compatible microchip/.exec(j) + if (r) { + floors[idx][nameMap[r[1]]* 2 + 1] = true + return + } + throw "2 " + i + " | " + j + }) + }) + interface State { + floors: boolean[][] + e: number + steps: number + } + //debug(floors) + const Q: State[] = [{floors: copy(floors), e: 0, steps:0}] + const visited: Set = new Set() + //console.log(nameMap) + //console.log(floors) + let curMin = Infinity + while(Q.length > 0) { + const q = Q.pop() as State + if (visited.has(JSON.stringify({floors: q.floors, e: q.e}))) continue + visited.add(JSON.stringify({floors: q.floors, e: q.e})) + + // check for final + if (q.floors[floorCount-1].every(i=>i)) { + console.log(q.steps) + debug(q.floors) + if (q.steps < curMin) curMin = q.steps + continue + } + // check for validity + //if (q.steps >= curMin) continue + let validity = true + for (let f = 0; f < floorCount; f++) { + let hasRTG = false + for (let i = 0; i < q.floors[f].length*2; i+=2) { + if (q.floors[f][i]) hasRTG = true + } + if (hasRTG) { + //console.log("rtg on: ", f) + for (let i = 1; i < q.floors[f].length*2; i+=2) { + if (q.floors[f][i] && !q.floors[f][i-1]) validity = false + } + } + + } + //console.log(validity, q.e) + //debug(copy(q.floors)) + if (!validity) { + //console.log("invalid") + //debug(copy(q.floors)) + continue + } else { + //console.log("valid", q.e) + //debug(copy(q.floors)) + } + + + for (let i = 0; i < q.floors[q.e].length; i++) { + if (!q.floors[q.e][i]) continue + let moveP = copy(q) + let moveM = copy(q) + moveP.e++ + moveM.steps++ + moveP.steps++ + moveM.e-- + if (moveM.e >= 0) { + moveM.floors[q.e][i] = false + moveM.floors[q.e-1][i] = true + //console.log("M1", moveM) + Q.push(moveM) + } + if (moveP.e < floorCount) { + moveP.floors[q.e][i] = false + moveP.floors[q.e+1][i] = true + // console.log("P1",i, moveP, q.e) + Q.push(moveP) + //console.log(Q) + } + } + + + for (let i = 0; i < q.floors[q.e].length; i++) { + if (!q.floors[q.e][i]) continue + for (let j = i+1; j < q.floors[q.e].length; j++) { + if (!q.floors[q.e][j]) continue + let moveP = copy(q) + let moveM = copy(q) + moveP.e++ + moveM.e-- + moveM.steps++ + moveP.steps++ + if (moveM.e >= 0) { + moveM.floors[q.e][i] = false + moveM.floors[q.e-1][i] = true + moveM.floors[q.e][j] = false + moveM.floors[q.e-1][j] = true + // console.log("M2", moveM) + Q.push(moveM) + } + if (moveP.e < floorCount) { + //debug(moveP.floors) + moveP.floors[q.e][i] = false + moveP.floors[q.e+1][i] = true + moveP.floors[q.e][j] = false + moveP.floors[q.e+1][j] = true + // console.log("P2", moveP) + Q.push(moveP) + } + } + } + } + console.log(curMin) +} + +export async function taskTwo(input: string[]): Promise { + console.log("Unimplemented"); +} + +function copy(s: T): T { + return JSON.parse(JSON.stringify(s)) +} + +function debug(arr: boolean[][]) { + copy(arr).reverse().forEach(i => console.log(i.map(b => b?'#':'.').join(''))) + console.log("") +} \ No newline at end of file