diff --git a/2015/17/runner.ts b/2015/17/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2015/17/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/2015/17/task.ts b/2015/17/task.ts new file mode 100644 index 0000000..dd722ff --- /dev/null +++ b/2015/17/task.ts @@ -0,0 +1,26 @@ +const W = 150 + +export async function taskOne(input: string[]): Promise { + const w = input.map(Number); + console.log(next(w, 0, 0)); + + function next(w: number[], i: number, s: number): number { + if (s > W) return 0 + if (i === w.length) return s == W ? 1 : 0; + + return next(w, i + 1, s + w[i]) + next(w, i + 1, s); + } +} + +export async function taskTwo(input: string[]): Promise { + const w = input.map(Number); + console.log(next(w, 0, 0, 0)); + + function next(w: number[], i: number, s: number, c: number): number { + if (s > W) return Infinity + if (i === w.length) return s == W ? c : Infinity; + + return Math.min(next(w, i + 1, s + w[i], c+1), next(w, i + 1, s, c)); + } +} + diff --git a/2015/18/runner.ts b/2015/18/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2015/18/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/2015/18/task.ts b/2015/18/task.ts new file mode 100644 index 0000000..9b980ea --- /dev/null +++ b/2015/18/task.ts @@ -0,0 +1,78 @@ +const SIZE = 100; +const g = Array.from({length:101}, () => Array.from({length: SIZE + 2}, () => Array.from({length: SIZE + 2}, () => false))) + +export async function taskOne(input: string[]): Promise { + parse(input) + + for (let s = 0; s < 100; s++) { + for (let x = 1; x <= SIZE; x++) { + for (let y = 1; y <= SIZE; y++) { + step(x,y,s) + } + } + } + let c = 0 + for (let x = 1; x <= SIZE; x++) { + for (let y = 1; y <= SIZE; y++) { + if (g[100][x][y]) c++ + } + } + console.log(c) + + + function step(x: number, y: number, t: number) { + let c = 0 + for (let dx = -1; dx <= 1; dx++) { + for (let dy = -1; dy <= 1; dy++) { + if (dx == 0 && dy == 0) continue + if(g[t][x+dx][y+dy]) c++ + } + } + g[t+1][x][y] = g[t][x][y] && (c==2 || c==3) || !g[t][x][y] && c==3 + } +} + +export async function taskTwo(input: string[]): Promise { + parse(input) + + for (let s = 0; s < 100; s++) { + for (let x = 1; x <= SIZE; x++) { + for (let y = 1; y <= SIZE; y++) { + step(x,y,s) + } + } + } + let c = 0 + for (let x = 1; x <= SIZE; x++) { + for (let y = 1; y <= SIZE; y++) { + if (g[100][x][y]) c++ + } + } + console.log(c) + + + function step(x: number, y: number, t: number) { + if (x==1 || x == SIZE) { + if(y == 1 || y == SIZE) { + g[t+1][x][y] = true + return + } + } + let c = 0 + for (let dx = -1; dx <= 1; dx++) { + for (let dy = -1; dy <= 1; dy++) { + if (dx == 0 && dy == 0) continue + if(g[t][x+dx][y+dy]) c++ + } + } + g[t+1][x][y] = g[t][x][y] && (c==2 || c==3) || !g[t][x][y] && c==3 + } +} + +function parse(input: string[]) { + for (let x = 1; x <= SIZE; x++) { + for (let y = 1; y <= SIZE; y++) { + g[0][x][y] = input[x-1][y-1] == '#' + } + } +} \ No newline at end of file diff --git a/2015/19/runner.ts b/2015/19/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2015/19/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/2015/19/task.ts b/2015/19/task.ts new file mode 100644 index 0000000..ffe9e2f --- /dev/null +++ b/2015/19/task.ts @@ -0,0 +1,59 @@ +import { Stack, Queue } from '../../base/simpleStructure' + +const M: Record = {} +const P: Prod[] = [] + +export async function taskOne(input: string[]): Promise { + parse(input) + + const initial = input[input.length-1] + const S: Set = new Set() + for (let i = 0; i < initial.length; i++) { + const o1 = initial[i] + const o2 = initial[i] + initial[i+1] + //console.log(i, o1, o2) + if (M[o1]) for (let j = 0; j < M[o1].length; j++) S.add(rep(o1, M[o1][j], i, initial)) + + if (M[o2]) for (let j = 0; j < M[o2].length; j++) S.add(rep(o2, M[o2][j], i,initial)) + //console.log(S) + } + console.log(S.size) + + +} + +export async function taskTwo(input: string[]): Promise { + parse(input) + const GOAL = input[input.length-1] + + let cur = GOAL + let c = 0 + while(cur != 'e') { + c++ + for (const p of P) { + if (cur.includes(p.g)) { + cur = cur.replace(p.g, p.s) + break; + } + } + } + console.log(c) + +} + +function parse(input: string[]) { + input.slice(0, input.length-2).forEach(i => { + const r = /([A-Za-z]+) => ([A-Za-z]+)/.exec(i) + if (!r) throw i + if(!M[r[1]]) M[r[1]] = [] + M[r[1]].push(r[2]) + P.push({g:r[2], s: r[1]}) + }) + P.sort((a,b) => b.g.length-a.g.length) +} + +interface Prod { g: string, s: string } + +function rep(o: string, r: string, i:number, rep: string) { + return rep.substring(0,i) + rep.substring(i).replace(o, r) +} \ No newline at end of file diff --git a/2015/20/runner.ts b/2015/20/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2015/20/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/2015/20/task.ts b/2015/20/task.ts new file mode 100644 index 0000000..44d2c73 --- /dev/null +++ b/2015/20/task.ts @@ -0,0 +1,57 @@ +export async function taskOne(input: string[]): Promise { + const GOAL = parseInt(input[0]) / 10 + + const primes: number[] = [2,3,5,7] + let i = 2; + console.log(val(4)) + //for (let i = 2; i <= 120; i++) + // console.log(i, val(i)) + while(val(i) < GOAL) { + if (i % 1000 == 0) { + } + i++; + } + console.log(i) + + function val(nu: number) { + let n = nu + let s = 1 + for (const p of primes) { + if (n % p == 0) { + let i = 1 + let j = 0 + while(n % p == 0) { + j += i + i *= p + n /= p + } + j += i + s *= j + } + } + if (s == 1) { + primes.push(n) + return (1+n) + } + return s + } +} + +export async function taskTwo(input: string[]): Promise { + const GOAL = parseInt(input[0]) / 11 + const MAX = Math.ceil(GOAL) + + const A = Array.from({length: Math.ceil(MAX)}, ()=>0) + + for (let i = 1; i <= MAX; i++) { + for (let j = 1; j <= 50; j++) { + if (i * j >= MAX) break; + A[i*j] += i + } + if(A[i] > GOAL) { + console.log(i) + return + } + } + +} \ No newline at end of file diff --git a/2015/21/runner.ts b/2015/21/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2015/21/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/2015/21/task.ts b/2015/21/task.ts new file mode 100644 index 0000000..48578ab --- /dev/null +++ b/2015/21/task.ts @@ -0,0 +1,82 @@ +const Weapons = [ + {c:8,a:4,d:0}, + {c:10,a:5,d:0}, + {c:25,a:6,d:0}, + {c:40,a:7,d:0}, + {c:74,a:8,d:0} +] +const Armor = [ + {c:0,d:0,a:0}, + {c:13,d:1,a:0}, + {c:31,d:2,a:0}, + {c:53,d:3,a:0}, + {c:75,d:4,a:0}, + {c:102,d:5,a:0} +] + +const Rings = [ + {c:0,d:0,a:0}, + {c:0,d:0,a:0}, + {c:25,a:1,d:0}, + {c:50,a:2,d:0}, + {c:100,a:3,d:0}, + {c:20,d:1,a:0}, + {c:40,d:2,a:0}, + {c:80,d:3,a:0} +] + +export async function taskOne(input: string[]): Promise { + let min = Infinity + for (let w = 0; w < Weapons.length; w++) { + for (let a = 0; a < Armor.length; a++) { + for (let r1 = 0; r1 < Rings.length; r1++) { + for (let r2 = r1+1; r2 < Rings.length; r2++) { + if (sim([w,a,r1,r2], input)) { + let s = Weapons[w].c + Armor[a].c + Rings[r1].c + Rings[r2].c + if (s < min) min = s + } + } + } + } + } + console.log(min) +} + +export async function taskTwo(input: string[]): Promise { + let max = 0 + for (let w = 0; w < Weapons.length; w++) { + for (let a = 0; a < Armor.length; a++) { + for (let r1 = 0; r1 < Rings.length; r1++) { + for (let r2 = r1+1; r2 < Rings.length; r2++) { + if (!sim([w,a,r1,r2], input)) { + let s = Weapons[w].c + Armor[a].c + Rings[r1].c + Rings[r2].c + if (s > max) max = s + } + } + } + } + } + console.log(max) +} + +function sim(s: [number, number, number, number], input: string[]) { + let health = parseInt(input[0].substring(12)) + let damage = parseInt(input[1].substring(8)) - Armor[s[1]].d - Rings[s[2]].d - Rings[s[3]].d + damage = Math.max(1, damage) + const armor = parseInt(input[2].substring(7)) + + let player = 100 + let playerDamage = Weapons[s[0]].a + Rings[s[2]].a + Rings[s[3]].a - armor + playerDamage = Math.max(1, playerDamage) + while(player > 0 && health > 0) { + health -= playerDamage + player -= damage + } + return health <= 0 +} + +interface Stat { + a: number, + d: number, + c: number +} \ No newline at end of file diff --git a/2015/22/runner.ts b/2015/22/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2015/22/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/2015/22/task.ts b/2015/22/task.ts new file mode 100644 index 0000000..8e0d27d --- /dev/null +++ b/2015/22/task.ts @@ -0,0 +1,37 @@ +export async function taskOne(input: string[]): Promise { + +} + +export async function taskTwo(input: string[]): Promise { + console.log("Unimplemented"); +} + +interface Player { + shields: number[] + poisons: number[] + recharges: number[], + health: number + mana: number +} + +function step(p: Player, h: number, d: number): number { + if (h <= 0) return 0 + if (p.health <= 0) return Infinity + + p.poisons=p.poisons.map(i=>i-1).filter(i=>i>=0) + p.recharges=p.recharges.map(i=>i-1).filter(i=>i>=0) + p.shields=p.shields.map(i=>i-1).filter(i=>i>=0) + p.health -= Math.max(1, d-p.shields.length*7) + p.mana += 101*p.recharges.length + + const mmP = copy(p) + mmP.mana -= 53 + const mm = 53 + step(mmP, h-4, d) + + const dP = copy(p) + dP.mana -= 73 +} + +function copy(p:Player): Player { + return JSON.parse(JSON.stringify(p)) +} \ No newline at end of file diff --git a/base/simpleStructure.ts b/base/simpleStructure.ts index 5387783..9d3eec9 100644 --- a/base/simpleStructure.ts +++ b/base/simpleStructure.ts @@ -58,6 +58,7 @@ class Queue { if (!this._head) throw "Empty Queue" const r = this._head.val this._head = this._head.next + if(!this._head) this._tail = undefined return r }