Skip to main content

Depth-First Search in TypeScript

0 likes • Oct 15, 2022
TypeScript
Loading...
Download

More TypeScript Posts

strassens algo

daybs
0 likes • Oct 13, 2022
TypeScript
// This function takes a matrix and outputs 4 equal size submatrices, starting from top left going to bottom right.
const split = (matrix: number[][]): number[][][] => {
const n: number = matrix.length
const mid: number = n/2
const C11: number[][] = new Array<Array<number>> // first n/2 rows intersection first n/2 columms
const C12: number[][] = new Array<Array<number>> // first n/2 rows intersection last n/2 columns
const C21: number[][] = new Array<Array<number>> // last n/2 rows intersection first n/2 columns
const C22: number[][] = new Array<Array<number>> // last n/2 rows intersection last n/2 columns
for(let i: number = 0; i < mid; i++) {
C11.push([])
C12.push([])
for (let j: number = 0; j < mid; j++) {
C11[i].push(matrix[i][j])
}
for (let j: number = mid; j < n; j++) {
C12[i].push(matrix[i][j])
}
}
for(let i: number = 0; i < mid; i++) {
C21.push([])
C22.push([])
for (let j: number = 0; j < mid; j++) {
C21[i].push(matrix[i+mid][j])
}
for (let j: number = mid; j < n; j++) {
C22[i].push(matrix[i+mid][j])
}
}
return [C11, C12, C21, C22]
}
// This function takes 4 matrices, in order from top left to bottom right, and combines them into one matrix
const combine = (A: number[][], B: number[][], C: number[][], D: number[][]): number[][] => {
const n: number = A.length*2
const combo: number[][] = new Array<Array<number>>
// Populate combo with temporary 0s
for(let i: number = 0; i < A.length; i++) {
combo.push([])
for (let j: number = 0; j < A.length; j++) {
combo[i].push(A[i][j])
}
for (let j: number = A.length; j < n; j++) {
combo[i].push(B[i][j-A.length])
}
}
for(let i: number = A.length; i < n; i++) {
combo.push([])
for (let j: number = 0; j < A.length; j++) {
combo[i].push(C[i-A.length][j])
}
for (let j: number = A.length; j < n; j++) {
combo[i].push(D[i-A.length][j-A.length])
}
}
return combo
}
// Basic matrix addition function
const matrix_add = (A: number[][], B: number[][]): number[][] => {
const matrix_sum: number[][] = [[]]
const n: number = A.length
for(let i: number = 0; i < n; i++) {
matrix_sum[i] = []
for (let j: number = 0; j < n; j++) {
matrix_sum[i][j] = A[i][j] + B[i][j]
}
}
return matrix_sum
}
// Basic matrix subtraction function
const matrix_subtract = (A: number[][], B: number[][]): number[][] => {
const matrix_diff: number[][] = [[]]
const n: number = A.length
for(let i: number = 0; i < n; i++) {
matrix_diff[i] = []
for (let j: number = 0; j < n; j++) {
matrix_diff[i][j] = A[i][j] - B[i][j]
}
}
return matrix_diff
}
const strassen = (A: number[][], B: number[][]): number[][] => {
const n: number = A.length
var C: number[][] = [[]]
// Populate C with temporary 0s
for(let i: number = 0; i < n; i++) {
C[i] = []
for (let j: number = 0; j < n; j++) {
C[i][j] = 0
}
}
// Once the matrices reach a small enough size, compute using the brute force method
if (n <= 2) {
for (let i: number = 0; i < n; i++) {
for (let j: number = 0; j < n; j++) {
for (let z: number = 0; z < n; z++) {
C[i][j] = C[i][j] + (A[i][z]*B[z][j])
}
}
}
return C
}
// Create independent variables from function that returns an array with array destructuring.
const [a, b, c, d] = split(A)
const [e, f, g, h] = split(B)
// Using Strassen's method to calculate 1 less product
const p1: number[][] = strassen(matrix_add(a, d), matrix_add(e,h))
const p2: number[][] = strassen(d, matrix_subtract(g, e))
const p3: number[][] = strassen(matrix_add(a, b), h)
const p4: number[][] = strassen(matrix_subtract(b, d), matrix_add(g, h))
const p5: number[][] = strassen(a, matrix_subtract(f, h))
const p6: number[][] = strassen(matrix_add(c, d), e)
const p7: number[][] = strassen(matrix_subtract(a, c), matrix_add(e, f))
const C11: number[][] = matrix_add(matrix_subtract(matrix_add(p1, p2), p3), p4)
const C12: number[][] = matrix_add(p5, p3)
const C21: number[][] = matrix_add(p6, p2)
const C22: number[][] = matrix_subtract(matrix_subtract(matrix_add(p5, p1), p6), p7)
C = combine(C11, C12, C21, C22)
return C
}
const M1: number[][] = [[1,3],[7,5]]
const M2: number[][] = [[6,8],[4,2]]
const M_Product: number[][] = strassen(M1, M2)
console.log("Matrix 1:")
console.log(M1)
console.log("Matrix 2:")
console.log(M2)
console.log("Product: ")
console.log(M_Product)

