diff --git a/ligma.config.js b/ligma.config.js index f9624f0..61f071c 100644 --- a/ligma.config.js +++ b/ligma.config.js @@ -1,6 +1,55 @@ module.exports = { dsa: [ + "LinearSearchList", + "BinarySearchList", + "TwoCrystalBalls", + "BubbleSort", + "LinkedList", "ArrayList", ], } +## Lists +LinkedList +* get length(): number; +* remove(item: T): T | undefined; +* removeAt(index: number): T | undefined; +* append(item: T): void; +* prepend(item: T): void; +* get(index: number): T | undefined; + +Queue +Stack + +ArrayList +* Same api as list + +## Recursion +The Maze Problem +Quicksort + +## Trees +Binary Tree Traversals +DFS: pre +DFS: in +DFS: post + +BFS on Binary + +### Practice Problem +- Compare Two Binary Trees + +DFS: Binary Search Tree Traversal + +RedBlack Trees + +## Graphs +DFS +BFS +Dijkstra + +## Map +Implement Map + + + diff --git a/scripts/dsa.js b/scripts/dsa.js index 6d8c53b..883a9bd 100644 --- a/scripts/dsa.js +++ b/scripts/dsa.js @@ -1,5 +1,66 @@ +const length_property = { + getters: [{ + name: "length", + return: "number", + prop_name: "_length", + }], + properties: [{ + name: "_length", + type: "number", + scope: "private", + }] +}; +const list_interface = { + methods: [{ + name: "prepend", + args: "item: T", + return: "void", + }, { + name: "insertAt", + args: "item: T, idx: number", + return: "void", + }, { + name: "append", + args: "item: T", + return: "void", + }, { + name: "remove", + args: "item: T", + return: "T | undefined", + }, { + name: "get", + args: "idx: number", + return: "T | undefined", + }, { + name: "removeAt", + args: "idx: number", + return: "T | undefined", + }], + ...length_property, +}; module.exports = { + Map: { + generic: "", + type: "class", + methods: [{ + name: "get", + args: "key: T", + return: "V | undefined", + }, { + name: "set", + args: "key: T, value: V", + return: "void", + }, { + name: "delete", + args: "key: T", + return: "V | undefined", + }, { + name: "size", + return: "number", + }], + }, + RingBuffer: { generic: "", type: "class", @@ -26,51 +87,64 @@ module.exports = { scope: "private", }] }, + ArrayList: { type: "class", generic: "", - methods: [{ - name: "add", - args: "item: T", - return: "void", - }, { - name: "peek", - return: "T | undefined", - }, { - name: "remove", - args: "item: T", - return: "T | undefined", - }, { - name: "removeAt", - args: "idx: number", - return: "T | undefined", - }], - getters: [{ - name: "length", - return: "number", - prop_name: "_length", - }], - properties: [{ - name: "_length", - type: "number", - scope: "private", - }] + ...list_interface, }, SinglyLinkedList: { generic: "", type: "class", + ...list_interface, }, DoublyLinkedList: { generic: "", type: "class", + ...list_interface, }, Queue: { generic: "", type: "class", + ...length_property, + methods: [{ + name: "enqueue", + args: "item: T", + return: "void", + }, { + name: "deque", + args: "", + return: "T | undefined", + }, { + name: "peek", + args: "", + return: "T | undefined", + }] }, Stack: { generic: "", type: "class", + ...length_property, + methods: [{ + name: "push", + args: "item: T", + return: "void", + }, { + name: "pop", + args: "", + return: "T | undefined", + }, { + name: "peek", + args: "", + return: "T | undefined", + }] + }, + + BubbleSort: { + type: "fn", + fn: "bubble_sort", + args: "arr: number[]", + "return": "void", }, InsertionSort: { @@ -107,5 +181,100 @@ module.exports = { args: "list: WeightedAdjacencyList", "return": ": WeightedAdjacencyList | null", }, + + BinarySearchList: { + type: "fn", + fn: "bs_list", + args: "haystack: number[], needle: number", + "return": ": boolean", + }, + + LinearSearchList: { + type: "fn", + fn: "linear_search", + args: "haystack: number[], needle: number", + "return": ": boolean", + }, + + TwoCrystalBalls: { + type: "fn", + fn: "two_crystal_balls", + args: "breaks: boolean[]", + "return": ": number", + }, + + MazeSolver: { + type: "fn", + fn: "solve", + args: "maze: string[][], wall: string, path: string, start: Point, end: Point", + "return": ": Point[]", + }, + + BTPreOrder: { + type: "fn", + fn: "pre_order_search", + generic: "", + args: "head: BinaryNode", + "return": ": BinaryNode[]", + }, + + BTInOrder: { + type: "fn", + fn: "in_order_search", + generic: "", + args: "head: BinaryNode", + "return": ": BinaryNode[]", + }, + + BTPostOrder: { + type: "fn", + fn: "post_order_search", + generic: "", + args: "head: BinaryNode", + "return": ": BinaryNode[]", + }, + + BTBFS: { + type: "fn", + fn: "bfs", + generic: "", + args: "head: BinaryNode", + "return": ": BinaryNode[]", + }, + + CompareBinaryTrees: { + type: "fn", + fn: "compare", + args: "head: BinaryNode", + "return": ": boolean", + }, + + DFSOnBST: { + type: "fn", + fn: "search", + args: "head: BinaryNode, needle: number", + "return": ": boolean", + }, + + DFSGraphList: { + type: "fn", + fn: "dfs", + args: "graph: WeightedAdjacencyList, source: number, needle: number", + "return": "number[]", + }, + + BFSGraphList: { + type: "fn", + fn: "bfs", + args: "graph: WeightedAdjacencyList, source: number, needle: number", + "return": "number[]", + }, + + BFSGraphMatrix: { + type: "fn", + fn: "bfs", + args: "graph: WeightedAdjacencyMatrix, source: number, needle: number", + "return": "number[]", + }, }; diff --git a/scripts/generate b/scripts/generate index e1691fd..8746cb5 100755 --- a/scripts/generate +++ b/scripts/generate @@ -59,7 +59,8 @@ function create_class(name, item) { } function create_function(name, item) { - fs.writeFileSync(path.join(day_path, `${name}.ts`), `export default function ${item.fn}(${item.args}): ${item.return} { + const g = item.generic ? item.generic : ""; + fs.writeFileSync(path.join(day_path, `${name}.ts`), `export default function ${item.fn}${g}(${item.args}): ${item.return} { }`); } diff --git a/src/__tests__/BinarySearchArray.ts b/src/__tests__/BinarySearchArray.ts new file mode 100644 index 0000000..90f2d31 --- /dev/null +++ b/src/__tests__/BinarySearchArray.ts @@ -0,0 +1,13 @@ +import binary_fn from "@code/binary_search_array" + +test("binary search array", function() { + + const foo = [1, 3, 4, 69, 71, 81, 90, 99, 420, 1337, 69420]; + expect(binary_fn(foo, 69)).toEqual(true); + expect(binary_fn(foo, 1336)).toEqual(false); + expect(binary_fn(foo, 69420)).toEqual(true); + expect(binary_fn(foo, 69421)).toEqual(false); + expect(binary_fn(foo, 1)).toEqual(true); + expect(binary_fn(foo, 0)).toEqual(false); +}); + diff --git a/src/global.d.ts b/src/global.d.ts index b22f2f7..14e3185 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -1,3 +1,8 @@ +declare type Point = { + x: number; + y: number; +} + declare interface List { get length(): number; removeAt(index: number): T | undefined;