10 changed files with 550 additions and 3 deletions
			
			
		@ -0,0 +1,158 @@
					 | 
				
			||||
--- | 
				
			||||
title: "Dijkstra's Shortest Path" | 
				
			||||
description: "Dijkstra's shortest path." | 
				
			||||
navigation: false | 
				
			||||
date: "2021-03-02 02:31:20" | 
				
			||||
img: "/img/algorithms/dijkstras-shortest-path.png" | 
				
			||||
tags: | 
				
			||||
  - Algorithm | 
				
			||||
--- | 
				
			||||
 | 
				
			||||
Implementation of the shortest path algorithm, invented by Dijkstra. | 
				
			||||
 | 
				
			||||
```python | 
				
			||||
#!/usr/bin/python | 
				
			||||
 | 
				
			||||
import os | 
				
			||||
import time | 
				
			||||
 | 
				
			||||
# List of all the cities | 
				
			||||
cities = [ | 
				
			||||
	"Ab'Dendriel", | 
				
			||||
	"Ankrahmun", | 
				
			||||
	"Carlin", | 
				
			||||
	"Darashia", | 
				
			||||
	"Edron", | 
				
			||||
	"Liberty Bay", | 
				
			||||
	"Port Hope", | 
				
			||||
	"Roshamuul", | 
				
			||||
	"Oramond", | 
				
			||||
	"Svargrond", | 
				
			||||
	"Thais", | 
				
			||||
	"Venore", | 
				
			||||
	"Yalahar", | 
				
			||||
	"Krailos", | 
				
			||||
	"Issavi", | 
				
			||||
	"Cormaya", | 
				
			||||
] | 
				
			||||
 | 
				
			||||
# Possible boat fares | 
				
			||||
fares = [ | 
				
			||||
	[None, None,   80, None,   70, None, None, None, None, None,  130,   90,  160, None, None, None], #  Ab'Dendriel | 
				
			||||
	[None, None, None,  100,  160,   90,   80, None, None, None, None,  150,  230, None, None, None], #  Ankrahmun | 
				
			||||
	[  80, None, None, None,  110, None, None, None, None,  110,  110,  130,  185, None, None, None], #  Carlin | 
				
			||||
	[None,  100, None, None, None,  200,  180, None, None, None, None,   60,  210,  110,  130, None], #  Darashia | 
				
			||||
	[  70,  160,  110, None, None,  170,  150, None, None, None,  160,   40, None,  100, None,   20], #  Edron | 
				
			||||
	[None,   90, None,  200,  170, None,   50, None, None, None,  180,  180,  275, None, None, None], #  Liberty Bay | 
				
			||||
	[None,  110, None,  180,  150,   50, None, None, None, None,  160,  160,  260, None, None, None], #  Port Hope | 
				
			||||
	[None, None, None, None, None, None, None, None, None, None,  210, None, None, None, None, None], #  Roshamuul | 
				
			||||
	[None, None, None, None,  110, None,  200, None, None, None,  150,  130, None,   60,  120, None], #  Oramond | 
				
			||||
	[None, None, 110,  None, None, None, None, None, None, None,  180,  150, None, None, None, None], #  Svargrond | 
				
			||||
	[ 130, None,  110, None,  160,  180,  160,  210,  150,  180, None,  170,  200, None, None, None], #  Thais | 
				
			||||
	[  90, 150,   130,   60,   40,  180,  160, None, None,  150,  170, None,  185,  110,  130, None], #  Venore | 
				
			||||
	[ 160, 230,   185,  210, None,  275,  260, None, None, None,  200,  185, None, None, None, None], #  Yalahar | 
				
			||||
	[None, None, None,  110,  100, None, None, None,   60, None, None,  110, None, None,   70, None], #  Krailos | 
				
			||||
	[None, None, None,   80, None, None, None, None,  100, None, None,   80, None,   80, None, None], #  Issavi | 
				
			||||
	[None, None, None, None,   20, None, None, None, None, None, None, None, None, None, None, None], #  Cormaya | 
				
			||||
] | 
				
			||||
 | 
				
			||||
# Say phrase | 
				
			||||
def say(string): | 
				
			||||
	time.sleep(0.2) | 
				
			||||
	os.system('xdotool key Return') | 
				
			||||
	os.system('xdotool keydown Alt') | 
				
			||||
	os.system('xdotool type "' + string + '"') | 
				
			||||
	os.system('xdotool keyup Alt') | 
				
			||||
	os.system('xdotool key Return') | 
				
			||||
 | 
				
			||||
# Say fare | 
				
			||||
def typeFare(city): | 
				
			||||
	say("hi") | 
				
			||||
	time.sleep(1.0) | 
				
			||||
	say(city) | 
				
			||||
	say("yes") | 
				
			||||
 | 
				
			||||
def dijkstraShortestPath(sourceVertex): | 
				
			||||
	explored = [] | 
				
			||||
	unexplored = [] | 
				
			||||
 | 
				
			||||
	# Setup vertices | 
				
			||||
	for i, fare in enumerate(fares[sourceVertex]): | 
				
			||||
		unexplored.append([i, None, None]) | 
				
			||||
 | 
				
			||||
		# Set the source vertex distance to 0 | 
				
			||||
		if i == sourceVertex: | 
				
			||||
			unexplored[-1][1] = 0 | 
				
			||||
 | 
				
			||||
	while len(unexplored) > 0: | 
				
			||||
		# Select the closest vertex | 
				
			||||
		closest = None | 
				
			||||
		distance = None | 
				
			||||
		for i, vertex in enumerate(unexplored): | 
				
			||||
			if (distance == None and vertex[1] != None) or \ | 
				
			||||
			   (vertex[1] != None and vertex[1] < distance): | 
				
			||||
				closest = i | 
				
			||||
				distance = vertex[1] | 
				
			||||
 | 
				
			||||
		# Move the closest vertex to explored | 
				
			||||
		explored.append(unexplored.pop(closest)) | 
				
			||||
		ID = explored[-1][0] | 
				
			||||
 | 
				
			||||
		# Explore this vertex | 
				
			||||
		for i, vertex in enumerate(unexplored): | 
				
			||||
 | 
				
			||||
			# Is linked | 
				
			||||
			if fares[ID][vertex[0]] != None: | 
				
			||||
 | 
				
			||||
				# If it hasnt been set before | 
				
			||||
				if vertex[1] == None: | 
				
			||||
					vertex[1] = fares[ID][vertex[0]] + explored[-1][1] | 
				
			||||
					vertex[2] = ID | 
				
			||||
				# Or is cheaper | 
				
			||||
				elif vertex[1] > fares[ID][vertex[0]] + explored[-1][1]: | 
				
			||||
					vertex[1] = fares[ID][vertex[0]] + explored[-1][1] | 
				
			||||
					vertex[2] = ID | 
				
			||||
 | 
				
			||||
	return explored | 
				
			||||
 | 
				
			||||
def dijkstraTraversePath(sourceVertex, targetVertex, explored): | 
				
			||||
	find = targetVertex | 
				
			||||
	path = [targetVertex] | 
				
			||||
	while find != sourceVertex: | 
				
			||||
		for i, vertex in enumerate(explored): | 
				
			||||
			if vertex[0] == find: | 
				
			||||
				find = vertex[2] | 
				
			||||
				path.append(vertex[2]) | 
				
			||||
				break | 
				
			||||
	path.pop() | 
				
			||||
	path.reverse() | 
				
			||||
	return path | 
				
			||||
 | 
				
			||||
def main(): | 
				
			||||
	locations   = '\n'.join(cities) | 
				
			||||
	current     = os.popen('echo "' + locations + '" | rofi -dmenu -i -p "Where are you now?"').read().rstrip() | 
				
			||||
	destination = os.popen('echo "' + locations + '" | rofi -dmenu -i -p "Where are you going?"').read().rstrip() | 
				
			||||
 | 
				
			||||
	if not current or not destination: return | 
				
			||||
 | 
				
			||||
	currentIndex     = cities.index(current) | 
				
			||||
	destinationIndex = cities.index(destination) | 
				
			||||
 | 
				
			||||
	# If a direct route is possible | 
				
			||||
	if fares[currentIndex][destinationIndex] != None: | 
				
			||||
		typeFare(destination) | 
				
			||||
		return | 
				
			||||
 | 
				
			||||
	# Calculate possible non-direct route | 
				
			||||
	data = dijkstraShortestPath(currentIndex) | 
				
			||||
	path = dijkstraTraversePath(currentIndex, destinationIndex, data) | 
				
			||||
 | 
				
			||||
	for index in path: | 
				
			||||
		typeFare(cities[index]) | 
				
			||||
 | 
				
			||||
if __name__ == "__main__": | 
				
			||||
	main() | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
Source:<br> | 
				
			||||
[Dijkstra Algorithm - Example (YouTube)](https://www.youtube.com/watch?v=JcN_nq1EAr4){ target=_blank } | 
				
			||||
@ -0,0 +1,170 @@
					 | 
				
			||||
--- | 
				
			||||
title: "FizzBuzz" | 
				
			||||
description: "FizzBuzz." | 
				
			||||
navigation: false | 
				
			||||
date: "2021-03-02 02:31:02" | 
				
			||||
tags: | 
				
			||||
  - Algorithm | 
				
			||||
--- | 
				
			||||
 | 
				
			||||
Implementation of the classic FizzBuzz interview question, done in two ways. | 
				
			||||
 | 
				
			||||
```cpp | 
				
			||||