React usePrevious Hook

CodeCatch
0 likes • Oct 15, 2022
TypeScript
import { useState, useEffect, useRef } from "react";
// Usage
function App() {
// State value and setter for our example
const [count, setCount] = useState(0);
// Get the previous value (was passed into hook on last render)
const prevCount = usePrevious(count);
// Display both current and previous count value
return (
<div>
<h1>
Now: {count}, before: {prevCount}
</h1>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
// Hook
function usePrevious(value) {
// The ref object is a generic container whose current property is mutable ...
// ... and can hold any value, similar to an instance property on a class
const ref = useRef();
// Store current value in ref
useEffect(() => {
ref.current = value;
}, [value]); // Only re-run if value changes
// Return previous value (happens before update in useEffect above)
return ref.current;
}

Coderator Follow System CRUD

AustinLeath
0 likes • Nov 18, 2022
TypeScript
const getFollowers = async (req: Request, res: Response) => {
try {
const username = req.params.username || '';
const user = await User.findUnique({
where: { username },
include: { followedBy: true },
});
if (!user) {
res.status(404).json({
error: 'User could not be found',
});
return;
}
const followers = user.followedBy.map(followedBy => {
return {
followerId: followedBy.followerId,
};
});
const followersCount = followers.length;
res.json({ followersCount: followersCount, followers });
} catch (error) {
console.error('getFollowers() error: ', error);
res.status(500).json({
error: `There was an error fetching followers for user with username "${req.params.username}", please try again later`,
});
}
};
const getFollowing = async (req: Request, res: Response) => {
try {
const username = req.params.username || '';
const user = await User.findUnique({
where: { username },
include: { following: true },
});
if (!user) {
res.status(404).json({
error: 'User could not be found',
});
return;
}
const following = user.following.map(following => {
return {
followingId: following.followingId,
};
});
const followingCount = following.length;
res.json({ followingCount: followingCount, following });
} catch (error) {
console.error('getFollowing() error: ', error);
res.status(500).json({
error: `There was an error fetching who is following "${req.params.username}", please try again later`,
});
}
};
const followUser = async (req: Request, res: Response) => {
try {
const username = req.params.username || '';
const user = await User.findUnique({
where: { username },
});
if (!user) {
res.status(404).json({
error: 'User could not be found',
});
return;
}
// dont allow a user to follow themselves
if (req.user.id === user.id) {
res.status(400).json({ error: 'You cannot follow yourself' });
return;
}
//check if a follow relationship already exists
const followrelationship = await prisma.follows.findUnique({
where: {
followerId_followingId: {
followerId: req.user.id,
followingId: user.id,
},
},
});
// check if the follow relationship already exists
if (followrelationship) {
res.status(400).json({ error: 'You are already following this user' });
return;
}
// create the follow relationship
const follow = await prisma.follows.create({
data: {
followerId: req.user.id,
followingId: user.id,
},
});
res.json({ follow });
} catch (error) {
console.error('followUser() error: ', error);
res.status(500).json({
error: `There was an error following "${req.params.username}", please try again later`,
});
}
};
const unfollowUser = async (req: Request, res: Response) => {
try {
const username = req.params.username || '';
const user = await User.findUnique({
where: { username },
});
if (!user) {
res.status(404).json({
error: 'User could not be found',
});
return;
}
// dont allow a user to unfollow themselves
if (req.user.id === user.id) {
res.status(400).json({ error: 'You cannot unfollow yourself' });
return;
}
//check if a follow relationship already exists
const followrelationship = await prisma.follows.findUnique({
where: {
followerId_followingId: {
followerId: req.user.id,
followingId: user.id,
},
},
});
// check if the follow relationship already exists
if (!followrelationship) {
res.status(400).json({ error: 'You are not following this user' });
return;
}
// delete the follow relationship
const follow = await prisma.follows.delete({
where: {
followerId_followingId: {
followerId: req.user.id,
followingId: user.id,
},
},
});
res.json({ follow });
} catch (error) {
console.error('unfollowUser() error: ', error);
res.status(500).json({
error: `There was an error unfollowing "${req.params.username}", please try again later`,
});
}
};