From f2407a95879e8b30cb59c3f76afbc0664c7f4038 Mon Sep 17 00:00:00 2001 From: specCon18 Date: Wed, 15 May 2024 16:59:36 -0400 Subject: [PATCH] upload to gh --- .direnv/flake-profile | 1 + .direnv/flake-profile-1-link | 1 + .envrc | 1 + .jest.config.json | 2 +- flake.lock | 61 +++++++++++++++++ flake.nix | 24 +++++++ package.json | 6 +- src/day1/ArrayList.ts | 27 ++++++++ src/day1/BFSGraphMatrix.ts | 39 +++++++++++ src/day1/BTBFS.ts | 16 +++++ src/day1/BTInOrder.ts | 16 +++++ src/day1/BTPostOrder.ts | 16 +++++ src/day1/BTPreOrder.ts | 18 +++++ src/day1/BinarySearchList.ts | 17 +++++ src/day1/BubbleSort.ts | 11 +++ src/day1/CompareBinaryTrees.ts | 12 ++++ src/day1/DFSGraphList.ts | 35 ++++++++++ src/day1/DFSOnBST.ts | 15 +++++ src/day1/DijkstraList.ts | 47 +++++++++++++ src/day1/DoublyLinkedList.ts | 116 ++++++++++++++++++++++++++++++++ src/day1/LRU.ts | 91 +++++++++++++++++++++++++ src/day1/LinearSearchList.ts | 8 +++ src/day1/Map.ts | 21 ++++++ src/day1/MazeSolver.ts | 51 ++++++++++++++ src/day1/MinHeap.ts | 74 ++++++++++++++++++++ src/day1/Queue.ts | 46 +++++++++++++ src/day1/QuickSort.ts | 27 ++++++++ src/day1/SinglyLinkedList.ts | 27 ++++++++ src/day1/Stack.ts | 41 ++++++++++++ src/day1/Trie.ts | 18 +++++ src/day1/TwoCrystalBalls.ts | 16 +++++ tsconfig.json | 4 +- yarn.lock | 119 ++++++++++++--------------------- 33 files changed, 941 insertions(+), 83 deletions(-) create mode 120000 .direnv/flake-profile create mode 120000 .direnv/flake-profile-1-link create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 src/day1/ArrayList.ts create mode 100644 src/day1/BFSGraphMatrix.ts create mode 100644 src/day1/BTBFS.ts create mode 100644 src/day1/BTInOrder.ts create mode 100644 src/day1/BTPostOrder.ts create mode 100644 src/day1/BTPreOrder.ts create mode 100644 src/day1/BinarySearchList.ts create mode 100644 src/day1/BubbleSort.ts create mode 100644 src/day1/CompareBinaryTrees.ts create mode 100644 src/day1/DFSGraphList.ts create mode 100644 src/day1/DFSOnBST.ts create mode 100644 src/day1/DijkstraList.ts create mode 100644 src/day1/DoublyLinkedList.ts create mode 100644 src/day1/LRU.ts create mode 100644 src/day1/LinearSearchList.ts create mode 100644 src/day1/Map.ts create mode 100644 src/day1/MazeSolver.ts create mode 100644 src/day1/MinHeap.ts create mode 100644 src/day1/Queue.ts create mode 100644 src/day1/QuickSort.ts create mode 100644 src/day1/SinglyLinkedList.ts create mode 100644 src/day1/Stack.ts create mode 100644 src/day1/Trie.ts create mode 100644 src/day1/TwoCrystalBalls.ts diff --git a/.direnv/flake-profile b/.direnv/flake-profile new file mode 120000 index 0000000..0c05709 --- /dev/null +++ b/.direnv/flake-profile @@ -0,0 +1 @@ +flake-profile-1-link \ No newline at end of file diff --git a/.direnv/flake-profile-1-link b/.direnv/flake-profile-1-link new file mode 120000 index 0000000..3964edc --- /dev/null +++ b/.direnv/flake-profile-1-link @@ -0,0 +1 @@ +/nix/store/lwrqfng58d909d1vkpk0m14pq1qlgfr0-nix-shell-env \ No newline at end of file diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.jest.config.json b/.jest.config.json index bc89bfe..e6cbbbe 100644 --- a/.jest.config.json +++ b/.jest.config.json @@ -2,7 +2,7 @@ "clearMocks": true, "moduleNameMapper": { "@code/(.*)": [ - "/src/day2/$1" + "/src/day1/$1" ] }, "preset": "ts-jest" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..10002d2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1714912032, + "narHash": "sha256-clkcOIkg8G4xuJh+1onLG4HPMpbtzdLv4rHxFzgsH9c=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ee4a6e0f566fe5ec79968c57a9c2c3c25f2cf41d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..2552d02 --- /dev/null +++ b/flake.nix @@ -0,0 +1,24 @@ +{ + description = "A js development environment"; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { + inherit system; + overlays = []; + }; + in + { + devShell = pkgs.mkShell { + buildInputs = [ + pkgs.nodejs_22 + pkgs.yarn + ]; + }; + }); +} diff --git a/package.json b/package.json index 6ecfe4a..887edff 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,13 @@ "typescript": "^4.7.4" }, "scripts": { - "test": "jest PrimsList", + "test": "jest DFSOnBST LRU LinearSearchList BinarySearchList TwoCrystalBalls BubbleSort SinglyLinkedList DoublyLinkedList Queue Stack ArrayList MazeSolver QuickSort BTPreOrder BTInOrder BTPostOrder BTBFS CompareBinaryTrees DFSOnBST DFSGraphList Trie BFSGraphMatrix Map MinHeap", "clear": "node ./scripts/clear.js", "prettier": "prettier --write ./src", "generate": "node ./scripts/generate.js", - "day": "echo src/day4" + "day": "echo src/day1" }, "devDependencies": { "@swc-node/register": "^1.6.7" } -} +} \ No newline at end of file diff --git a/src/day1/ArrayList.ts b/src/day1/ArrayList.ts new file mode 100644 index 0000000..febed2f --- /dev/null +++ b/src/day1/ArrayList.ts @@ -0,0 +1,27 @@ +export default class ArrayList { + public length: number; + + + + constructor() { + } + + prepend(item: T): void { + +} + insertAt(item: T, idx: number): void { + +} + append(item: T): void { + +} + remove(item: T): T | undefined { + +} + get(idx: number): T | undefined { + +} + removeAt(idx: number): T | undefined { + +} +} \ No newline at end of file diff --git a/src/day1/BFSGraphMatrix.ts b/src/day1/BFSGraphMatrix.ts new file mode 100644 index 0000000..052cb74 --- /dev/null +++ b/src/day1/BFSGraphMatrix.ts @@ -0,0 +1,39 @@ +export default function bfs( + graph: WeightedAdjacencyMatrix, + source: number, + needle: number): number[] | null { + const seen = new Array(graph.length).fill(false); + const prev = new Array(graph.length).fill(-1); + seen[source] = true; + const q:number[] = [source]; + do{ + const curr = q.shift() as number; + if(curr === needle){ + break; + } + const adjs = graph[curr]; + for(let i = 0; i < adjs.length; ++i){ + if(adjs[i] === 0){ + continue; + } + if(seen[i]){ + continue; + } + seen[i] = true; + prev[i] = curr; + q.push(i); + } + seen[curr] = true; + } while(q.length); + //build it backwards + if(prev[needle] === -1){ + return null; + } + let curr = needle; + const out: number[] = []; + while(prev[curr] !== -1){ + out.push(curr); + curr = prev[curr]; + } + return [source].concat(out.reverse()); +} diff --git a/src/day1/BTBFS.ts b/src/day1/BTBFS.ts new file mode 100644 index 0000000..fc13322 --- /dev/null +++ b/src/day1/BTBFS.ts @@ -0,0 +1,16 @@ +export default function bfs(head: BinaryNode, needle: number): boolean { + const q: (BinaryNode|null)[] = [head]; + while(q.length){ + const curr = q.shift() as BinaryNode | undefined | null; + + if(!curr){ + continue; + } + if (curr.value === needle){ + return true; + } + q.push(curr.left); + q.push(curr.right); + } + return false; +} diff --git a/src/day1/BTInOrder.ts b/src/day1/BTInOrder.ts new file mode 100644 index 0000000..cf9dbd6 --- /dev/null +++ b/src/day1/BTInOrder.ts @@ -0,0 +1,16 @@ +function walk(curr:BinaryNode | null, path:number[]): number[]{ + //Base Case + if(!curr){ + return path; + } + //Recurse + walk(curr.left, path); + path.push(curr.value); + walk(curr.right, path); + //Post + return path; +} + +export default function in_order_search(head: BinaryNode): number[] { + return walk(head,[]); +} diff --git a/src/day1/BTPostOrder.ts b/src/day1/BTPostOrder.ts new file mode 100644 index 0000000..3335f6c --- /dev/null +++ b/src/day1/BTPostOrder.ts @@ -0,0 +1,16 @@ +function walk(curr:BinaryNode | null, path:number[]): number[]{ + //Base Case + if(!curr){ + return path; + } + //Recurse + walk(curr.left, path); + walk(curr.right, path); + //Post + path.push(curr.value); + return path; +} + +export default function post_order_search(head: BinaryNode): number[] { + return walk(head,[]); +} diff --git a/src/day1/BTPreOrder.ts b/src/day1/BTPreOrder.ts new file mode 100644 index 0000000..c712ee5 --- /dev/null +++ b/src/day1/BTPreOrder.ts @@ -0,0 +1,18 @@ +function walk(curr:BinaryNode | null, path:number[]): number[]{ + //Base Case + if(!curr){ + return path; + } + //Pre + path.push(curr.value); + //Recurse + walk(curr.left, path); + walk(curr.right, path); + //Post + return path; +} + +export default function pre_order_search(head: BinaryNode): number[] { + return walk(head,[]); +} + diff --git a/src/day1/BinarySearchList.ts b/src/day1/BinarySearchList.ts new file mode 100644 index 0000000..607068e --- /dev/null +++ b/src/day1/BinarySearchList.ts @@ -0,0 +1,17 @@ +export default function bs_list(haystack: number[], needle: number): boolean { + let low = 0; + let high = haystack.length; + + do{ + const midpoint = Math.floor(low+(high-low)/2); + const value = haystack[midpoint]; + if (value === needle) { + return true; + }else if(value > needle) { + high = midpoint; + }else { + low = midpoint + 1; + }; + }while(lowarr[j+1]){ + const tmp = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = tmp; + } + } + } +} diff --git a/src/day1/CompareBinaryTrees.ts b/src/day1/CompareBinaryTrees.ts new file mode 100644 index 0000000..9f4d169 --- /dev/null +++ b/src/day1/CompareBinaryTrees.ts @@ -0,0 +1,12 @@ +export default function compare(a: BinaryNode | null, b: BinaryNode | null): boolean { + if(a === null && b === null){ + return true; + } + if(a === null || b === null){ + return false; + } + if(a.value != b.value){ + return false; + } + return compare(a.left,b.left) && compare(a.right,b.right); +} diff --git a/src/day1/DFSGraphList.ts b/src/day1/DFSGraphList.ts new file mode 100644 index 0000000..6e9c2ba --- /dev/null +++ b/src/day1/DFSGraphList.ts @@ -0,0 +1,35 @@ +function walk(graph: WeightedAdjacencyList, curr:number,needle:number, seen: boolean[], path: number[]):boolean{ + if(seen[curr]){ + return false; + } + seen[curr] = true; + //recursion time + //pre + path.push(curr); + if(curr===needle){ + return true; + } + //recurse + const list = graph[curr]; + for(let i = 0; i < list.length; ++i){ + const edge = list[i]; + if(walk(graph, edge.to, needle, seen, path )){ + return true; + } + } + //post + path.pop(); + return false; +} +export default function dfs( + graph: WeightedAdjacencyList, + source: number, + needle: number): number[] | null { + const seen: boolean[] = new Array(graph.length).fill(false); + const path: number[] = []; + walk(graph,source, needle, seen, path); + if (path.length === 0){ + return null; + } + return path; +} diff --git a/src/day1/DFSOnBST.ts b/src/day1/DFSOnBST.ts new file mode 100644 index 0000000..e6f666e --- /dev/null +++ b/src/day1/DFSOnBST.ts @@ -0,0 +1,15 @@ +function search(curr: BinaryNode|null, needle:number):boolean { + if(!curr){ + return false; + } + if(curr.value === needle){ + return true; + } + if(curr.value < needle){ + return search(curr.right,needle); + } + return search(curr.left,needle); +} +export default function dfs(head: BinaryNode, needle: number): boolean { + return search(head, needle); +} diff --git a/src/day1/DijkstraList.ts b/src/day1/DijkstraList.ts new file mode 100644 index 0000000..1056684 --- /dev/null +++ b/src/day1/DijkstraList.ts @@ -0,0 +1,47 @@ +function hasUnvisited(seen:boolean[],dists:number[]): boolean{ + return seen.some((s,i) => !s && dists[i] < Infinity); +} +function getLowestUnvisited(seen:boolean[],dists:number[]): number{ + let idx = -1; + let lowestDistance = Infinity; + for(let i = 0; i < seen.length; ++i){ + if(seen[i]){ + continue; + } + if (lowestDistance > dists[i]){ + lowestDistance = dists[i] + idx = i; + } + } + return idx; +} +export default function dijkstra_list(source: number, sink:number, arr:WeightedAdjacencyList):number[]{ + const seen = new Array(arr.length).fill(false); + const prev = new Array(arr.length).fill(-1); + const dists = new Array(arr.length).fill(Infinity); + dists[source] = 0; + while(hasUnvisited(seen,dists)){ + const curr = getLowestUnvisited(seen,dists); + seen[curr] = true; + const adjs = arr[curr]; + for(let i = 0; i < adjs.length; ++i){ + const edge = adjs[i]; + if(seen[edge.to]){ + continue; + } + const dist = dists[curr] + edge.weight; + if (dist < dists[edge.to]){ + dists[edge.to] = dist; + prev[edge.to] = curr; + } + } + } + const out: number[] = []; + let curr = sink; + while(prev[curr] !== -1){ + out.push(curr); + curr = prev[curr]; + } + out.push(source); + return out.reverse(); +} diff --git a/src/day1/DoublyLinkedList.ts b/src/day1/DoublyLinkedList.ts new file mode 100644 index 0000000..31277a6 --- /dev/null +++ b/src/day1/DoublyLinkedList.ts @@ -0,0 +1,116 @@ +type Node = { + value:T, + prev?: Node, + next?: Node +} +export default class DoublyLinkedList { + public length: number; + private head?: Node; + private tail?: Node; + + constructor() { + this.length = 0; + this.head = undefined; + this.tail = undefined; + } + + prepend(item: T): void { + const node = {value:item} as Node; + this.length++; + if(!this.head){ + this.head = this.tail = node; + return; + } + node.next = this.head; + this.head.prev = node; + this.head = node; + + } + insertAt(item: T, idx: number): void { + if(idx > this.length){ + throw new Error("Oh No Cannot insert outside of list"); + } + if(idx === this.length){ + this.append(item); + return; + }else if(idx === 0){ + this.prepend(item); + return; + } + this.length++; + const curr = this.getAt(idx) as Node; + const node = {value:item} as Node; + node.next = curr; + node.prev = curr.prev; + curr.next = node; + if(node.prev){ + node.prev.next = node; + } + } + append(item: T): void { + this.length++; + const node = {value:item} as Node; + if(!this.tail){ + this.head = this.tail = node; + return; + } + node.prev = this.tail; + this.tail.next = node; + this.tail = node; + } + // Could be improved by hash map to node values so that lookup is instant; + remove(item: T): T | undefined { + let curr = this.head; + for(let i = 0; curr && i < this.length; ++i){ + //weve found the item + if(curr.value === item){ + break; + } + curr = curr.next; + } + //if no curr then theres no item to remove + if(!curr){ + return undefined; + } + return this.removeNode(curr); + } + get(idx: number): T | undefined { + return this.getAt(idx)?.value; + } + private getAt(idx:number): Node | undefined { + let curr = this.head; + for(let i = 0; curr && i < idx; ++i){ + curr = curr.next; + } + return curr; + }; + private removeNode(node:Node):T | undefined{ + this.length--; + if(this.length === 0){ + const out = this.head?.value; + this.head = this.tail = undefined; + return out; + } + if(node.prev){ + node.prev.next = node.next; + } + if(node.next){ + node.next.prev = node.prev; + } + if(node === this.head){ + this.head = node.next; + } + if(node === this.tail){ + this.tail = node.prev; + } + node.prev = node.next = undefined; + return node.value; + } + removeAt(idx: number): T | undefined { + const node = this.getAt(idx); + if(!node){ + return undefined; + } + return this.removeNode(node); + } +} diff --git a/src/day1/LRU.ts b/src/day1/LRU.ts new file mode 100644 index 0000000..7f81a0b --- /dev/null +++ b/src/day1/LRU.ts @@ -0,0 +1,91 @@ +type Node = { + value:T + next?:Node + prev?:Node +} +function createNode(value:V): Node{ + return {value}; +} +export default class LRU { + private length: number; + private head?: Node; + private tail?: Node; + + private lookup: Map>; + private reverseLookup: Map,K>; + constructor(private capacity:number = 10) { + this.length = 0; + this.head = this.tail = undefined; + this.lookup = new Map>(); + this.reverseLookup = new Map,K>(); + } + + update(key: K, value: V): void { + // Does the cache exist + let node = this.lookup.get(key); + if(!node){ + node = createNode(value); + this.length++; + this.prepend(node); + this.trimCache(); + this.lookup.set(key,node); + this.reverseLookup.set(node,key); + } else { + this.detach(node); + this.prepend(node); + node.value = value; + } + // if it doesn't we need to insert + // check capcacity and evict least used if over capacity + // if it does we need to update to the front of the list and update the value + } + get(key: K): V | undefined { + // Check that the cache exists + const node = this.lookup.get(key); + if(!node){ + return undefined; + } + // Update the value we found and move it to the front + this.detach(node); + this.prepend(node); + // Return the value found or undefined if it doesnt exist + return node.value; + } + private detach(node: Node){ + if(node.prev){ + node.prev.next = node.next; + } + if(node.next){ + node.next.prev = node.prev; + } + //So we dont cut off our own head + if(this.head === node){ + this.head = this.head.next; + } + if(this.tail === node){ + this.tail = this.tail.prev; + } + node.next = undefined; + node.prev = undefined; + } + private prepend(node:Node){ + if(!this.head){ + this.head = this.tail = node; + return; + } + node.next = this.head; + this.head.prev = node; + this.head = node; + } + private trimCache():void { + if(this.length <= this.capacity){ + return; + } + const tail = this.tail as Node; + this.detach(this.tail as Node); + const key = this.reverseLookup.get(tail) as K; + this.lookup.delete(key); + this.reverseLookup.delete(tail); + this.length--; + } +} diff --git a/src/day1/LinearSearchList.ts b/src/day1/LinearSearchList.ts new file mode 100644 index 0000000..6f8d3bd --- /dev/null +++ b/src/day1/LinearSearchList.ts @@ -0,0 +1,8 @@ +export default function linear_search(haystack: number[], needle: number): boolean { + for (let i:number = 0; i < haystack.length; ++i){ + if (haystack[i] === needle){ + return true; + } + } + return false; +} diff --git a/src/day1/Map.ts b/src/day1/Map.ts new file mode 100644 index 0000000..1c53484 --- /dev/null +++ b/src/day1/Map.ts @@ -0,0 +1,21 @@ +export default class Map { + + + + + constructor() { + } + + get(key: T): V | undefined { + +} + set(key: T, value: V): void { + +} + delete(key: T): V | undefined { + +} + size(): number { + +} +} \ No newline at end of file diff --git a/src/day1/MazeSolver.ts b/src/day1/MazeSolver.ts new file mode 100644 index 0000000..997cb6b --- /dev/null +++ b/src/day1/MazeSolver.ts @@ -0,0 +1,51 @@ +const dir = [ + [-1,0],//left + [1,0],//right + [0,-1],//down + [0,1],//up +]; + +function walk(maze:string[], wall: string, curr: Point, end:Point, seen:boolean[][],path:Point[]):boolean{ + //base case off map + if(curr.x < 0 || curr.x > maze[0].length || curr.y < 0 || curr.y >= maze.length){ + return false; + }; + if(maze[curr.y][curr.x] === wall){ + return false; + }; + if (curr.x === end.x && curr.y === end.y){ + path.push(end) + return true; + }; + if (seen[curr.y][curr.x]){ + return false + } + //pre + seen[curr.y][curr.x] = true; + path.push(curr) + //recurse + for(let i = 0; i< dir.length; i++){ + + const [x,y] = dir[i] + if (walk(maze,wall,{ + x: curr.x+x, + y: curr.y+y, + },end,seen,path)){ + return true; + }; + + } + //post + path.pop() + return false; +}; + +export default function solve(maze: string[], wall: string, start: Point, end: Point): Point[] { + const seen:boolean[][] = []; + const path:Point[] = []; + for (let i = 0; i < maze.length; ++i){ + seen.push(new Array(maze[0].length).fill(false)); + } + walk(maze,wall,start,end,seen,path); + return path; +} diff --git a/src/day1/MinHeap.ts b/src/day1/MinHeap.ts new file mode 100644 index 0000000..b24eadb --- /dev/null +++ b/src/day1/MinHeap.ts @@ -0,0 +1,74 @@ +export default class MinHeap { + public length: number; + private data: number[]; + + + constructor() { + this.data = []; + this.length = 0; + + } + + insert(value: number): void { + this.data[this.length] = value; + this.heapifyUp(this.length); + this.length++; + } + delete(): number { + if(this.length === 0){ + return -1; + } + const out = this.data[0]; + this.length--; + if(this.length === 0){ + this.data = []; + return out; + } + this.data[0] = this.data[this.length]; + this.heapifyDown(0); + return out; + } + + private heapifyDown(idx:number):void{ + const lIdx = this.leftChild(idx); + const rIdx = this.rightChild(idx); + if(idx >= this.length || lIdx >= this.length){ + return; + } + const lV = this.data[lIdx]; + const rV = this.data[rIdx]; + const v = this.data[idx]; + if(lV > rV && v > rV){ + this.data[idx] = rV; + this.data[rIdx] = v; + this.heapifyDown(rIdx); + } else if(rV > lV && v > lV){ + this.data[idx] = lV; + this.data[lIdx] = v; + this.heapifyDown(lIdx); + } + const minValue = this + } + private heapifyUp(idx:number):void{ + if(idx === 0){ + return; + } + const p = this.parent(idx); + const parenV = this.data[p]; + const v = this.data[idx]; + if(parenV > v){ + this.data[idx] = parenV; + this.data[p] = v; + this.heapifyUp(p); + } + } + private parent(idx:number):number{ + return Math.floor((idx - 1)/2); + } + private leftChild(idx:number):number{ + return 2*idx+1; + } + private rightChild(idx:number):number{ + return 2*idx+2; + } +} diff --git a/src/day1/Queue.ts b/src/day1/Queue.ts new file mode 100644 index 0000000..828a5ed --- /dev/null +++ b/src/day1/Queue.ts @@ -0,0 +1,46 @@ +type Node = { + value: T, + next?: Node, +}; + +export default class Queue { + public length: number; + private head?: Node; + private tail?: Node; + + constructor() { + this.head = this.tail = undefined; + this.length = 0; + } + + enqueue(item: T): void { + const node = {value: item} as Node; + this.length++; + if(!this.tail) { + this.tail = this.head = node; + return; + }; + this.tail.next = node; + this.tail = node; + } + + deque(): T | undefined { + if(!this.head) { + return undefined; + } + this.length--; + const head = this.head; + this.head = this.head.next; + + //free memory + head.next = undefined; + if (this.length === 0){ + this.tail = undefined; + } + return head.value; + } + + peek(): T | undefined { + return this.head?.value; + } +} diff --git a/src/day1/QuickSort.ts b/src/day1/QuickSort.ts new file mode 100644 index 0000000..74e6232 --- /dev/null +++ b/src/day1/QuickSort.ts @@ -0,0 +1,27 @@ +function partition(arr:number[],lo:number,high:number):number{ + const pivot = arr[high]; + let idx = lo-1; + for(let i = lo; i= high){ + return; + } + const pivotIdx = partition(arr,lo,high); + qs(arr, lo, pivotIdx - 1); + qs(arr, pivotIdx + 1, high); +} +export default function quick_sort(arr: number[]): void { + qs(arr, 0, arr.length - 1); +} diff --git a/src/day1/SinglyLinkedList.ts b/src/day1/SinglyLinkedList.ts new file mode 100644 index 0000000..3d94b11 --- /dev/null +++ b/src/day1/SinglyLinkedList.ts @@ -0,0 +1,27 @@ +export default class SinglyLinkedList { + public length: number; + + + + constructor() { + } + + prepend(item: T): void { + +} + insertAt(item: T, idx: number): void { + +} + append(item: T): void { + +} + remove(item: T): T | undefined { + +} + get(idx: number): T | undefined { + +} + removeAt(idx: number): T | undefined { + +} +} \ No newline at end of file diff --git a/src/day1/Stack.ts b/src/day1/Stack.ts new file mode 100644 index 0000000..c8e5f11 --- /dev/null +++ b/src/day1/Stack.ts @@ -0,0 +1,41 @@ +type Node = { + value: T, + prev?: Node +} +export default class Stack { + public length: number; + private head?: Node; + + + constructor() { + this.head = undefined; + this.length = 0; + } + + push(item: T): void { + const node = {value:item} as Node + this.length++; + if (!this.head){ + this.head = node; + return; + } + node.prev = this.head; + this.head = node; + } + + pop(): T | undefined { + this.length = Math.max(0,this.length - 1); + if (this.length === 0){ + const head = this.head; + this.head = undefined; + return head?.value; + } + const head = this.head as Node; + this.head = head.prev; + return head.value; + } + + peek(): T | undefined { + return this.head?.value; + } +} diff --git a/src/day1/Trie.ts b/src/day1/Trie.ts new file mode 100644 index 0000000..def1f03 --- /dev/null +++ b/src/day1/Trie.ts @@ -0,0 +1,18 @@ +export default class Trie { + + + + + constructor() { + } + + insert(item: string): void { + +} + delete(item: string): void { + +} + find(partial: string): string[] { + +} +} \ No newline at end of file diff --git a/src/day1/TwoCrystalBalls.ts b/src/day1/TwoCrystalBalls.ts new file mode 100644 index 0000000..3e21fad --- /dev/null +++ b/src/day1/TwoCrystalBalls.ts @@ -0,0 +1,16 @@ +export default function two_crystal_balls(breaks: boolean[]): number { + const jump_amount = Math.floor(Math.sqrt(breaks.length)); + let i = jump_amount; + for (; i=7.0.0-beta.0 <8": +"@babel/core@^7.11.6", "@babel/core@^7.12.3": version "7.18.5" resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz" integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== @@ -532,14 +532,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" @@ -548,6 +540,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@sinclair/typebox@^0.23.3": version "0.23.5" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz" @@ -592,39 +592,6 @@ source-map-support "^0.5.21" tslib "^2.5.0" -"@swc/core-linux-x64-gnu@1.3.80": - version "1.3.80" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.80.tgz" - integrity sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg== - -"@swc/core-linux-x64-musl@1.3.80": - version "1.3.80" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.80.tgz" - integrity sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA== - -"@swc/core@>= 1.3", "@swc/core@>=1.2.50": - version "1.3.80" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.80.tgz" - integrity sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw== - dependencies: - "@swc/types" "^0.1.3" - optionalDependencies: - "@swc/core-darwin-arm64" "1.3.80" - "@swc/core-darwin-x64" "1.3.80" - "@swc/core-linux-arm-gnueabihf" "1.3.80" - "@swc/core-linux-arm64-gnu" "1.3.80" - "@swc/core-linux-arm64-musl" "1.3.80" - "@swc/core-linux-x64-gnu" "1.3.80" - "@swc/core-linux-x64-musl" "1.3.80" - "@swc/core-win32-arm64-msvc" "1.3.80" - "@swc/core-win32-ia32-msvc" "1.3.80" - "@swc/core-win32-x64-msvc" "1.3.80" - -"@swc/types@^0.1.3": - version "0.1.4" - resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.4.tgz" - integrity sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg== - "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" @@ -800,7 +767,7 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -babel-jest@^28.0.0, babel-jest@^28.1.1: +babel-jest@^28.1.1: version "28.1.1" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.1.tgz" integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw== @@ -880,7 +847,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.20.2, "browserslist@>= 4.21.0": +browserslist@^4.20.2: version "4.21.0" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz" integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== @@ -994,16 +961,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colorette@^2.0.19: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -1140,7 +1107,7 @@ expect@^28.1.1: jest-message-util "^28.1.1" jest-util "^28.1.1" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.x: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -1172,6 +1139,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -1553,7 +1525,7 @@ jest-resolve-dependencies@^28.1.1: jest-regex-util "^28.0.2" jest-snapshot "^28.1.1" -jest-resolve@*, jest-resolve@^28.1.1: +jest-resolve@^28.1.1: version "28.1.1" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.1.tgz" integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== @@ -1699,7 +1671,7 @@ jest-worker@^28.1.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28.0.0, jest@^28.1.1: +jest@^28.1.1: version "28.1.1" resolved "https://registry.npmjs.org/jest/-/jest-28.1.1.tgz" integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== @@ -1778,7 +1750,7 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -make-error@^1.1.1, make-error@1.x: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -2008,25 +1980,18 @@ safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +semver@7.x, semver@^7.3.5: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.5: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@7.x: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -2054,14 +2019,6 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -source-map-support@^0.5.21: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -2070,6 +2027,14 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" @@ -2218,7 +2183,7 @@ ts-jest@^28.0.5: semver "7.x" yargs-parser "^21.0.1" -ts-node@^10.8.1, ts-node@>=9.0.0: +ts-node@^10.8.1: version "10.8.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz" integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== @@ -2266,7 +2231,7 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^4.7.4, "typescript@>= 4.3", typescript@>=2.7, typescript@>=4.3: +typescript@^4.7.4: version "4.7.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==