#include <iostream> | 
				
			||||
 | 
				
			||||
void calculate() | 
				
			||||
{ | 
				
			||||
	for (int i = 1; i < 101; i++) { | 
				
			||||
		if (i % 15 == 0) { | 
				
			||||
			std::cout << "FizzBuzz" << std::endl; | 
				
			||||
		} | 
				
			||||
		else if (i % 5 == 0) { | 
				
			||||
			std::cout << "Buzz" << std::endl; | 
				
			||||
		} | 
				
			||||
		else if (i % 3 == 0) { | 
				
			||||
			std::cout << "Fizz" << std::endl; | 
				
			||||
		} | 
				
			||||
		else { | 
				
			||||
			std::cout << i << std::endl; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void pattern() | 
				
			||||
{ | 
				
			||||
	const char* pattern[] = { | 
				
			||||
		"%d\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"Fizz\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"Buzz\n", | 
				
			||||
		"Fizz\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"Fizz\n", | 
				
			||||
		"Buzz\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"Fizz\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"%d\n", | 
				
			||||
		"FizzBuzz\n", | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
	for (int i = 0; i < 100; i++) { | 
				
			||||
		printf(pattern[i % 15], i + 1); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
int main(int argc, char* argv[]) | 
				
			||||
{ | 
				
			||||
	calculate(); | 
				
			||||
 | 
				
			||||
	pattern(); | 
				
			||||
 | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
Output (x2): | 
				
			||||
``` | 
				
			||||
1 | 
				
			||||
2 | 
				
			||||
Fizz | 
				
			||||
4 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
7 | 
				
			||||
8 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
11 | 
				
			||||
Fizz | 
				
			||||
13 | 
				
			||||
14 | 
				
			||||
FizzBuzz | 
				
			||||
16 | 
				
			||||
17 | 
				
			||||
Fizz | 
				
			||||
19 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
22 | 
				
			||||
23 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
26 | 
				
			||||
Fizz | 
				
			||||
28 | 
				
			||||
29 | 
				
			||||
FizzBuzz | 
				
			||||
31 | 
				
			||||
32 | 
				
			||||
Fizz | 
				
			||||
34 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
37 | 
				
			||||
38 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
41 | 
				
			||||
Fizz | 
				
			||||
43 | 
				
			||||
44 | 
				
			||||
FizzBuzz | 
				
			||||
46 | 
				
			||||
47 | 
				
			||||
Fizz | 
				
			||||
49 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
52 | 
				
			||||
53 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
56 | 
				
			||||
Fizz | 
				
			||||
58 | 
				
			||||
59 | 
				
			||||
FizzBuzz | 
				
			||||
61 | 
				
			||||
62 | 
				
			||||
Fizz | 
				
			||||
64 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
67 | 
				
			||||
68 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
71 | 
				
			||||
Fizz | 
				
			||||
73 | 
				
			||||
74 | 
				
			||||
FizzBuzz | 
				
			||||
76 | 
				
			||||
77 | 
				
			||||
Fizz | 
				
			||||
79 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
82 | 
				
			||||
83 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
86 | 
				
			||||
Fizz | 
				
			||||
88 | 
				
			||||
89 | 
				
			||||
FizzBuzz | 
				
			||||
91 | 
				
			||||
92 | 
				
			||||
Fizz | 
				
			||||
94 | 
				
			||||
Buzz | 
				
			||||
Fizz | 
				
			||||
97 | 
				
			||||
98 | 
				
			||||
Fizz | 
				
			||||
Buzz | 
				
			||||
``` | 
				
			||||
@ -0,0 +1,152 @@
					 | 
				
			||||
--- | 
				
			||||
title: "Invert Binary Tree" | 
				
			||||
description: "Invert binary tree." | 
				
			||||
navigation: false | 
				
			||||
date: "2021-03-02 02:31:09" | 
				
			||||
img: "/img/algorithms/invert-binary-tree.png" | 
				
			||||
tags: | 
				
			||||
  - Algorithm | 
				
			||||
--- | 
				
			||||
 | 
				
			||||
Implementation of inverting a binary tree. | 
				
			||||
 | 
				
			||||
binarytree.h | 
				
			||||
```cpp | 
				
			||||
#ifndef BINARYTREE_H | 
				
			||||
#define BINARYTREE_H | 
				
			||||
 | 
				
			||||
#include <cstdint> | 
				
			||||
 | 
				
			||||
class BinaryTree { | 
				
			||||
public: | 
				
			||||
	// Contructors, Destructors | 
				
			||||
 | 
				
			||||
	BinaryTree(uint32_t value, BinaryTree* left = nullptr, | 
				
			||||
	           BinaryTree* right = nullptr); | 
				
			||||
 | 
				
			||||
	// Functions | 
				
			||||
 | 
				
			||||
	void print(); | 
				
			||||
	void invert(); | 
				
			||||
 | 
				
			||||
	// Getters, Setters | 
				
			||||
 | 
				
			||||
	inline uint32_t value() { return m_value; } | 
				
			||||
 | 
				
			||||
private: | 
				
			||||
	uint32_t m_value; | 
				
			||||
	BinaryTree* m_left; | 
				
			||||
	BinaryTree* m_right; | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
#endif // BINARYTREE_H | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
binarytree.cpp | 
				
			||||
```c | 
				
			||||
#include <iomanip> | 
				
			||||
#include <iostream> | 
				
			||||
#include <string> | 
				
			||||
 | 
				
			||||
#include "binarytree.h" | 
				
			||||
 | 
				
			||||
BinaryTree::BinaryTree(uint32_t value, BinaryTree *left, BinaryTree *right) | 
				
			||||
    : m_value(value), m_left(left), m_right(right) {} | 
				
			||||
 | 
				
			||||
void BinaryTree::print() | 
				
			||||
{ | 
				
			||||
	// Skip nodes without children | 
				
			||||
	if (!m_left && !m_right) { | 
				
			||||
		return; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	// Value | 
				
			||||
	std::cout << std::setw(2) << m_value << " -> "; | 
				
			||||
	// Left | 
				
			||||
	std::cout << std::setw(2) << (m_left ? std::to_string(m_left->value()) : "") <<  " | "; | 
				
			||||
	// Right | 
				
			||||
	std::cout << (m_right ? std::to_string(m_right->value()) : "") << std::endl; | 
				
			||||
 | 
				
			||||
	// Recursion | 
				
			||||
	if (m_left) { | 
				
			||||
		m_left->print(); | 
				
			||||
	} | 
				
			||||
	if (m_right) { | 
				
			||||
		m_right->print(); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void BinaryTree::invert() | 
				
			||||
{ | 
				
			||||
	// Swap | 
				
			||||
	BinaryTree* tmp = m_left; | 
				
			||||
	m_left = m_right; | 
				
			||||
	m_right = tmp; | 
				
			||||
 | 
				
			||||
	// Recursion | 
				
			||||
	if (m_left) { | 
				
			||||
		m_left->invert(); | 
				
			||||
	} | 
				
			||||
	if (m_right) { | 
				
			||||
		m_right->invert(); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
``` | 
				
			||||
main.cpp | 
				
			||||
```cpp | 
				
			||||
#include <iostream> | 
				
			||||
 | 
				
			||||
#include "binarytree.h" | 
				
			||||
 | 
				
			||||
int main(int argc, char* argv[]) | 
				
			||||
{ | 
				
			||||
	(void) argc; | 
				
			||||
	(void) argv; | 
				
			||||
 | 
				
			||||
	BinaryTree n3(3); | 
				
			||||
	BinaryTree n9(9); | 
				
			||||
	BinaryTree n13(13); | 
				
			||||
 | 
				
			||||
	BinaryTree n4(4, &n3); | 
				
			||||
	BinaryTree n6(6); | 
				
			||||
	BinaryTree n8(8, nullptr, &n9); | 
				
			||||
	BinaryTree n12(12, nullptr, &n13); | 
				
			||||
 | 
				
			||||
	BinaryTree n5(5, &n4, &n6); | 
				
			||||
	BinaryTree n10(10, &n8, &n12); | 
				
			||||
 | 
				
			||||
	BinaryTree n7(7, &n5, &n10); | 
				
			||||
 | 
				
			||||
	std::cout << std::endl << "Binary Tree:" << std::endl; | 
				
			||||
	n7.print(); | 
				
			||||
 | 
				
			||||
	n7.invert(); | 
				
			||||
 | 
				
			||||
	std::cout << std::endl << "Binary Tree Inverted:" << std::endl; | 
				
			||||
	n7.print(); | 
				
			||||
 | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
Output: | 
				
			||||
``` | 
				
			||||
Binary Tree: | 
				
			||||
 7 ->  5 | 10 | 
				
			||||
 5 ->  4 | 6 | 
				
			||||
 4 ->  3 | | 
				
			||||
10 ->  8 | 12 | 
				
			||||
 8 ->    | 9 | 
				
			||||
12 ->    | 13 | 
				
			||||
 | 
				
			||||
Binary Tree Inverted: | 
				
			||||
 7 -> 10 | 5 | 
				
			||||
10 -> 12 | 8 | 
				
			||||
12 -> 13 | | 
				
			||||
 8 ->  9 | | 
				
			||||
 5 ->  6 | 4 | 
				
			||||
 4 ->    | 3 | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
Source:<br> | 
				
			||||
[Binary Search Trees in Java (YouTube)](https://www.youtube.com/watch?v=Qa5r8Wsda70){ target=_blank } | 
				
			||||
@ -0,0 +1,65 @@
					 | 
				
			||||
--- | 
				
			||||
title: "Sieve of Eratosthenes" | 
				
			||||
description: "Sieve of Eratosthenes." | 
				
			||||
navigation: false | 
				
			||||
date: "2021-03-02 02:31:16" | 
				
			||||
img: "/img/algorithms/sieve-of-eratosthenes.gif" | 
				
			||||
tags: | 
				
			||||
  - Algorithm | 
				
			||||
--- | 
				
			||||
 | 
				
			||||
Implementation of the ancient sieve of Eratosthenes math algorithm, used for | 
				
			||||
finding prime numbers up to a given limit. | 
				
			||||
 | 
				
			||||
```c | 
				
			||||
#include <stdbool.h> // bool | 
				
			||||
#include <stdio.h>   // printf | 
				
			||||
#include <string.h>  // memset | 
				
			||||
 | 
				
			||||
int main(int argc, char* argv[]) { | 
				
			||||
	int limit = 10000; | 
				
			||||
	int calculate = limit * 20; | 
				
			||||
 | 
				
			||||
	// Create an array and set all to true | 
				
			||||
	bool numbers[calculate]; | 
				
			||||
	memset(&numbers, true, sizeof(bool) * calculate); | 
				
			||||
 | 
				
			||||
	// Loop through all the numbers | 
				
			||||
	for (int i = 2; i < calculate; i++) { | 
				
			||||
 | 
				
			||||
		// Already crossed out numbers don't have to be checked | 
				
			||||
		if (numbers[i]) { | 
				
			||||
			// Cross out all the numbers that can't be a prime, which are multiples of itself | 
				
			||||
			for (int j = i * i; j < calculate; j += i) { | 
				
			||||
				numbers[j] = false; | 
				
			||||
			} | 
				
			||||
 | 
				
			||||
			// Once you exceed the calculate range, you can exit the loop | 
				
			||||
			if (i * i > calculate) { | 
				
			||||
				break; | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	int sum = 0; | 
				
			||||
	int counter = 1; | 
				
			||||
	// Get the sum of the first 10000 primes | 
				
			||||
	for (int i = 2; i < calculate; i++) { | 
				
			||||
		if (numbers[i]) { | 
				
			||||
			sum += i; | 
				
			||||
 | 
				
			||||
			if (counter >= limit) { | 
				
			||||
				break; | 
				
			||||
			} | 
				
			||||
			counter++; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	printf("sum of first %d primes is: %d\n", counter, sum); | 
				
			||||
 | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
Source:<br> | 
				
			||||
[https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes){ target=_blank } | 
				
			||||
| 
		 After Width: | Height: | Size: 22 KiB  | 
| 
		 After Width: | Height: | Size: 47 KiB  | 
| 
		 After Width: | Height: | Size: 154 KiB  | 
					Loading…
					
					
				
		Reference in new issue