From d6b4349650e3bc3cfee821ca4f4225bb55b56724 Mon Sep 17 00:00:00 2001 From: Deepanshu Gajbhiye Date: Sun, 8 Oct 2017 01:11:37 +0530 Subject: [PATCH 001/355] Create selection_sort2 Implementation of selection sort algorithm in python --- sort/selection_sort/python/selection_sort2 | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 sort/selection_sort/python/selection_sort2 diff --git a/sort/selection_sort/python/selection_sort2 b/sort/selection_sort/python/selection_sort2 new file mode 100644 index 0000000000..3fb0a28f8a --- /dev/null +++ b/sort/selection_sort/python/selection_sort2 @@ -0,0 +1,31 @@ + +import sys + +def selection_sort(items): + """Implementation of the selection sort algorithm using Python + inside parameter we can pass some items which are heterogeneous + comparable + """ + + length = len(items) + for i in range(length): + least = i + for j in range(i + 1, length): + if items[j] < items[least]: + least = j + items[least], items[i] = ( + items[i], items[least] + ) + return items + + +if __name__ == '__main__': + # to make it run on both version python 2.x and 3.x + if sys.version_info.major > 3: + input_fun = input + else: + input_fun = raw_input + + user_input = input_fun('Enter numbers separated by a comma:\n') + unsorted = [int(item) for item in user_input.split(',')] + print(selection_sort(unsorted)) From 75a6d1d3e99628807c179364db5a4f270833cfa2 Mon Sep 17 00:00:00 2001 From: Deepanshu Gajbhiye Date: Sun, 8 Oct 2017 01:36:15 +0530 Subject: [PATCH 002/355] Update selection_sort2 added example --- sort/selection_sort/python/selection_sort2 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sort/selection_sort/python/selection_sort2 b/sort/selection_sort/python/selection_sort2 index 3fb0a28f8a..289d131f3f 100644 --- a/sort/selection_sort/python/selection_sort2 +++ b/sort/selection_sort/python/selection_sort2 @@ -5,6 +5,13 @@ def selection_sort(items): """Implementation of the selection sort algorithm using Python inside parameter we can pass some items which are heterogeneous comparable + Example: + + C:\Users\Hp\Desktop> python selectionsortorfi.py + Enter numbers separated by a comma: + 7,5,8,3,2 + [2, 3, 5, 7, 8] + by d78ui98 """ length = len(items) From 39f81fad7a2b50f0f7966cc47305b156171d7a2a Mon Sep 17 00:00:00 2001 From: Deepanshu Gajbhiye Date: Sun, 8 Oct 2017 01:36:38 +0530 Subject: [PATCH 003/355] Update selection_sort2 added an example --- sort/selection_sort/python/selection_sort2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sort/selection_sort/python/selection_sort2 b/sort/selection_sort/python/selection_sort2 index 289d131f3f..15160e617b 100644 --- a/sort/selection_sort/python/selection_sort2 +++ b/sort/selection_sort/python/selection_sort2 @@ -27,7 +27,7 @@ def selection_sort(items): if __name__ == '__main__': - # to make it run on both version python 2.x and 3.x + # to make it work on both version python 2.x and 3.x if sys.version_info.major > 3: input_fun = input else: From cfbbfe0aa9d5daac521b94e30619d5daf50c0e6f Mon Sep 17 00:00:00 2001 From: Jay Shah Date: Wed, 11 Oct 2017 14:48:03 +0530 Subject: [PATCH 004/355] Fibonacci in Rust --- math/fibonacci/Rust/fibonacci.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 math/fibonacci/Rust/fibonacci.rs diff --git a/math/fibonacci/Rust/fibonacci.rs b/math/fibonacci/Rust/fibonacci.rs new file mode 100644 index 0000000000..53eb0b2d59 --- /dev/null +++ b/math/fibonacci/Rust/fibonacci.rs @@ -0,0 +1,16 @@ +// Rerturns the nth element of the fibonacci sequence 0,1,1,2,3..... +fn fibo(n :i64) -> i64 { + match n { + 0 => 0, + 1 => 1, + _ => (fibo(n-1) + fibo(n-2)) + } +} + +fn main() { + println!("{}",fibo(10)); + println!("{}",fibo(8)); + println!("{}",fibo(5)); + println!("{}",fibo(2)); + +} From 4af306fb6831b1aba054a2bb7e9caac64e81e3e0 Mon Sep 17 00:00:00 2001 From: Ziper90 Date: Thu, 12 Oct 2017 21:24:08 +0300 Subject: [PATCH 005/355] Caesar cipher in C --- cryptography/caesar_cipher/C | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 cryptography/caesar_cipher/C diff --git a/cryptography/caesar_cipher/C b/cryptography/caesar_cipher/C new file mode 100644 index 0000000000..2d76fffd55 --- /dev/null +++ b/cryptography/caesar_cipher/C @@ -0,0 +1,48 @@ +#include +#include + +char* caesar(char* text, int shift) { + char* code = (char*)calloc(strlen(text)+1, sizeof(char)); + int i; + + shift %= 26; + + for (i = 0; i < strlen(text); i++) { + + if (text[i] >= 'a' && text[i] <= 'z') { + + if (text[i]+shift >= 128) { + shift -= 26; + } + + code[i] = (char)(text[i]+shift); + + if (code[i] < 'a') { + code[i] += 26; + } else if (code[i] > 'z') { + code[i] -= 26; + } + + } else if (text[i] >= 'A' && text[i] <= 'Z') { + code[i] = (char)(text[i]+shift); + + if (code[i] < 'A') { + code[i] += 26; + } else if (code[i] > 'Z') { + code[i] -= 26; + } + + } else { + code[i] = text[i]; + } + } + + return code; +} + +int main() +{ + char text[] = "The quick brown fox jumps over the lazy dog."; + printf("%s\n",caesar(text, 13)); + return 0; +} From c8dcc52955cb7fe29946040ecfb578039268f3c2 Mon Sep 17 00:00:00 2001 From: Ziper90 Date: Thu, 12 Oct 2017 21:27:25 +0300 Subject: [PATCH 006/355] Caesar cipher in C++ --- cryptography/caesar_cipher/C++ | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 cryptography/caesar_cipher/C++ diff --git a/cryptography/caesar_cipher/C++ b/cryptography/caesar_cipher/C++ new file mode 100644 index 0000000000..e5541e609d --- /dev/null +++ b/cryptography/caesar_cipher/C++ @@ -0,0 +1,48 @@ +#include +#include +using namespace std; + +char* caesar(const char* text, int shift) { + char* code = new char[strlen(text)+1](); + + shift %= 26; + + for (int i = 0; i < strlen(text); i++) { + + if (text[i] >= 'a' && text[i] <= 'z') { + + if (text[i]+shift >= 128) { + shift -= 26; + } + + code[i] = (char)(text[i]+shift); + + if (code[i] < 'a') { + code[i] += 26; + } else if (code[i] > 'z') { + code[i] -= 26; + } + + } else if (text[i] >= 'A' && text[i] <= 'Z') { + code[i] = (char)(text[i]+shift); + + if (code[i] < 'A') { + code[i] += 26; + } else if (code[i] > 'Z') { + code[i] -= 26; + } + + } else { + code[i] = text[i]; + } + } + + return code; +} + +int main() +{ + char text[] = "The quick brown fox jumps over the lazy dog."; + cout< Date: Thu, 12 Oct 2017 23:03:30 +0300 Subject: [PATCH 007/355] Create linear_search.php --- search/linear_search/php/linear_search.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 search/linear_search/php/linear_search.php diff --git a/search/linear_search/php/linear_search.php b/search/linear_search/php/linear_search.php new file mode 100644 index 0000000000..9c4fdb1e8a --- /dev/null +++ b/search/linear_search/php/linear_search.php @@ -0,0 +1,22 @@ + From 078acca82ad87028605550fdb051114b4144c2da Mon Sep 17 00:00:00 2001 From: Buddhi Prakash Date: Fri, 13 Oct 2017 01:48:39 +0530 Subject: [PATCH 008/355] ceaser cipher in c++ --- .../caesar_cipher/cpp/ceaser_cipher.cpp | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 cryptography/caesar_cipher/cpp/ceaser_cipher.cpp diff --git a/cryptography/caesar_cipher/cpp/ceaser_cipher.cpp b/cryptography/caesar_cipher/cpp/ceaser_cipher.cpp new file mode 100644 index 0000000000..8707ccd79e --- /dev/null +++ b/cryptography/caesar_cipher/cpp/ceaser_cipher.cpp @@ -0,0 +1,20 @@ +#include +using namespace std; + +string ceaser(string toCipher, int shift){ + for(int i=0;i Date: Fri, 13 Oct 2017 00:42:10 +0300 Subject: [PATCH 009/355] readme file for binary search tree is added --- .../binarySearch_tree/C++/README.md | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 data_structures/binarySearch_tree/C++/README.md diff --git a/data_structures/binarySearch_tree/C++/README.md b/data_structures/binarySearch_tree/C++/README.md new file mode 100644 index 0000000000..d49bfb7744 --- /dev/null +++ b/data_structures/binarySearch_tree/C++/README.md @@ -0,0 +1,83 @@ +# Binary Search Tree +A tree is simply a graph with root, that is a starting point, but containing no cycles. Binary tree means that every node might have 2 children at most. Node that have no child is called Leaf. If we add search term in the middle, we define that every node's left child (or left subtree rooted at it's left child) contains smaller value than node's value and right child (or right subtree rooted at it's right child) contains larger value than the node's value. We can illustrate this with an example: + + Figure 1 - Optimal Case: + +![alt text](https://en.0wikipedia.org/index.php?q=aHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iL2QvZGEvQmluYXJ5X3NlYXJjaF90cmVlLnN2Zy8yMDBweC1CaW5hcnlfc2VhcmNoX3RyZWUuc3ZnLnBuZw) + +When we anlyze the image above, which is taken from wiki, we see that node that has value of 8 is the root. Nodes to the left child of root have values that are less than root and nodes to the right child of root are greater than root. + +## Properties of Binary Search Tree + +| Algorithm | Avarage | Worst | +| ----------| ------- | ----- | +| Space | O(n) | O(n) | +| Search | O(log(n)) | O(n) | +| Insert | O(log(n)) | O(n) | +| Delete | O(log(n)) | O(n) | + +### Space +It is the space that every node defined in tree occupies in the memory. Whether it is the best case or worst case, space that is occupied by n nodes does not change. +### Search +Search is a recursive algorithm that looks for given value in the tree. We start with root checking whether it's comperable value is equal to searched value, if it is we hit the desired node and we return it. However, when it is not a hit, we compare the value that is being searched and the value that is in the node. If searched value is greater than current value, we call our search algorithm by giving current node's right child as argument. If searched value is less than current value, we give node's left child as argument to search algorithm. If we could not manage to find the searched value, we simply return NULL or False which is a designer's choice. +### Insert +Insert is also a recursive algorithm that searches for a place to add new node. When the tree is empty, we create new node with value that is being inserted and return it. However, tree is not empty, we look for proper place to insert our value by using same logic described in Search algorithm. It is easy to show it on example. Let's consider the example given in Figure 1 and suppose that we want to insert 5 into the tree. Here is the step by step description of how algorithm works: + +1- call insert(root,5) + +2- 8 is larger than 5, check if left child is NULL, it isn't so call insert(root->left_child, 5) + +3- 3 is less than 5, check if right child is NULL, it isn't so call insert(current_node->right_child, 5) + +4- 4 is less than 5, check if right child is NULL, it is NULL so create new node and make it current node's right child. + +5- return. + +That was the optimal case where algorithm runs in O(log(n)) complexity. + + Figure 2- Worst Case: + +![alt text](http://gateoverflow.in/?qa=blob&qa_blobid=11541371034779034273) + +In the tree like Figure 2, when we want to insert 15 into tree, we would have to traverse all the nodes so that the time complexity would be O(n). Worst case might also be reversed case like larger to smaller. + +### Delete +Deletion of minimum: We traverse through left most child since it has the minimum value. When we reach it, we check whether it has any right child or not. If it has one, we connect it's right child to parent node's left child then we delete the node with minimum value. + +Deletion of maximum: It is the sameway around as minimum. + +Delete: It is easy when the node has only one child, left or right. We would simply replace the link between it's parent and it's only child. However, things get complicated when the node has two children. In this case: + +1- We search for a successor x which is the smallest value in the right sub tree of the node. + +2- We replace the node's value and x's value. + +3- If x has a right child, we perform same logic on x's right sub tree to find a successor to x called y. + +4- We perform step 2-3 until we hit to the point where successor x has no child. + +5- We perform our final swap operation and delete the node. + +### Traversals +#### Depth first Traversals +##### In-Order Traversal +In this algorithm left child has first priority to be printed out then parent and finally the right child. +##### Pre-Order Traversal +In this algorithm parent has first priority then left child and finally the right child. +##### Post-Order Traversal +In this algorithm left child has first priorty then right child and finally the parent. +#### Level Order or Breadth First Traversal +In this algorithm we print level by level by the help of the queue. Step by step description: + +1- create an empty queue and insert root + +2- while queue is not empty: + + 3- get the top of queue as current_node, pop it + + 4- insert current_node's left child then right child to queue + + 5- print the value of current_node + + 6- go to step 2 + \ No newline at end of file From e68ddc96e9419cb3f6cae6847a35e6759ba19da0 Mon Sep 17 00:00:00 2001 From: goksgie Date: Fri, 13 Oct 2017 01:50:51 +0300 Subject: [PATCH 010/355] readme for segment tree is added --- data_structures/segment_tree/C++/README.md | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 data_structures/segment_tree/C++/README.md diff --git a/data_structures/segment_tree/C++/README.md b/data_structures/segment_tree/C++/README.md new file mode 100644 index 0000000000..855252a561 --- /dev/null +++ b/data_structures/segment_tree/C++/README.md @@ -0,0 +1,27 @@ +# Segment Tree + +Segment Tree is a binary tree structure that is constructed by using an array. ST has 2*n-1 nodes for an array of size n. Since there are n leaves and there will be n-1 internal nodes. +Each node has information of index that points to minimum element in that subtree. Root has the index that points to smallest value in the array. +Generally ST is a structure that should not be rebuilt once it is computed unless there is a change in the original array. + +The whole array Array[0:n-1] is represented by the root of the segment tree. Then we will break the interval or segment into half (since it is a binary tree) and the left child of the root will represent Array[0:(n-1)/2] and the right child of the root will represent Array[(n-1)/2 + 1: n]. So the height of the segment will be log(n). +We use an array representation for segment trees. In this resresentation, if the node index is i then it's left child will be indexed at 2*i+1, right child will be indexed at 2*i+2 and the parent of the node is indexed at (i-1)//2. +Size of the memory allocated for this representation will be: ![equation](http://www.geeksforgeeks.org/wp-content/uploads/segmenttree.png) + +Figure-1: Example of a Segment Tree: + +![alt text](http://www.geeksforgeeks.org/wp-content/uploads/RangeMinimumQuery.png) + +## How to construct a Segment Tree +We start with segment array[0:n-1] and we divide the current segment into two halves on each iteration until we get the segment with length 1. +Then we apply same procedure on both halves and for each segment, we store the index of the minimum value in it. +Except the last level, all levels of segment tree will be completely filled. +Once the tree is constructed, we can make a query to get index of minimum value.Here is the step by step description: + +1- call query(l_index, r_index) which will call queryUtil(start = 0, end = size(array)-1, l_index, r_index, tree_index=0) + +2- check if start and end is between left and right, if it is return the segmentTree[tree_index] + +3- call queryUtil recursively for left and right side of array : min(queryUtil(start,mid,l_index,r_index,2\*t_index+1),queryUtil(mid+1,end,l_index, r_index, 2\*t_index+2)) + +This data structure is suitable for Range Minimum Query algorithm questions. \ No newline at end of file From f6cca75eca90ce708760da518afeb5dcd904eb6d Mon Sep 17 00:00:00 2001 From: Leandro Vianna Date: Thu, 12 Oct 2017 21:30:44 -0300 Subject: [PATCH 011/355] adding dfs algorithm in python --- graphsearch/depth-first-search/python/dfs.py | 54 ++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 graphsearch/depth-first-search/python/dfs.py diff --git a/graphsearch/depth-first-search/python/dfs.py b/graphsearch/depth-first-search/python/dfs.py new file mode 100644 index 0000000000..23aff5cb53 --- /dev/null +++ b/graphsearch/depth-first-search/python/dfs.py @@ -0,0 +1,54 @@ + +vis = [] + +def dfs(g, s): + global vis + + print ('visiting ', s) + vis[s] = True # mark s visited + + # for all adjacent vertex of s + for u in g[s]: + if not vis[u]: + dfs(g, u) # visit a neighboor of s + + +n = int(input()) # number of vertex +m = int(input()) # number of edges + +g = [[] for _ in range(n)] + +for _ in range(m): + x, y = input().split() + g[int(x)].append(int(y)) + +vis = [False for _ in range(n)] + +for v in range(n): + dfs(g, v) + +## Input ## +# 5 +# 4 +# 0 1 +# 0 2 +# 2 4 +# 4 3 +########## +## Output ## +# 5 +# 4 +# 0 1 +# 0 2 +# 2 4 +# 4 3 +# visiting 0 +# visiting 1 +# visiting 2 +# visiting 4 +# visiting 3 +# visiting 1 +# visiting 2 +# visiting 3 +# visiting 4 +############## From 7af2641ea22821d61defab4f2e62224c1fdf6240 Mon Sep 17 00:00:00 2001 From: parth-p Date: Fri, 13 Oct 2017 08:37:26 +0530 Subject: [PATCH 012/355] Kruskals MST added --- .../kruskal's_algorithm/python/kruskalMST.py | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 greedy/kruskal's_algorithm/python/kruskalMST.py diff --git a/greedy/kruskal's_algorithm/python/kruskalMST.py b/greedy/kruskal's_algorithm/python/kruskalMST.py new file mode 100644 index 0000000000..bb10001865 --- /dev/null +++ b/greedy/kruskal's_algorithm/python/kruskalMST.py @@ -0,0 +1,66 @@ +from collections import defaultdict + +class Graph: + def __init__(self,vertices): + self.V= vertices + self.graph = [] + + def addEdge(self,u,v,w): + self.graph.append([u,v,w]) + + def find(self, parent, i): + if parent[i] == i: + return i + return self.find(parent, parent[i]) + + def union(self, parent, rank, x, y): + xroot = self.find(parent, x) + yroot = self.find(parent, y) + + if rank[xroot] < rank[yroot]: + parent[xroot] = yroot + elif rank[xroot] > rank[yroot]: + parent[yroot] = xroot + else : + parent[yroot] = xroot + rank[xroot] += 1 + + def KruskalMST(self): + result =[] + i,e = 0,0 + + self.graph = sorted(self.graph,key=lambda item: item[2]) + + parent = [] ; rank = [] + + for node in range(self.V): + parent.append(node) + rank.append(0) + + while e < self.V -1 : + u,v,w = self.graph[i] + i = i + 1 + x = self.find(parent, u) + y = self.find(parent ,v) + + if x != y: + e = e + 1 + result.append([u,v,w]) + self.union(parent, rank, x, y) + + print("Constructed MST :") + print("Vertex A Vertex B Weight") + for u,v,weight in result: + print (" %d %d %d" % (u,v,weight)) + +#vetx = int(input("Enter no. of vertices :")) +eegde = int(input("Enter no. of edges :")) + +g = Graph(eegde-1) + +print("For each edge input (Source vertex , Destination vertex , Weight of the edge ) :") +for x in range(eegde): + qq,xx,yy = map(int,input().split(" ")) + g.addEdge(qq, xx, yy) + +g.KruskalMST() \ No newline at end of file From 95a636fcdcd5f6223a511b7def5ad8b8c0784184 Mon Sep 17 00:00:00 2001 From: parth-p Date: Fri, 13 Oct 2017 08:55:27 +0530 Subject: [PATCH 013/355] Segment Tree Range minimum query in python --- .../segment_tree/python/segtreeRMQ.py | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 data_structures/segment_tree/python/segtreeRMQ.py diff --git a/data_structures/segment_tree/python/segtreeRMQ.py b/data_structures/segment_tree/python/segtreeRMQ.py new file mode 100644 index 0000000000..6b2a6d60ee --- /dev/null +++ b/data_structures/segment_tree/python/segtreeRMQ.py @@ -0,0 +1,64 @@ +import math + +def update(tree,l,r,node,index,diff): + if(l==r): + tree[node] = diff + return tree[l] + mid = l + (r-l)//2 + + if(index <= mid): + update(tree,l,mid,(2*node)+1,index,diff) + tree[node] = min(tree[node*2+2] , tree[node*2+1] ) + return diff + else: + update(tree,mid+1,r,(2*node)+2,index,diff) + tree[node] =min(tree[node*2+2] , tree[node*2+1] ) + + +def query(tree,l,r,x,y,node): + if(l==x and r==y): + return tree[node] + mid = l+ (r-l)//2 + + if(x<=mid and y<=mid): + return query(tree,l,mid,x,y,(2*node)+1) + elif(x>mid and y>mid): + return query(tree,mid+1,r,x,y,(2*node)+2) + elif(x<=mid and y>mid): + left = query(tree,l,mid,x,mid,(2*node)+1) + right = query(tree,mid+1,r,mid+1,y,(2*node)+2) + return min(left,right) + +def buildtree(tree,l,r,arr,node): + if(l==r): + tree[node] = arr[l] + return arr[l] + + mid = l + ( r-l )//2 + left = buildtree(tree,l,mid,arr,(2*node)+1) + right = buildtree(tree,mid+1,r,arr,(2*node)+2) + tree[node] = min(left,right) + return tree[node] + +n,que = map(int,input("Input total no. elements in array and No. of query :").split(" ")) + +print("Input elements of the array : ") +arr = list(map(int,input().split(" "))) +x = math.ceil(math.log(n,2)) +totnodes = (2*(2**(x+1)))-1 +tree = [None for i in range(totnodes)] +buildtree(tree,0,n-1,arr,0) +for i in range(que): + print("If you want to find query press 'q' with left and right index.") + print("If you want to update the array, press 'u' with index and value for the update.") + q,x,y = input().split(" ") + x = int(x)-1 + y = int(y)-1 + if(q=="q"): + print("Minimum in the given range is " + str(query(tree,0,n-1,x,y,0))); + + elif(q=='u'): + y+=1 + diff = arr[x] + arr[x] = y; + update(tree,0,n-1,0,x,y) \ No newline at end of file From f3288da51e382085ca70dd983524cf1689f23998 Mon Sep 17 00:00:00 2001 From: teohxuen <32366507+teohxuen@users.noreply.github.com> Date: Fri, 13 Oct 2017 11:57:03 +0800 Subject: [PATCH 014/355] Create queue.py --- data_structures/Queue/python/queue.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 data_structures/Queue/python/queue.py diff --git a/data_structures/Queue/python/queue.py b/data_structures/Queue/python/queue.py new file mode 100644 index 0000000000..cec31b4ec7 --- /dev/null +++ b/data_structures/Queue/python/queue.py @@ -0,0 +1,27 @@ +class Queue: + def __init__(self): + self.length = 0 + self.head = None + + def is_empty(self): + return self.length == 0 + + def insert(self, cargo): + node = Node(cargo) + if self.head is None: + # If list is empty the new node goes first + self.head = node + else: + # Find the last node in the list + last = self.head + while last.next: + last = last.next + # Append the new node + last.next = node + self.length += 1 + + def remove(self): + cargo = self.head.cargo + self.head = self.head.next + self.length -= 1 + return cargo From b752c5821eefbed8dd587c17d720e8098085e115 Mon Sep 17 00:00:00 2001 From: Jay Shah Date: Fri, 13 Oct 2017 11:15:42 +0530 Subject: [PATCH 015/355] update master --- sort/radix_sort/java/radix_sort.java | 145 ++++++++++++--------------- 1 file changed, 62 insertions(+), 83 deletions(-) diff --git a/sort/radix_sort/java/radix_sort.java b/sort/radix_sort/java/radix_sort.java index ae91d5b0c9..88d28113c9 100644 --- a/sort/radix_sort/java/radix_sort.java +++ b/sort/radix_sort/java/radix_sort.java @@ -1,84 +1,63 @@ -// Radix sort Java implementation -import java.io.*; -import java.util.*; - -class Radix { - - // A utility function to get maximum value in arr[] - static int getMax(int arr[], int n) - { - int mx = arr[0]; - for (int i = 1; i < n; i++) - if (arr[i] > mx) - mx = arr[i]; - return mx; - } - - // A function to do counting sort of arr[] according to - // the digit represented by exp. - static void countSort(int arr[], int n, int exp) - { - int output[] = new int[n]; // output array - int i; - int count[] = new int[10]; - Arrays.fill(count,0); - - // Store count of occurrences in count[] - for (i = 0; i < n; i++) - count[ (arr[i]/exp)%10 ]++; - - // Change count[i] so that count[i] now contains - // actual position of this digit in output[] - for (i = 1; i < 10; i++) - count[i] += count[i - 1]; - - // Build the output array - for (i = n - 1; i >= 0; i--) - { - output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; - count[ (arr[i]/exp)%10 ]--; +package core; + +import java.util.Arrays; + +public class Radix_Sort { + + //Find the maximum value in an array + public static int findMaximum(int[] array){ + int max = array[0]; + for(int i = 0; i < array.length; i++){ + if(array[i] > max){ + max = array[i]; + } + } + return max; + } + + public static int getDigit(int n, int d){ + return (n/d) % 10; + } + + public static void sortRound(int[] array, int p){ + //Defined above to speed up process + int i; + //Returned list + int[] result = new int[array.length]; + //Create a list of number frequencies + int[] frequencyList = new int[10]; + //Sets frequencies to 0 + Arrays.fill(frequencyList, 0); + + for (i = 0; i < array.length; i++){ + //Add 1 to the frequency of p digit number. + frequencyList[getDigit(array[i], p)]++; } - - // Copy the output array to arr[], so that arr[] now - // contains sorted numbers according to curent digit - for (i = 0; i < n; i++) - arr[i] = output[i]; - } - - // The main function to that sorts arr[] of size n using - // Radix Sort - static void radixsort(int arr[], int n) - { - // Find the maximum number to know number of digits - int m = getMax(arr, n); - - // Do counting sort for every digit. Note that instead - // of passing digit number, exp is passed. exp is 10^i - // where i is current digit number - for (int exp = 1; m/exp > 0; exp *= 10) - countSort(arr, n, exp); - } - - // A utility function to print an array - static void print(int arr[], int n) - { - for (int i=0; i 0; p *= 10){ + sortRound(array, p); + } + } + +} From 11618b9c9a385fc6f9cc32c38cc2b4e05dc84726 Mon Sep 17 00:00:00 2001 From: Him98 Date: Fri, 13 Oct 2017 11:59:03 +0530 Subject: [PATCH 016/355] AddTwoBinaryNumbers in C added --- math/AddBinaryNumbers/C++/a.out | Bin 0 -> 15360 bytes .../C++/addToBinaryNumbers.cpp | 29 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100755 math/AddBinaryNumbers/C++/a.out create mode 100644 math/AddBinaryNumbers/C++/addToBinaryNumbers.cpp diff --git a/math/AddBinaryNumbers/C++/a.out b/math/AddBinaryNumbers/C++/a.out new file mode 100755 index 0000000000000000000000000000000000000000..2745e3a102c2b656f407d7a8145f8b29dd9c40a0 GIT binary patch literal 15360 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 +using namespace std; + +string addBinNum(string a, string b) +{ + string result = ""; + int sum = 0; + + int i = a.size()-1, j = b.size()-1; + while (i>=0 || j>=0 || sum==1) + { + sum += ((i >= 0)? a[i]-48: 0); + sum += ((j >= 0)? b[j]-48: 0); + result = char(sum % 2 + 48) + result; + sum /= 2; + i--; + j--; + } + return result; +} + +int main() +{ + string a,b; + cout<<"Enter two binary numbers : "; + cin>>a>>b; + cout << addBinNum(a, b) << endl; + return 0; +} From 86827ee3f52ad563f668f36cb53c97f21d6f5a8c Mon Sep 17 00:00:00 2001 From: Him98 Date: Fri, 13 Oct 2017 12:32:50 +0530 Subject: [PATCH 017/355] Added russian_peasant in C++ --- math/russian_peasant/C++/russian_peasant.cpp | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 math/russian_peasant/C++/russian_peasant.cpp diff --git a/math/russian_peasant/C++/russian_peasant.cpp b/math/russian_peasant/C++/russian_peasant.cpp new file mode 100644 index 0000000000..009b056123 --- /dev/null +++ b/math/russian_peasant/C++/russian_peasant.cpp @@ -0,0 +1,33 @@ +#include +using namespace std; +typedef long long int ll; +#define pb push_back +#define f first +#define sc(n) scanf("%d",&n) +#define scl(n) scanf("%lld",&n) +#define pr(n) printf("%d",n) +#define prl(n) printf("%lld",n) +#define nl printf("\n") +#define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL) + +ll mul(ll u,ll v) +{ + ll s=0; + while(v>0) + { + if(v&1) + s=(s+u); + u=(u*2); + v=v>>1; + } + return s; +} + +int main() +{ + ll i,j; + cout<<"Enter two numbers to multiply : "; + cin>>i>>j; + cout< Date: Fri, 13 Oct 2017 13:19:07 +0530 Subject: [PATCH 018/355] added segment tree for query and update --- .../segment_tree/C++/query_update.cpp | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 data_structures/segment_tree/C++/query_update.cpp diff --git a/data_structures/segment_tree/C++/query_update.cpp b/data_structures/segment_tree/C++/query_update.cpp new file mode 100644 index 0000000000..46521ff468 --- /dev/null +++ b/data_structures/segment_tree/C++/query_update.cpp @@ -0,0 +1,140 @@ +#include +#define assn(n,a,b) assert(n<=b && n>=a) +using namespace std; +#define pb push_back +#define mp make_pair +#define clr(x) x.clear() +#define sz(x) ((int)(x).size()) +#define F first +#define S second +#define REP(i,a,b) for(i=a;i PII; +typedef vector VPII; +typedef vector VI; +typedef vector VVI; +typedef long long LL; +#define MOD 1000000007 +LL mpow(LL a, LL n) +{LL ret=1;LL b=a;while(n) {if(n&1) + ret=(ret*b)%MOD;b=(b*b)%MOD;n>>=1;} +return (LL)ret;} +#define MAXK 100000 +#define MAXN 1000000000 +int ar[MAXK]; +int get(int n, int k){ + int i=0; + while(i r || noder < l) + { + return MAXK+1; + } + //complete overlap + if(nodel >= l && noder <= r) + { + return segtree[pos]; + } + //partial overlap + int mid = (nodel + noder)/2; + int p1 = query(2*pos+1,nodel,mid,l,r); + int p2 = query(2*pos+2,mid+1,noder,l,r); + return min(p1,p2); +} + +void update(int pos, int nodel, int noder, int index, int value) +{ + if(nodel == noder) + { + input[index] = value; + segtree[pos] = value; + } + else + { + int mid = (nodel + noder)/2; + if(index >= nodel && index <= mid) + { + update(2*pos + 1, nodel, mid, index, value); + } + else + { + update(2*pos + 2, mid+1, noder, index, value); + } + segtree[pos] = min(segtree[2*pos+1], segtree[2*pos+2]); + } +} + +int main(){ + init(); + int n;cin>>n; + for(int i=0;i Date: Fri, 13 Oct 2017 14:20:59 +0530 Subject: [PATCH 019/355] added armstrong java implementation --- math/armstrong_number/Java/Armstrong.java | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 math/armstrong_number/Java/Armstrong.java diff --git a/math/armstrong_number/Java/Armstrong.java b/math/armstrong_number/Java/Armstrong.java new file mode 100644 index 0000000000..6918fc94bd --- /dev/null +++ b/math/armstrong_number/Java/Armstrong.java @@ -0,0 +1,37 @@ + +/* package whatever; // don't place package name! */ + +import java.util.*; +import java.lang.*; +import java.io.*; +import java.math.BigInteger; +/* Name of the class has to be "Main" only if the class is public. */ +class Armstrong +{ + public static boolean isArmstrong(String num){ + + BigInteger sumVal = BigInteger.valueOf(0); + int numOfDigits = num.length(); + for(int i=0;i Date: Fri, 13 Oct 2017 15:24:34 +0530 Subject: [PATCH 020/355] Quick sort in Rust --- sort/quick_sort/Rust/quick_sort.rs | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 sort/quick_sort/Rust/quick_sort.rs diff --git a/sort/quick_sort/Rust/quick_sort.rs b/sort/quick_sort/Rust/quick_sort.rs new file mode 100644 index 0000000000..f25fecfdb2 --- /dev/null +++ b/sort/quick_sort/Rust/quick_sort.rs @@ -0,0 +1,38 @@ +fn quick_sort(mut arr :Vec,low :usize, high :usize) -> Vec { + + if low < high { + let mid = partition(&mut arr, low, high); + + let arr = quick_sort(arr.clone(),low,mid); + let arr = quick_sort(arr,mid+1,high); + return arr + } + arr +} + +fn partition(arr : &mut Vec, low :usize, high :usize) -> usize { + let pivot = arr[low]; + let mut i = low ; + let mut j = high; + + loop { + while arr[i] < pivot && arr[i] != pivot { + i += 1; + } + while arr[j] > pivot && arr[j] != pivot { + j -= 1; + } + if i < j { + arr.swap(i,j); + }else{ + return j + } + } +} + +fn main() { + let arr = vec![12,3,55,1,2,7,4]; + let len = arr.len(); + let sorted = quick_sort(arr,0,len-1); + println!("Sorted array is {:?}", sorted); +} \ No newline at end of file From 20aa9b62ca02afe0363a8f8b9f553d293761aa6d Mon Sep 17 00:00:00 2001 From: "Moch. Lutfi" Date: Fri, 13 Oct 2017 17:19:56 +0700 Subject: [PATCH 021/355] Added wordsearch --- backtracking/wordsearch/README.md | 35 ++++++++ backtracking/wordsearch/go/wordsearch.go | 86 +++++++++++++++++++ backtracking/wordsearch/go/wordsearch_test.go | 45 ++++++++++ 3 files changed, 166 insertions(+) create mode 100644 backtracking/wordsearch/README.md create mode 100644 backtracking/wordsearch/go/wordsearch.go create mode 100644 backtracking/wordsearch/go/wordsearch_test.go diff --git a/backtracking/wordsearch/README.md b/backtracking/wordsearch/README.md new file mode 100644 index 0000000000..8781d3e33f --- /dev/null +++ b/backtracking/wordsearch/README.md @@ -0,0 +1,35 @@ +# WordSearch + +Given a 2D board and a word, find if the word exists in the grid. + +The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once. + +For example, +Given board = + +[ + ['A','B','C','E'], + ['S','F','C','S'], + ['A','D','E','E'] +] +word = "ABCCED", -> returns true, +word = "SEE", -> returns true, +word = "ABCB", -> returns false. + +## FindWords to find words from boards + +Given a 2D board and a list of words from the dictionary, find all words in the board. +Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word. +For example, +Given words = ["oath","pea","eat","rain"] and board = +[ + ['o','a','a','n'], + ['e','t','a','e'], + ['i','h','k','r'], + ['i','f','l','v'] +] +Return ["eat","oath"]. +Note: +You may assume that all inputs are consist of lowercase letters a-z. +You would need to optimize your backtracking to pass the larger test. Could you stop backtracking earlier? +If the current candidate does not exist in all words' prefix, you could stop backtracking immediately. What kind of data structure could answer such query efficiently? Does a hash table work? Why or why not? How about a Trie? If you would like to learn how to implement a basic trie, please work on this problem: Implement Trie (Prefix Tree) first. \ No newline at end of file diff --git a/backtracking/wordsearch/go/wordsearch.go b/backtracking/wordsearch/go/wordsearch.go new file mode 100644 index 0000000000..4241a95b1d --- /dev/null +++ b/backtracking/wordsearch/go/wordsearch.go @@ -0,0 +1,86 @@ +package wordsearch + +import ( + "sort" +) + +// WordSearch is solution for word search problem +type WordSearch struct { + board [][]byte +} + +// Exist is for checking existing word within boards +func (w *WordSearch) Exist(word string) bool { + for i, h := range w.board { + for j := range h { + if w.dfs(w.board, word, i, j) == true { + return true + } + } + } + return false +} + +// dfs deep first search +func (w *WordSearch) dfs(board [][]byte, word string, i, j int) bool { + //fmt.Println(board) + if len(word) == 0 { + return true + } + + if i < 0 || + i >= len(board) || + j < 0 || + j >= len(board[0]) || + board[i][j] != word[0] { + return false + } + //fmt.Println(board, word, i, j, len(board),len(board[0]), board[i][j]!=word[0], word[0], word[1:], board[i][j] ) + tmp := board[i][j] + board[i][j] = '#' + result := w.dfs(board, word[1:], i+1, j) || + w.dfs(board, word[1:], i-1, j) || + w.dfs(board, word[1:], i, j+1) || + w.dfs(board, word[1:], i, j-1) + board[i][j] = tmp + return result +} + +// NewWordSearch for create new instance wordsearch +func NewWordSearch(board [][]byte) *WordSearch { + return &WordSearch{ + board: board, + } +} + +func (w *WordSearch) FindWords(words []string) []string { + words = removeDuplicates(words) + sort.Strings(words) + var results = []string{} + for _, word := range words { + if w.Exist(word) { + results = append(results, word) + } + } + + return results +} + +func removeDuplicates(elements []string) []string { + // Use map to record duplicates as we find them. + encountered := map[string]bool{} + result := []string{} + + for v := range elements { + if encountered[elements[v]] == true { + // Do not add duplicate. + } else { + // Record this element as an encountered element. + encountered[elements[v]] = true + // Append to result slice. + result = append(result, elements[v]) + } + } + // Return the new slice. + return result +} diff --git a/backtracking/wordsearch/go/wordsearch_test.go b/backtracking/wordsearch/go/wordsearch_test.go new file mode 100644 index 0000000000..597462ac14 --- /dev/null +++ b/backtracking/wordsearch/go/wordsearch_test.go @@ -0,0 +1,45 @@ +package wordsearch + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCaseA(t *testing.T) { + assert := assert.New(t) + board := [][]byte{ + []byte("CAA"), + []byte("AAA"), + []byte("BCD"), + } + + nws := NewWordSearch(board) + + assert.Equal(nws.Exist("AAB"), true, "should return true") +} + +func TestCaseB(t *testing.T) { + assert := assert.New(t) + board := [][]byte{ + []byte("oaan"), + []byte("etae"), + []byte("ihkr"), + []byte("ihkr"), + } + + nws := NewWordSearch(board) + words := []string{"oath", "pea", "eat", "rain"} + assert.Equal(nws.FindWords(words), []string{"eat", "oath"}, "should return []string{\"oath\",\"eat\"}") +} + +func TestCaseC(t *testing.T) { + assert := assert.New(t) + board := [][]byte{ + []byte("a"), + } + + nws := NewWordSearch(board) + words := []string{"a", "a"} + assert.Equal(nws.FindWords(words), []string{"a"}, "should return a") +} From 9d7a4f6bd9efa43ef9f3816dccc2067b8c0d30dc Mon Sep 17 00:00:00 2001 From: arvchristos Date: Fri, 13 Oct 2017 13:23:06 +0300 Subject: [PATCH 022/355] Add C counting sort algorithm implementation --- sort/counting_sort/c/Counting_sort.c | 71 ++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 sort/counting_sort/c/Counting_sort.c diff --git a/sort/counting_sort/c/Counting_sort.c b/sort/counting_sort/c/Counting_sort.c new file mode 100644 index 0000000000..b78924c2c0 --- /dev/null +++ b/sort/counting_sort/c/Counting_sort.c @@ -0,0 +1,71 @@ +/* +* ░█▀▀░█▀█░█░█░█▀█░▀█▀░▀█▀░█▀█░█▀▀░░░█▀▀░█▀█░█▀▄░▀█▀ +* ░█░░░█░█░█░█░█░█░░█░░░█░░█░█░█░█░░░▀▀█░█░█░█▀▄░░█░ +* ░▀▀▀░▀▀▀░▀▀▀░▀░▀░░▀░░▀▀▀░▀░▀░▀▀▀░░░▀▀▀░▀▀▀░▀░▀░░▀░ +* +* Counting sort alogorithm using arrays in C. +* Integer sorting. Max value of input array should be small enough so as not to cause memory issues. +* More info: https://en.wikipedia.org/wiki/Counting_sort +* +*/ + +#include + +int find_max(int a[],int length){ + + int max = a[0]; + + for (int i = 1; i < length; i++) { + if (a[i]>max) { + max = a[i]; + } + } + + return max; +} + +int main(int argc, char const *argv[]) { + + //Input not sorted array + int nosrt[] = {4,3,10,8,15,16,17,1,12,11,20}; + + int nosrt_length = sizeof(nosrt)/sizeof(nosrt[0]); + int max_in = find_max(nosrt,nosrt_length); + + int aux[max_in]; + int result[nosrt_length+1]; + + //Initialize result array + for (int i = 0; i < nosrt_length+1; i++) { + result[i] = 0; + } + + //Initialize auxilary array + for (int i = 0; i < max_in + 1; i++) { + aux[i] = 0; + } + + //Count appearance frequency of input array and store it in aux array + //Aux[j] contains the number of elements = j + for (int j = 0; j < nosrt_length; j++) { + aux[nosrt[j]]++; + } + + //Calculate running sum. Aux[k] contains the number of elements <= k + for (int k = 1; k <= max_in; k++) { + aux[k] += aux[k-1]; + } + + //Sort elements retaining their appearance order (Stable sorting algorithm) + for (int y = nosrt_length-1; y >=0 ; y--) { + result[ aux[nosrt[y]] ] = nosrt[y]; + aux[nosrt[y]]--; + } + + //Print results + for (int w = 1; w <= nosrt_length; w++) { + printf("%d\n",result[w] ); + } + + return 0; +} From b1eaeebdeec72f7d0fae7c794ee55059a4394d5f Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 12:23:26 +0200 Subject: [PATCH 023/355] Added caesar in go --- cryptography/caesar_cipher/golang/main.go | 32 +++++++++++++++++++ .../caesar_cipher/golang/main_test.go | 23 +++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 cryptography/caesar_cipher/golang/main.go create mode 100644 cryptography/caesar_cipher/golang/main_test.go diff --git a/cryptography/caesar_cipher/golang/main.go b/cryptography/caesar_cipher/golang/main.go new file mode 100644 index 0000000000..f4ff05df53 --- /dev/null +++ b/cryptography/caesar_cipher/golang/main.go @@ -0,0 +1,32 @@ +package main + +import "fmt" +import "strings" + +// Caesar cipher +func Caesar(text string, s int) string { + coded := make([]byte, 0, len(text)) + for i := range strings.ToLower(text) { + coded = append(coded, shift(text[i], s)) + } + return string(coded) +} + +func shift(r byte, shift int) byte { + if r == ' ' { + return ' ' + } + c := int(r) + shift + if c > 'z' { + return byte(c - 26) + } + if c < 'a' { + return byte(c + 26) + } + return byte(c) +} + +func main() { + fmt.Println(Caesar("test", 3)) + fmt.Println(Caesar("whvw", -3)) +} diff --git a/cryptography/caesar_cipher/golang/main_test.go b/cryptography/caesar_cipher/golang/main_test.go new file mode 100644 index 0000000000..09d106ab8d --- /dev/null +++ b/cryptography/caesar_cipher/golang/main_test.go @@ -0,0 +1,23 @@ +package main + +import "testing" + +func TestCaesar(t *testing.T) { + testTable := []struct { + Input string + Shift int + Output string + }{ + {"test", 3, "whvw"}, + {"whvw", -3, "test"}, + {"the quick brown fox jumps over the lazy dog", 10, "dro aesmu lbygx pyh tewzc yfob dro vkji nyq"}, + {"dro aesmu lbygx pyh tewzc yfob dro vkji nyq", -10, "the quick brown fox jumps over the lazy dog"}, + } + + for _, tt := range testTable { + out := Caesar(tt.Input, tt.Shift) + if tt.Output != out { + t.Errorf("Output missmatch! Expected: %s, Got: %s", tt.Output, out) + } + } +} From a274b74c6d1cbba22390b794002fedd12b27edf7 Mon Sep 17 00:00:00 2001 From: Ziper90 Date: Fri, 13 Oct 2017 14:34:14 +0300 Subject: [PATCH 024/355] Rename cryptography/caesar_cipher/C to cryptography/caesar_cipher/c/caesar.c --- cryptography/caesar_cipher/{C => c/caesar.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cryptography/caesar_cipher/{C => c/caesar.c} (100%) diff --git a/cryptography/caesar_cipher/C b/cryptography/caesar_cipher/c/caesar.c similarity index 100% rename from cryptography/caesar_cipher/C rename to cryptography/caesar_cipher/c/caesar.c From 11cdd74cdb1526a12e5c96d1ca7ff9b56fd9a1cd Mon Sep 17 00:00:00 2001 From: Ziper90 Date: Fri, 13 Oct 2017 14:35:49 +0300 Subject: [PATCH 025/355] Rename cryptography/caesar_cipher/C++ to cryptography/caesar_cipher/cpp/caesar.cpp --- cryptography/caesar_cipher/{C++ => cpp/caesar.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cryptography/caesar_cipher/{C++ => cpp/caesar.cpp} (100%) diff --git a/cryptography/caesar_cipher/C++ b/cryptography/caesar_cipher/cpp/caesar.cpp similarity index 100% rename from cryptography/caesar_cipher/C++ rename to cryptography/caesar_cipher/cpp/caesar.cpp From 211f47c2f5d3cc21b0654033cca8274b5bb7a1c7 Mon Sep 17 00:00:00 2001 From: Ziper90 Date: Fri, 13 Oct 2017 14:40:08 +0300 Subject: [PATCH 026/355] Rename caesar.cpp to caesar_cipher.cpp --- cryptography/caesar_cipher/cpp/{caesar.cpp => caesar_cipher.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cryptography/caesar_cipher/cpp/{caesar.cpp => caesar_cipher.cpp} (100%) diff --git a/cryptography/caesar_cipher/cpp/caesar.cpp b/cryptography/caesar_cipher/cpp/caesar_cipher.cpp similarity index 100% rename from cryptography/caesar_cipher/cpp/caesar.cpp rename to cryptography/caesar_cipher/cpp/caesar_cipher.cpp From a78a73cde141e0255f696e659fc835c29bd07bd0 Mon Sep 17 00:00:00 2001 From: Ziper90 Date: Fri, 13 Oct 2017 14:40:31 +0300 Subject: [PATCH 027/355] Rename caesar.c to caesar_cipher.c --- cryptography/caesar_cipher/c/{caesar.c => caesar_cipher.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cryptography/caesar_cipher/c/{caesar.c => caesar_cipher.c} (100%) diff --git a/cryptography/caesar_cipher/c/caesar.c b/cryptography/caesar_cipher/c/caesar_cipher.c similarity index 100% rename from cryptography/caesar_cipher/c/caesar.c rename to cryptography/caesar_cipher/c/caesar_cipher.c From 59fdc6fa646b8191736f7fe9dacb0afebd62ba86 Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 14:35:42 +0200 Subject: [PATCH 028/355] Added linear search in go --- search/linear_search/golang/main.go | 30 ++++++++++++++++++++++++ search/linear_search/golang/main_test.go | 26 ++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 search/linear_search/golang/main.go create mode 100644 search/linear_search/golang/main_test.go diff --git a/search/linear_search/golang/main.go b/search/linear_search/golang/main.go new file mode 100644 index 0000000000..8d72417467 --- /dev/null +++ b/search/linear_search/golang/main.go @@ -0,0 +1,30 @@ +package main + +import "errors" +import "fmt" + +// ErrNotFound is the value when the item is not in the list +var ErrNotFound = errors.New("not found") + +func main() { + nums := []int{3, 4, 5, 66, 42, 443, 4, 54, 6} + item := 42 + idx, err := LinearSearch(nums, item) + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("%d found on index: %d\n", item, idx) +} + +// LinearSearch sequentially checks each element of a list until +// the correct element is found or until all elements have been searched +func LinearSearch(nums []int, x int) (int, error) { + for i, num := range nums { + if num == x { + return i, nil + } + } + return 0, ErrNotFound +} diff --git a/search/linear_search/golang/main_test.go b/search/linear_search/golang/main_test.go new file mode 100644 index 0000000000..b90fd1166b --- /dev/null +++ b/search/linear_search/golang/main_test.go @@ -0,0 +1,26 @@ +package main + +import "testing" + +func TestLinearSearch(t *testing.T) { + testTable := []struct { + Input []int + Find int + Output int + Error error + }{ + {[]int{3, 2, 1, 5}, 2, 1, nil}, + {[]int{3, 2, 1, 5}, 42, 0, ErrNotFound}, + } + + for _, tt := range testTable { + idx, err := LinearSearch(tt.Input, tt.Find) + if idx != tt.Output { + t.Errorf("Output missmatch! Expected: %d, Got: %d", tt.Output, idx) + } + + if err != tt.Error { + t.Errorf("Error missmatch! Expected: %v, Got: %v", tt.Error, err) + } + } +} From 4ee9f868d678fd0888dad9c291e3290d4b3d2607 Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 14:38:14 +0200 Subject: [PATCH 029/355] Revert "Added caesar in go" This reverts commit b1eaeebdeec72f7d0fae7c794ee55059a4394d5f. --- cryptography/caesar_cipher/golang/main.go | 32 ------------------- .../caesar_cipher/golang/main_test.go | 23 ------------- 2 files changed, 55 deletions(-) delete mode 100644 cryptography/caesar_cipher/golang/main.go delete mode 100644 cryptography/caesar_cipher/golang/main_test.go diff --git a/cryptography/caesar_cipher/golang/main.go b/cryptography/caesar_cipher/golang/main.go deleted file mode 100644 index f4ff05df53..0000000000 --- a/cryptography/caesar_cipher/golang/main.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import "fmt" -import "strings" - -// Caesar cipher -func Caesar(text string, s int) string { - coded := make([]byte, 0, len(text)) - for i := range strings.ToLower(text) { - coded = append(coded, shift(text[i], s)) - } - return string(coded) -} - -func shift(r byte, shift int) byte { - if r == ' ' { - return ' ' - } - c := int(r) + shift - if c > 'z' { - return byte(c - 26) - } - if c < 'a' { - return byte(c + 26) - } - return byte(c) -} - -func main() { - fmt.Println(Caesar("test", 3)) - fmt.Println(Caesar("whvw", -3)) -} diff --git a/cryptography/caesar_cipher/golang/main_test.go b/cryptography/caesar_cipher/golang/main_test.go deleted file mode 100644 index 09d106ab8d..0000000000 --- a/cryptography/caesar_cipher/golang/main_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import "testing" - -func TestCaesar(t *testing.T) { - testTable := []struct { - Input string - Shift int - Output string - }{ - {"test", 3, "whvw"}, - {"whvw", -3, "test"}, - {"the quick brown fox jumps over the lazy dog", 10, "dro aesmu lbygx pyh tewzc yfob dro vkji nyq"}, - {"dro aesmu lbygx pyh tewzc yfob dro vkji nyq", -10, "the quick brown fox jumps over the lazy dog"}, - } - - for _, tt := range testTable { - out := Caesar(tt.Input, tt.Shift) - if tt.Output != out { - t.Errorf("Output missmatch! Expected: %s, Got: %s", tt.Output, out) - } - } -} From 1a65d58a4ea5beff6ce0fd0a57ca49dbea9ea62f Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 14:38:40 +0200 Subject: [PATCH 030/355] Revert "Revert "Added caesar in go"" This reverts commit 4ee9f868d678fd0888dad9c291e3290d4b3d2607. --- cryptography/caesar_cipher/golang/main.go | 32 +++++++++++++++++++ .../caesar_cipher/golang/main_test.go | 23 +++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 cryptography/caesar_cipher/golang/main.go create mode 100644 cryptography/caesar_cipher/golang/main_test.go diff --git a/cryptography/caesar_cipher/golang/main.go b/cryptography/caesar_cipher/golang/main.go new file mode 100644 index 0000000000..f4ff05df53 --- /dev/null +++ b/cryptography/caesar_cipher/golang/main.go @@ -0,0 +1,32 @@ +package main + +import "fmt" +import "strings" + +// Caesar cipher +func Caesar(text string, s int) string { + coded := make([]byte, 0, len(text)) + for i := range strings.ToLower(text) { + coded = append(coded, shift(text[i], s)) + } + return string(coded) +} + +func shift(r byte, shift int) byte { + if r == ' ' { + return ' ' + } + c := int(r) + shift + if c > 'z' { + return byte(c - 26) + } + if c < 'a' { + return byte(c + 26) + } + return byte(c) +} + +func main() { + fmt.Println(Caesar("test", 3)) + fmt.Println(Caesar("whvw", -3)) +} diff --git a/cryptography/caesar_cipher/golang/main_test.go b/cryptography/caesar_cipher/golang/main_test.go new file mode 100644 index 0000000000..09d106ab8d --- /dev/null +++ b/cryptography/caesar_cipher/golang/main_test.go @@ -0,0 +1,23 @@ +package main + +import "testing" + +func TestCaesar(t *testing.T) { + testTable := []struct { + Input string + Shift int + Output string + }{ + {"test", 3, "whvw"}, + {"whvw", -3, "test"}, + {"the quick brown fox jumps over the lazy dog", 10, "dro aesmu lbygx pyh tewzc yfob dro vkji nyq"}, + {"dro aesmu lbygx pyh tewzc yfob dro vkji nyq", -10, "the quick brown fox jumps over the lazy dog"}, + } + + for _, tt := range testTable { + out := Caesar(tt.Input, tt.Shift) + if tt.Output != out { + t.Errorf("Output missmatch! Expected: %s, Got: %s", tt.Output, out) + } + } +} From 4498ea7a2721eabb7c075590d49dcb4d0f85021c Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 14:46:04 +0200 Subject: [PATCH 031/355] Added initial files --- cryptography/substitution_cipher/golang/main.go | 5 +++++ cryptography/substitution_cipher/golang/substitution.go | 1 + cryptography/substitution_cipher/golang/substitution_test.go | 1 + 3 files changed, 7 insertions(+) create mode 100644 cryptography/substitution_cipher/golang/main.go create mode 100644 cryptography/substitution_cipher/golang/substitution.go create mode 100644 cryptography/substitution_cipher/golang/substitution_test.go diff --git a/cryptography/substitution_cipher/golang/main.go b/cryptography/substitution_cipher/golang/main.go new file mode 100644 index 0000000000..7905807777 --- /dev/null +++ b/cryptography/substitution_cipher/golang/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + +} diff --git a/cryptography/substitution_cipher/golang/substitution.go b/cryptography/substitution_cipher/golang/substitution.go new file mode 100644 index 0000000000..85f0393b7b --- /dev/null +++ b/cryptography/substitution_cipher/golang/substitution.go @@ -0,0 +1 @@ +package main \ No newline at end of file diff --git a/cryptography/substitution_cipher/golang/substitution_test.go b/cryptography/substitution_cipher/golang/substitution_test.go new file mode 100644 index 0000000000..85f0393b7b --- /dev/null +++ b/cryptography/substitution_cipher/golang/substitution_test.go @@ -0,0 +1 @@ +package main \ No newline at end of file From 0c0884767c44a4bdff01da690e2abd64160b4a70 Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 14:48:37 +0200 Subject: [PATCH 032/355] Moved cipher into different file --- cryptography/caesar_cipher/golang/caesar.go | 26 +++++++++++++++++++ .../golang/{main_test.go => caesar_test.go} | 0 cryptography/caesar_cipher/golang/main.go | 24 ----------------- 3 files changed, 26 insertions(+), 24 deletions(-) create mode 100644 cryptography/caesar_cipher/golang/caesar.go rename cryptography/caesar_cipher/golang/{main_test.go => caesar_test.go} (100%) diff --git a/cryptography/caesar_cipher/golang/caesar.go b/cryptography/caesar_cipher/golang/caesar.go new file mode 100644 index 0000000000..53880e5371 --- /dev/null +++ b/cryptography/caesar_cipher/golang/caesar.go @@ -0,0 +1,26 @@ +package main + +import "strings" + +// Caesar cipher +func Caesar(text string, s int) string { + coded := make([]byte, 0, len(text)) + for i := range strings.ToLower(text) { + coded = append(coded, shift(text[i], s)) + } + return string(coded) +} + +func shift(r byte, shift int) byte { + if r == ' ' { + return ' ' + } + c := int(r) + shift + if c > 'z' { + return byte(c - 26) + } + if c < 'a' { + return byte(c + 26) + } + return byte(c) +} diff --git a/cryptography/caesar_cipher/golang/main_test.go b/cryptography/caesar_cipher/golang/caesar_test.go similarity index 100% rename from cryptography/caesar_cipher/golang/main_test.go rename to cryptography/caesar_cipher/golang/caesar_test.go diff --git a/cryptography/caesar_cipher/golang/main.go b/cryptography/caesar_cipher/golang/main.go index f4ff05df53..48f424ca06 100644 --- a/cryptography/caesar_cipher/golang/main.go +++ b/cryptography/caesar_cipher/golang/main.go @@ -1,30 +1,6 @@ package main import "fmt" -import "strings" - -// Caesar cipher -func Caesar(text string, s int) string { - coded := make([]byte, 0, len(text)) - for i := range strings.ToLower(text) { - coded = append(coded, shift(text[i], s)) - } - return string(coded) -} - -func shift(r byte, shift int) byte { - if r == ' ' { - return ' ' - } - c := int(r) + shift - if c > 'z' { - return byte(c - 26) - } - if c < 'a' { - return byte(c + 26) - } - return byte(c) -} func main() { fmt.Println(Caesar("test", 3)) From 33699aaccff1fec7923a005db392d2dbc57dbb38 Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 14:50:41 +0200 Subject: [PATCH 033/355] Moved the search into a different file --- search/linear_search/golang/linear.go | 17 +++++++++++++++++ .../golang/{main_test.go => linear_test.go} | 0 search/linear_search/golang/main.go | 15 --------------- 3 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 search/linear_search/golang/linear.go rename search/linear_search/golang/{main_test.go => linear_test.go} (100%) diff --git a/search/linear_search/golang/linear.go b/search/linear_search/golang/linear.go new file mode 100644 index 0000000000..1db930c682 --- /dev/null +++ b/search/linear_search/golang/linear.go @@ -0,0 +1,17 @@ +package main + +import "errors" + +// ErrNotFound is the value when the item is not in the list +var ErrNotFound = errors.New("not found") + +// LinearSearch sequentially checks each element of a list until +// the correct element is found or until all elements have been searched +func LinearSearch(nums []int, x int) (int, error) { + for i, num := range nums { + if num == x { + return i, nil + } + } + return 0, ErrNotFound +} diff --git a/search/linear_search/golang/main_test.go b/search/linear_search/golang/linear_test.go similarity index 100% rename from search/linear_search/golang/main_test.go rename to search/linear_search/golang/linear_test.go diff --git a/search/linear_search/golang/main.go b/search/linear_search/golang/main.go index 8d72417467..5196e38ea6 100644 --- a/search/linear_search/golang/main.go +++ b/search/linear_search/golang/main.go @@ -1,11 +1,7 @@ package main -import "errors" import "fmt" -// ErrNotFound is the value when the item is not in the list -var ErrNotFound = errors.New("not found") - func main() { nums := []int{3, 4, 5, 66, 42, 443, 4, 54, 6} item := 42 @@ -17,14 +13,3 @@ func main() { fmt.Printf("%d found on index: %d\n", item, idx) } - -// LinearSearch sequentially checks each element of a list until -// the correct element is found or until all elements have been searched -func LinearSearch(nums []int, x int) (int, error) { - for i, num := range nums { - if num == x { - return i, nil - } - } - return 0, ErrNotFound -} From 9dab75e2d0fc8987f8512d10474f4dccbd8fca17 Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 15:22:40 +0200 Subject: [PATCH 034/355] Added substitution cipher --- .../golang/substitution.go | 57 ++++++++++++++++++- .../golang/substitution_test.go | 52 ++++++++++++++++- 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/cryptography/substitution_cipher/golang/substitution.go b/cryptography/substitution_cipher/golang/substitution.go index 85f0393b7b..b13081d8bf 100644 --- a/cryptography/substitution_cipher/golang/substitution.go +++ b/cryptography/substitution_cipher/golang/substitution.go @@ -1 +1,56 @@ -package main \ No newline at end of file +package main + +import "errors" + +var encAlphabet = []byte("abcdefghijklmnopqrstuvwxyz ") +var decAlphabet = []byte("zyxwvutsrqponmlkjihgfedcba ") + +// ErrWrongAlphabet a char from text is not found in the encryption alphabet +var ErrWrongAlphabet = errors.New("char not fond in alphabet") + +// ErrSizeMissmatch encryption and decryption alphabet sizes are not equal +var ErrSizeMissmatch = errors.New("alphabet size missmatch") + +// SubstitutionCipher stores the encryption and decryption alphabets +type SubstitutionCipher struct { + encriptionAlphabet []byte + decriptionAlphabet []byte +} + +// Encrypt the given text with alphabet +func (sc SubstitutionCipher) Encrypt(text string) (string, error) { + encA := sc.encriptionAlphabet + if sc.encriptionAlphabet == nil { + encA = encAlphabet + } + + decA := sc.decriptionAlphabet + if sc.decriptionAlphabet == nil { + decA = decAlphabet + } + + if len(encA) != len(decA) { + return "", ErrSizeMissmatch + } + + encoded := make([]byte, 0, len(text)) + var idx int + var err error + for i := range text { + idx, err = getIndex(encA, text[i]) + if err != nil { + return "", err + } + encoded = append(encoded, decA[idx]) + } + return string(encoded), nil +} + +func getIndex(alphabet []byte, chr byte) (int, error) { + for i, a := range alphabet { + if a == chr { + return i, nil + } + } + return 0, ErrWrongAlphabet +} diff --git a/cryptography/substitution_cipher/golang/substitution_test.go b/cryptography/substitution_cipher/golang/substitution_test.go index 85f0393b7b..5f188c156d 100644 --- a/cryptography/substitution_cipher/golang/substitution_test.go +++ b/cryptography/substitution_cipher/golang/substitution_test.go @@ -1 +1,51 @@ -package main \ No newline at end of file +package main + +import "testing" + +func TestEncrypt(t *testing.T) { + testTable := []struct { + Input string + Output string + Error error + }{ + {"test", "gvhg", nil}, + {"gvhg", "test", nil}, + {"test space", "gvhg hkzxv", nil}, + } + + var st SubstitutionCipher + for _, tt := range testTable { + out, err := st.Encrypt(tt.Input) + if out != tt.Output { + t.Errorf("Invalid output! Expected: %s, Got: %s", tt.Output, out) + } + + if err != tt.Error { + t.Errorf("Invalid error! Expected: %v, Got: %v", tt.Error, err) + } + } +} + +func TestAlphabetSizeMissmatch(t *testing.T) { + + var st SubstitutionCipher + st.encriptionAlphabet = []byte("smaller") + st.decriptionAlphabet = []byte("longer alphabet") + + _, err := st.Encrypt("test") + if err != ErrSizeMissmatch { + t.Errorf("Wrong alphabet error! Expected: %v, Got: %v", ErrSizeMissmatch, err) + } +} + +func TestWrongAlphabet(t *testing.T) { + + var st SubstitutionCipher + st.encriptionAlphabet = []byte("wrong alpha") + st.decriptionAlphabet = []byte("wrong alpha") + + _, err := st.Encrypt("q") + if err != ErrWrongAlphabet { + t.Errorf("Wrong alphabet error! Expected: %v, Got: %v", ErrWrongAlphabet, err) + } +} From 7e1bea44232c6e91631f626684a4312dc4d3f436 Mon Sep 17 00:00:00 2001 From: gerifield Date: Fri, 13 Oct 2017 15:27:10 +0200 Subject: [PATCH 035/355] Added some examples --- .../substitution_cipher/golang/main.go | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cryptography/substitution_cipher/golang/main.go b/cryptography/substitution_cipher/golang/main.go index 7905807777..400d0f8ab4 100644 --- a/cryptography/substitution_cipher/golang/main.go +++ b/cryptography/substitution_cipher/golang/main.go @@ -1,5 +1,26 @@ package main +import "fmt" + func main() { + var st SubstitutionCipher + enc, err := st.Encrypt("hello world") + if err != nil { + fmt.Println(err) + return + } + fmt.Println(enc) + + dec, err := st.Encrypt(enc) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(dec) + var st2 SubstitutionCipher + st2.encriptionAlphabet = []byte("1234567890") + st2.decriptionAlphabet = []byte("0987123456") + enc2, _ := st2.Encrypt("1234567890") + fmt.Println(enc2) } From 92e536ac0b1e9b73e7802d143ee140f672bdc2fd Mon Sep 17 00:00:00 2001 From: tanmaydarmorha Date: Fri, 13 Oct 2017 23:10:35 +0530 Subject: [PATCH 036/355] Implemented armstrong number in java --- .../java/ArmstrongNumber.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 math/armstrong_number/java/ArmstrongNumber.java diff --git a/math/armstrong_number/java/ArmstrongNumber.java b/math/armstrong_number/java/ArmstrongNumber.java new file mode 100644 index 0000000000..4c577e65d3 --- /dev/null +++ b/math/armstrong_number/java/ArmstrongNumber.java @@ -0,0 +1,30 @@ +import java.util.Scanner; + +public class ArmstrongNumber { + + public static void main(String[] args) { + Scanner s = new Scanner(System.in); + + int num = s.nextInt(); + int toCheck = num; + int toCountDigits = num; + int n = 0; + while (toCountDigits > 0) { + toCountDigits /= 10; + n++; + } + int sum = 0; + while (num > 0) { + int r = num % 10; + sum += Math.pow(r, n); + num /= 10; + } + if (sum == toCheck) { + System.out.println("It is an armstrong number"); + } else { + System.out.println("It is an not armstrong number"); + } + s.close(); + + } +} From 49b7756580170977da2a105ad1c6069f30b5a3c9 Mon Sep 17 00:00:00 2001 From: Vivek Iyer Date: Sat, 14 Oct 2017 01:14:50 +0530 Subject: [PATCH 037/355] Pushed rod-Cutting problem dp implementation --- dp/rod_cutting/C/rodCutting.c | 52 ++++++++++++++++++++++++++ dp/rod_cutting/README.md | 6 +++ dp/rod_cutting/rodcutting-example.jpg | Bin 0 -> 538342 bytes 3 files changed, 58 insertions(+) create mode 100644 dp/rod_cutting/C/rodCutting.c create mode 100644 dp/rod_cutting/README.md create mode 100644 dp/rod_cutting/rodcutting-example.jpg diff --git a/dp/rod_cutting/C/rodCutting.c b/dp/rod_cutting/C/rodCutting.c new file mode 100644 index 0000000000..65a3189627 --- /dev/null +++ b/dp/rod_cutting/C/rodCutting.c @@ -0,0 +1,52 @@ +#include + +const int INF=-500000000; + +long long int max(long long int a, long long int b) +{ + return (a=0) + return r[n]; + + if(n==0) + q=0; + else + q=INF; + + /* Finds the maximum price by iterating through the array and getting the sum of p[i] + (which is the price obtained by selling that part of the rod directly) and the optimal + solution for the rod of length (n-i) */ + + for(i=1; i<=n; i++) + q=max(q,p[i] + topDownRodCutting(p,r,n-i)); + + // Memoizing + r[n]=q; + return r[n]; +} + +int main() +{ + int i,n; + printf("Enter the length of the rod\n"); + scanf("%d",&n); + int p[n],r[n+1]; + printf("Enter the prices array\n"); + for(i=1; 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

X<2zqNYdOX%NLb|bMnf|nyQ0lb!Ahy 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 JWN;*n{|~pe{}})P literal 0 HcmV?d00001 From 5f2448932162f27db69e7ce7abf864f3515554a2 Mon Sep 17 00:00:00 2001 From: brian Date: Mon, 16 Oct 2017 16:56:41 -0400 Subject: [PATCH 199/355] Added selection sort in ruby --- sort/selection_sort/ruby/selection_sort.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 sort/selection_sort/ruby/selection_sort.rb diff --git a/sort/selection_sort/ruby/selection_sort.rb b/sort/selection_sort/ruby/selection_sort.rb new file mode 100644 index 0000000000..f1435119ae --- /dev/null +++ b/sort/selection_sort/ruby/selection_sort.rb @@ -0,0 +1,21 @@ +def selection_sort(arr) + return arr if arr.length <= 1 + + min_idx = nil + + (0..arr.length-2).each do |i| + min_idx = i + j = i + 1 + while j < arr.length + if arr[j] < arr[min_idx] + min_idx = j + end + j += 1 + end + arr[i], arr[min_idx] = arr[min_idx], arr[i] + end + arr +end + +arr = [6,5,3,1,8,7,2,4]; +p selection_sort(arr); From 0e0b4ae15847ee252fe0f7c1a2607530b69ba92f Mon Sep 17 00:00:00 2001 From: Logan Daw <12955529+ldaw@users.noreply.github.com> Date: Mon, 16 Oct 2017 17:15:52 -0400 Subject: [PATCH 200/355] Createded Interpolation Search implementation in C++ --- .../c++/interpolation_search.cpp | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 search/interpolation_search/c++/interpolation_search.cpp diff --git a/search/interpolation_search/c++/interpolation_search.cpp b/search/interpolation_search/c++/interpolation_search.cpp new file mode 100644 index 0000000000..c31a60011c --- /dev/null +++ b/search/interpolation_search/c++/interpolation_search.cpp @@ -0,0 +1,42 @@ +#include + +// C++ implementation of interpolation search +// Pass a sorted integer array, length of the array, and value of the target +// Returns index of the target if it is found, otherwise returns -1 +int interpolationSearch(int* arr, int length, int target) +{ + // Find indices of first and last elements + int low = 0, high = length - 1; + + // Loop until the target is found or it is determined that the target cannot exist in the array + while (low <= high && target >= arr[low] && target <= arr[high]) + { + // Interpolate a position + int pos = low + ( (target-arr[low]) * (high-low) / (arr[high]-arr[low]) ); + + // Check if position of target is found yet + if (arr[pos] == target) + return pos; + + // Otherwise, determine if target is above or below the interpolated position and adjust indices accordingly + if (arr[pos] > target) + high = pos - 1; + else + low = pos + 1; + } + return -1; +} + + +// Driver, searching for 35 as an example +int main() +{ + int arr[14] = {1, 3, 7, 12, 14, 19, 23, 26, 30, 34, 35, 39, 46, 53}; + int length = sizeof(arr)/sizeof(int); + int target = 35; // Feel free to change this value + + std::cout << interpolationSearch(arr, length, target); + return 0; +} + + From 7b0f4f2ea71af6572f9f6b5a65b68eea85fee54d Mon Sep 17 00:00:00 2001 From: Logan Daw <12955529+ldaw@users.noreply.github.com> Date: Mon, 16 Oct 2017 17:20:30 -0400 Subject: [PATCH 201/355] Revert "Createded Interpolation Search implementation in C++" This reverts commit 0e0b4ae15847ee252fe0f7c1a2607530b69ba92f. --- .../c++/interpolation_search.cpp | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 search/interpolation_search/c++/interpolation_search.cpp diff --git a/search/interpolation_search/c++/interpolation_search.cpp b/search/interpolation_search/c++/interpolation_search.cpp deleted file mode 100644 index c31a60011c..0000000000 --- a/search/interpolation_search/c++/interpolation_search.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include - -// C++ implementation of interpolation search -// Pass a sorted integer array, length of the array, and value of the target -// Returns index of the target if it is found, otherwise returns -1 -int interpolationSearch(int* arr, int length, int target) -{ - // Find indices of first and last elements - int low = 0, high = length - 1; - - // Loop until the target is found or it is determined that the target cannot exist in the array - while (low <= high && target >= arr[low] && target <= arr[high]) - { - // Interpolate a position - int pos = low + ( (target-arr[low]) * (high-low) / (arr[high]-arr[low]) ); - - // Check if position of target is found yet - if (arr[pos] == target) - return pos; - - // Otherwise, determine if target is above or below the interpolated position and adjust indices accordingly - if (arr[pos] > target) - high = pos - 1; - else - low = pos + 1; - } - return -1; -} - - -// Driver, searching for 35 as an example -int main() -{ - int arr[14] = {1, 3, 7, 12, 14, 19, 23, 26, 30, 34, 35, 39, 46, 53}; - int length = sizeof(arr)/sizeof(int); - int target = 35; // Feel free to change this value - - std::cout << interpolationSearch(arr, length, target); - return 0; -} - - From 96623aebd8884a4d4f30295535a532cec530dbfb Mon Sep 17 00:00:00 2001 From: Logan Daw <12955529+ldaw@users.noreply.github.com> Date: Mon, 16 Oct 2017 17:20:59 -0400 Subject: [PATCH 202/355] Created Interpolation Search implementation in C++ --- .../c++/interpolation_search.cpp | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 search/interpolation_search/c++/interpolation_search.cpp diff --git a/search/interpolation_search/c++/interpolation_search.cpp b/search/interpolation_search/c++/interpolation_search.cpp new file mode 100644 index 0000000000..c31a60011c --- /dev/null +++ b/search/interpolation_search/c++/interpolation_search.cpp @@ -0,0 +1,42 @@ +#include + +// C++ implementation of interpolation search +// Pass a sorted integer array, length of the array, and value of the target +// Returns index of the target if it is found, otherwise returns -1 +int interpolationSearch(int* arr, int length, int target) +{ + // Find indices of first and last elements + int low = 0, high = length - 1; + + // Loop until the target is found or it is determined that the target cannot exist in the array + while (low <= high && target >= arr[low] && target <= arr[high]) + { + // Interpolate a position + int pos = low + ( (target-arr[low]) * (high-low) / (arr[high]-arr[low]) ); + + // Check if position of target is found yet + if (arr[pos] == target) + return pos; + + // Otherwise, determine if target is above or below the interpolated position and adjust indices accordingly + if (arr[pos] > target) + high = pos - 1; + else + low = pos + 1; + } + return -1; +} + + +// Driver, searching for 35 as an example +int main() +{ + int arr[14] = {1, 3, 7, 12, 14, 19, 23, 26, 30, 34, 35, 39, 46, 53}; + int length = sizeof(arr)/sizeof(int); + int target = 35; // Feel free to change this value + + std::cout << interpolationSearch(arr, length, target); + return 0; +} + + From d1a79774306c07d2fd2744f840f1778ec5e0e576 Mon Sep 17 00:00:00 2001 From: Void Date: Mon, 16 Oct 2017 23:45:02 -0200 Subject: [PATCH 203/355] c atbash cipher :3 --- cryptography/atbash_cipher/c/atbash_cipher.c | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 cryptography/atbash_cipher/c/atbash_cipher.c diff --git a/cryptography/atbash_cipher/c/atbash_cipher.c b/cryptography/atbash_cipher/c/atbash_cipher.c new file mode 100644 index 0000000000..7bcd730e45 --- /dev/null +++ b/cryptography/atbash_cipher/c/atbash_cipher.c @@ -0,0 +1,24 @@ +#include +#include + +char cipher (char c){ + if(c >= 65 && c<= 90){ // 65 is "A" on ASCII table, 90 is Z + c = c - 65; + c = 90 - c; + }else if( c >= 97 && c<= 122){ // 97 is "a" on ASCII table, 122 is "z" + c = c-97; + c = 122 - c; + } + return c; +} + +int main(int argc, char *argv[]){ + int b = 0; + if (argc == 2){ + for (b=0; b Date: Tue, 17 Oct 2017 13:30:33 +0530 Subject: [PATCH 204/355] Catalan Numbers in Python2 --- math/catalan/python/catalan.py | 15 +++++++++++++++ math/catalan/python/catalan.pyc | Bin 0 -> 541 bytes math/catalan/python/test.py | 8 ++++++++ 3 files changed, 23 insertions(+) create mode 100644 math/catalan/python/catalan.py create mode 100644 math/catalan/python/catalan.pyc create mode 100644 math/catalan/python/test.py diff --git a/math/catalan/python/catalan.py b/math/catalan/python/catalan.py new file mode 100644 index 0000000000..ebe69eb822 --- /dev/null +++ b/math/catalan/python/catalan.py @@ -0,0 +1,15 @@ +def catalan (n): + if n <= 1: + return 1 + + num = 1 + for i in range(n + 1, 2 * n + 1): + num *= i + + den = 1 + for i in range(1, n + 1): + den *= i + + res = (num / den) / (n + 1) + + return res \ No newline at end of file diff --git a/math/catalan/python/catalan.pyc b/math/catalan/python/catalan.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44a1e83f724e420befd23e1d31761b2742dd5973 GIT binary patch literal 541 zcmcJJ%}T>S6ov03v5HtJ(o%3K2-(zyJ4HljK^M}6B1IX&Gzrbn{MgI{T4+|f@`-#Q zpTHOJ+-ZxxfPs7F-h0kWKKHx1JO2E73~BudoL4B_ghWK|L{Df0-TMwUA^Te>57kHM z56IFcrh>|rjUrwPn)k?Tyl&)hstu?6=Fs4|MKv~pmJXdEJ3FNj-*Rbw%(u|59{rnk zS811KFErx2E_K$aPVLds1EdR_p<+tKygqk^fy*GD#6EY1ce&wYUS)Ptc8cQFwv4q8 zldR}lbp3PrpyN`@p_(Qtm4hOzGNiS%t^O zz8Oz2ZsWnV%OtuDA+aYsry-8SKJ*ZJ;0!JNT?6hf&Ob5j;3pSZ5mjk?X`z_u2Mo?} A4gdfE literal 0 HcmV?d00001 diff --git a/math/catalan/python/test.py b/math/catalan/python/test.py new file mode 100644 index 0000000000..840c4d24d2 --- /dev/null +++ b/math/catalan/python/test.py @@ -0,0 +1,8 @@ +#1 /usr/bin/python + +from catalan import catalan + +if __name__ == "__main__": + + for i in range(10): + print("catalan({}) == {}".format(i, catalan(i))) \ No newline at end of file From 24a51a3d8507b24aaba7a203a7beb3b9b79cf4a6 Mon Sep 17 00:00:00 2001 From: prachihassija Date: Tue, 17 Oct 2017 13:37:28 +0530 Subject: [PATCH 205/355] Eulers Totient In Python2 --- .../python/eulers_totient.py | 14 ++++++++++++++ math/eulers_totient_function/python/test.py | 5 +++++ 2 files changed, 19 insertions(+) create mode 100644 math/eulers_totient_function/python/eulers_totient.py create mode 100644 math/eulers_totient_function/python/test.py diff --git a/math/eulers_totient_function/python/eulers_totient.py b/math/eulers_totient_function/python/eulers_totient.py new file mode 100644 index 0000000000..49bcbd65d1 --- /dev/null +++ b/math/eulers_totient_function/python/eulers_totient.py @@ -0,0 +1,14 @@ +def gcd(a, b): + if a == 0: + return b + + return gcd(b % a, a) + +def phi(n): + res = 1 + + for i in range(2, n): + if gcd(i, n) == 1: + res += 1 + + return res \ No newline at end of file diff --git a/math/eulers_totient_function/python/test.py b/math/eulers_totient_function/python/test.py new file mode 100644 index 0000000000..b69dd4b3ab --- /dev/null +++ b/math/eulers_totient_function/python/test.py @@ -0,0 +1,5 @@ +from eulers_totient import phi + +if __name__ == "__main__": + for i in range(1, 11): + print ("phi({}) == {}".format(i, phi(i))) \ No newline at end of file From 6e49d1a2373cb9ec2e7d69c703bb233ab4f6015a Mon Sep 17 00:00:00 2001 From: prachihassija Date: Tue, 17 Oct 2017 13:45:00 +0530 Subject: [PATCH 206/355] Primality Check in Pytohn2 --- math/is_prime/python/prime.py | 13 +++++++++++++ math/is_prime/python/test.py | 9 +++++++++ 2 files changed, 22 insertions(+) create mode 100644 math/is_prime/python/prime.py create mode 100644 math/is_prime/python/test.py diff --git a/math/is_prime/python/prime.py b/math/is_prime/python/prime.py new file mode 100644 index 0000000000..1255c1426d --- /dev/null +++ b/math/is_prime/python/prime.py @@ -0,0 +1,13 @@ +def is_prime(n): + if n < 2: + return False + + i = 2 + + while i * i <= n: + if n % i == 0: + return False + + i += 1 + + return True \ No newline at end of file diff --git a/math/is_prime/python/test.py b/math/is_prime/python/test.py new file mode 100644 index 0000000000..0d631454fd --- /dev/null +++ b/math/is_prime/python/test.py @@ -0,0 +1,9 @@ +from prime import is_prime + +if __name__ == "__main__": + + for i in range(11): + if is_prime(i): + print ("{} is prime".format(i)) + else: + print ("{} is not prime".format(i)) \ No newline at end of file From 4927d989a86ab6d588f484ae44348d6524c8255a Mon Sep 17 00:00:00 2001 From: prachihassija Date: Tue, 17 Oct 2017 13:56:17 +0530 Subject: [PATCH 207/355] Pernicious in C++ --- math/pernicious_number/c++/pernicious.hpp | 23 +++++++++++++++++++++++ math/pernicious_number/c++/test.cpp | 16 ++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 math/pernicious_number/c++/pernicious.hpp create mode 100644 math/pernicious_number/c++/test.cpp diff --git a/math/pernicious_number/c++/pernicious.hpp b/math/pernicious_number/c++/pernicious.hpp new file mode 100644 index 0000000000..06b6833409 --- /dev/null +++ b/math/pernicious_number/c++/pernicious.hpp @@ -0,0 +1,23 @@ +#ifndef __PERNICIOUS_HPP__ +#define __PERNICIOUS_HPP__ + +bool is_prime(int n) +{ + if (n < 2) + return false; + + for (int i = 2; i * i <= n; i++) + if (n % i == 0) + return false; + + return true; +} + +bool is_pernicious(long long int n) +{ + int bits = __builtin_popcount(n); + + return is_prime(bits); +} + +#endif \ No newline at end of file diff --git a/math/pernicious_number/c++/test.cpp b/math/pernicious_number/c++/test.cpp new file mode 100644 index 0000000000..eb9de2c42f --- /dev/null +++ b/math/pernicious_number/c++/test.cpp @@ -0,0 +1,16 @@ +#include + +#include "pernicious.hpp" + +using namespace std; + +int main() +{ + for (int i = 0; i <= 19; i++) + if (is_pernicious(i)) + cout << i << " is pernicious" << endl; + else + cout << i << " is not pernicious" << endl; + + return 0; +} \ No newline at end of file From fea3e041cde0f49b6d09b24f77ec20dc8046024c Mon Sep 17 00:00:00 2001 From: vaibhavdaren Date: Tue, 17 Oct 2017 14:55:58 +0530 Subject: [PATCH 208/355] added rsa implementation in c #232 --- cryptography/RSA/c/rsa.c | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 cryptography/RSA/c/rsa.c diff --git a/cryptography/RSA/c/rsa.c b/cryptography/RSA/c/rsa.c new file mode 100644 index 0000000000..1cd32e3f45 --- /dev/null +++ b/cryptography/RSA/c/rsa.c @@ -0,0 +1,59 @@ +// C program for RSA asymmetric cryptographic +// algorithm. For demonstration values are relatively +// small compared to practical application +#include +#include + +// Returns gcd of a and b +int gcd(int a, int b) +{ + if (a == 0) + return b; + return gcd(b%a, a); +} + +// Code to demonstrate RSA algorithm +int main() +{ + // Two random prime numbers + double p = 3; + double q = 7; + + // First part of public key: + double n = p*q; + + // Finding other part of public key. + // e stands for encrypt + double e = 2; + double phi = (p-1)*(q-1); + while (e < phi) + { + // e must be co-prime to phi and + // smaller than phi. + if (gcd(e, phi)==1) + break; + else + e++; + } + + // Private key (d stands for decrypt) + int k = 2; // A constant value + double d = (1 + (k*phi))/e; + + // Message to be encrypted + double msg = 12; + printf("Message data = %lf",msg); + + // Encryption c = (msg ^ e) % n + double c = pow(msg, e); + c = fmod(c, n); + printf("\nEncrypted data = %lf", c); + + // Decryption m = (c ^ d) % n + double m = pow(c, d); + m = fmod(m, n); + printf("\nOriginal Message Sent = %lf",m); + + return 0; +} +// This code is contributed by Akash Sharan. From ce33073026a79a02838ca238da3b23566fcee627 Mon Sep 17 00:00:00 2001 From: vaibhavdaren Date: Tue, 17 Oct 2017 14:59:10 +0530 Subject: [PATCH 209/355] added readme for rsa --- cryptography/RSA/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 cryptography/RSA/README.md diff --git a/cryptography/RSA/README.md b/cryptography/RSA/README.md new file mode 100644 index 0000000000..a903c0716c --- /dev/null +++ b/cryptography/RSA/README.md @@ -0,0 +1,12 @@ +RSA Algorithm in Cryptography + +RSA algorithm is asymmetric cryptography algorithm. Asymmetric actually means that it works on two different keys i.e. Public Key and Private Key. As the name describes that the Public Key is given to everyone and Private key is kept private. + +An example of asymmetric cryptography : + +A client (for example browser) sends its public key to the server and requests for some data. +The server encrypts the data using client’s public key and sends the encrypted data. +Client receives this data and decrypts it. +Since this is asymmetric, nobody else except browser can decrypt the data even if a third party has public key of browser. + +The idea! The idea of RSA is based on the fact that it is difficult to factorize a large integer. The public key consists of two numbers where one number is multiplication of two large prime numbers. And private key is also derived from the same two prime numbers. So if somebody can factorize the large number, the private key is compromised. Therefore encryption strength totally lies on the key size and if we double or triple the key size, the strength of encryption increases exponentially. RSA keys can be typically 1024 or 2048 bits long, but experts believe that 1024 bit keys could be broken in the near future. But till now it seems to be an infeasible task From 035519826b49c01efe981f6042e6f1cab5dd04fb Mon Sep 17 00:00:00 2001 From: vaibhavdaren Date: Tue, 17 Oct 2017 15:02:27 +0530 Subject: [PATCH 210/355] Update README.md --- cryptography/RSA/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cryptography/RSA/README.md b/cryptography/RSA/README.md index a903c0716c..3982ad1cc8 100644 --- a/cryptography/RSA/README.md +++ b/cryptography/RSA/README.md @@ -1,4 +1,4 @@ -RSA Algorithm in Cryptography +# RSA Algorithm in Cryptography RSA algorithm is asymmetric cryptography algorithm. Asymmetric actually means that it works on two different keys i.e. Public Key and Private Key. As the name describes that the Public Key is given to everyone and Private key is kept private. From 065ac9dcdf7f32d5d3bc8edb0a4ba567a2687b8d Mon Sep 17 00:00:00 2001 From: rajiv2605 Date: Tue, 17 Oct 2017 15:14:04 +0530 Subject: [PATCH 211/355] Added cpp to histogram equalization --- .../histogram_equalization/cpp/HistogramEqualization.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 image_processing/histogram_equalization/cpp/HistogramEqualization.cpp diff --git a/image_processing/histogram_equalization/cpp/HistogramEqualization.cpp b/image_processing/histogram_equalization/cpp/HistogramEqualization.cpp new file mode 100644 index 0000000000..e69de29bb2 From c95bb322fcd40363c2144ccd4f75ea4f3c2fe3d0 Mon Sep 17 00:00:00 2001 From: "Apurva N. Saraogi" Date: Tue, 17 Oct 2017 15:40:10 +0530 Subject: [PATCH 212/355] Added Efficient Version of Bubble Sort C++ --- sort/bubble_sort/c++/efficientbubblesort.cpp | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 sort/bubble_sort/c++/efficientbubblesort.cpp diff --git a/sort/bubble_sort/c++/efficientbubblesort.cpp b/sort/bubble_sort/c++/efficientbubblesort.cpp new file mode 100644 index 0000000000..1b53b72f46 --- /dev/null +++ b/sort/bubble_sort/c++/efficientbubblesort.cpp @@ -0,0 +1,53 @@ +#include +using namespace std; + +void bubbleSort(vector &v){ + int size = v.size(); + + for(int i=0; iv[j+1]){ + swap(v[j],v[j+1]); + isSorted = 0; + } + } + + for(int j=size-2; j>=i; j--){ + if(v[j]>v[j+1]){ + swap(v[j],v[j+1]); + isSorted = 0; + } + } + + if(isSorted) break; + + } + /* + In this implementation, + Modification From Normal Bubble Sort: + 1) Sorting From Both the Sides Simultaneously + 2) A variable isSorted which automatically breaks out of loop when elements get sorted reducing the total number of iterations. + */ +} + +int main(){ + int n; + cout<<"Enter the number of elements you want to enter: "<>n; + vector v(n); + cout<<"Enter the elements: "<>v[i]; + } + + bubbleSort(v); + cout<<"Sorted Elements: "< Date: Tue, 17 Oct 2017 15:47:40 +0530 Subject: [PATCH 213/355] Ternary_Heap_cpp_implementation --- data_structures/heap/C++/Ternary_Heap.cpp | 111 ++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 data_structures/heap/C++/Ternary_Heap.cpp diff --git a/data_structures/heap/C++/Ternary_Heap.cpp b/data_structures/heap/C++/Ternary_Heap.cpp new file mode 100644 index 0000000000..55102e764d --- /dev/null +++ b/data_structures/heap/C++/Ternary_Heap.cpp @@ -0,0 +1,111 @@ +#include +using namespace std; + +void swap(int *a,int *b){ + int temp=*a; + *a=*b; + *b=temp; +} + +void minheapify(int H[],int i,int n){ + int left=3*i-1; + int middle=3*i; + int right=3*i+1; + int smallest=i; + if(left<=n && H[left]=0;i--){ + minheapify(H,i,n); + } +} + +void showheap(int H[],int n){ + for(int i=1;i<=n;i++){ + cout<0 && H[i/3]>H[i]){ + swap(&H[i/3],&H[i]); + i=i/3; + } +} + +int delete_min(int H[],int& n){ + int min=H[1]; + swap(&H[1],&H[n]); + n=n-1; + minheapify(H,1,n); + return min; +} + +void ksmallest(int H[],int& n,int k){ + int A[100]; + int p=n; + for(int i=1;i<=n;i++){ //we will copy heap in another array + A[i]=H[i]; + } + int a; + for(int j=0;j>n; + for(int i=1;i<=n;i++){ + cin>>H[i]; + } + cin>>k; + cin>>a; + buildheap(H,n); + cout< Date: Tue, 17 Oct 2017 13:31:24 +0300 Subject: [PATCH 214/355] towers of hanoi in php --- math/towers_of_hanoi/php/towers_of_hanoi.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 math/towers_of_hanoi/php/towers_of_hanoi.php diff --git a/math/towers_of_hanoi/php/towers_of_hanoi.php b/math/towers_of_hanoi/php/towers_of_hanoi.php new file mode 100644 index 0000000000..5f2b660112 --- /dev/null +++ b/math/towers_of_hanoi/php/towers_of_hanoi.php @@ -0,0 +1,14 @@ += 1){ + move($n-1, $src,$temp, $dest); + printf("Moving %d -> %d ",$src, $dest); + echo "
"; + move($n-1, $temp , $dest , $src); + } +} + +move(3,1,3,2); + +?> \ No newline at end of file From 74537770fe44d38a5fb3291960372cae040b6deb Mon Sep 17 00:00:00 2001 From: "Apurva N. Saraogi" Date: Tue, 17 Oct 2017 16:19:41 +0530 Subject: [PATCH 215/355] Adding QuickSort2 C++ --- sort/quick_sort/c++/quicksort2.cpp | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 sort/quick_sort/c++/quicksort2.cpp diff --git a/sort/quick_sort/c++/quicksort2.cpp b/sort/quick_sort/c++/quicksort2.cpp new file mode 100644 index 0000000000..705442e99a --- /dev/null +++ b/sort/quick_sort/c++/quicksort2.cpp @@ -0,0 +1,45 @@ +#include +using namespace std; + +int partition (vector &v, int low, int high){ + int pivot = v[high]; + int i = (low - 1); + + for (int j = low; j <= high- 1; j++){ + if (v[j] <= pivot){ + i++; // increment index of smaller element + swap(v[i], v[j]); + } + } + swap(v[i + 1], v[high]); + return (i + 1); +} + +void quickSort(vector &v, int low, int high){ + if (low < high){ + int pi = partition(v, low, high); + quickSort(v, low, pi - 1); + quickSort(v, pi + 1, high); + //pi => partition index + } +} + + +int main(){ + int n; + cout<<"Enter the number of elements you want to enter: "<>n;tim + vector v(n); + cout<<"Enter the elements: "<>v[i]; + } + + quickSort(v,0,n-1); + cout<<"Sorted Elements: "< Date: Tue, 17 Oct 2017 16:23:38 +0530 Subject: [PATCH 216/355] Add changes to README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 32a06b9db0..4eb23d07bb 100644 --- a/README.md +++ b/README.md @@ -125,8 +125,8 @@ Clean example implementations of data structures and algorithms written in diffe e.g > buble_sort/python/buble_sort.py - * If there is an implementation of the same algorithm in your language, add your username in front of the file name - * Please include a description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps people that are learning new algorithm. + * If there is an implementation of the same algorithm in your language, add your username in front of the file name. + * Please include a description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps people that are learning new algorithm. * Graphical examples would be very helpful too. * Don't forget to include tests. * Don't remove previous implementations of algorithms. Just add a new file with your own implementation. From 594819ac55c5003dbd947bf47dd9d0e67093e0b0 Mon Sep 17 00:00:00 2001 From: roopansh Date: Tue, 17 Oct 2017 17:52:24 +0530 Subject: [PATCH 217/355] Added Binary Search Tree with more functionalities --- data_structures/binarySearch_tree/C++/bst.cpp | 516 ++++++++++++++++++ 1 file changed, 516 insertions(+) create mode 100644 data_structures/binarySearch_tree/C++/bst.cpp diff --git a/data_structures/binarySearch_tree/C++/bst.cpp b/data_structures/binarySearch_tree/C++/bst.cpp new file mode 100644 index 0000000000..83375bdd56 --- /dev/null +++ b/data_structures/binarySearch_tree/C++/bst.cpp @@ -0,0 +1,516 @@ +/************************ + Roopansh Bansal + Computer Science Undergraduate + Indian Institute of Technology Guwahati, India + ************************/ + +#include + +using namespace std; + +struct node +{ + int info; + node *left , *right , *parent; +}; + +class BST +{ +private: + node* Root; + +public: + BST(); +// ~BST(); + + // basic functions : + bool isEmpty();// returning true of the tree is empty otherwise false + node * root();// return the pointer to the tree + node * MakeNode(int x);// creating a node with value x + + //functions to modify tree + void InsertNode(int x);// inserts the node in the binary search tree in it's right position + + // NOT IMPLEMENTED YET + void DeleteNode(node * NodeToDelete); + + //traversals + void InOrderTraversal(node * Node); + void PreOrderTraversal(node * Node); + void PostOrderTraversal(node * Node); + + //Searching the Tree + node *Search(int x); + node *Minimum(node * Node); + node *Maximum(node * Node); + node *Successor(node * Node); + node *Predecessor(node * Node); + + //Speacial Applications + void SearchDulpicate(int x);// prints duplicate entry of inserting a duplicate entry + int LargestLevel(node * Node ,int Level);// largest level having leaf + int SmallestLevel(node * Node ,int Level);// smallest level having leaf + void Leaves(node* Node , int & Count);// counts the number of the leaves in the tree + node * LCA(int n1 , int n2);// Returns the Lowest common ancestor node of n1 and n2 (n1 and n2 lie in the tree) + bool PathToNode(node * Node , int x , vector & v);//Returns the path to the node starting from the node to the root....returns false if the value is not found in the tree + int LCA_GENERALTREE(int v , int w);// calulates the Lowest Common Ancestor of the two nodes v and w + int Diameter(node * Node ,int *Height);// Calculate the diameter of the tree in O(n) running time. +}; + +int main() +{ + BST Tree; + return 0; +} + + +// Constructor of the BST +BST::BST() +{ + // set the root of the tree to null initially + Root = NULL; +} + +// creating a node with value x +node * BST::MakeNode(int x) +{ + // Allocating memory for the new node + node * NewNode = new node; + + // Setting the value to store in that node to 'x' + NewNode->info = x; + + // parent and children are set in the functino which calls this to function to create the node + NewNode->left = NULL; + NewNode->right = NULL; + NewNode->parent = NULL; + + return NewNode; +} + +// returning true of the tree is empty otherwise false +bool BST::isEmpty() +{ + if(Root == NULL) + return true; + else + return false; +} + +// return the pointer to the tree +node * BST::root() +{ + return Root; +} + +// inserts the node in the binary search tree in it's right position +void BST::InsertNode(int x) +{ + // create a new node + node * Node = MakeNode(x); + + // if the tree is empty then set the root to that node. + if(isEmpty()) //Empty tree + { + Root = Node; + } + else // non empty tree + { + // need two pointers to move along the tree and find the correct position + node * p = Root; + node *q = NULL; + + while(p != NULL)// when p is null , we have to insert the new node to that position + { + q = p; + if(x >= p->info) + { + p = q->right; + } + else + { + p = q->left; + } + } + + // atleast one child of q is NULL , to which p points...and we need to insert to that node + if(x >= q->info) + q->right = Node; + else + q->left = Node; + Node->parent = q; + + return ; + } +} + +// Count the number of leaves in the tree +void BST::Leaves(node* Node , int & Count) +{ + // node having no children is a leave + if (Node->left == NULL && Node->right == NULL) + { + Count++; + } + + // if there is a left child , recurse in the left subtree + if(Node->left != NULL) + Leaves(Node->left , Count); + + // if there is a right child , recurse in the right subtree + if(Node->right != NULL) + Leaves(Node->right , Count); + + return ;//return nothing because i've passed a reference to the variable storing the number of leaves as an argument to the function. +} + +// Generates a random binary search tree +void GenerateTree(BST * Tree , int NumOfNodes) +{ + //Generating 100 Numbers and Inserting in the binary tree + for(int j=0;jInsertNode(ToInsert); + } +} + +void BST::DeleteNode(node * NodeToDelete) +{ + /*********************** ************************ + ************************ ************************ + TO BE IMPLEMENTED + ************************ ************************ + ************************ ***********************/ +} + +//Return the node which has it's key = x +node* BST::Search(int x) +{ + if(isEmpty()) + return NULL; + node *NodePtr = Root; + while( NodePtr != NULL && NodePtr->info != x) + { + if(NodePtr->info == x) break; + else if(NodePtr->info <= x) NodePtr=NodePtr->right; + else if(NodePtr->info >= x) NodePtr=NodePtr->left; + } + return NodePtr; +} + +node * BST::Minimum(node * Node) +{ + node * NodePtr = Node; + while(NodePtr->left != NULL) NodePtr = NodePtr->left; + return NodePtr; +} + +node * BST::Maximum(node * Node) +{ + node * NodePtr = Node; + while(NodePtr->right != NULL) NodePtr = NodePtr->right; + return NodePtr; +} + +node * BST::Successor(node * Node) +{ + if(Node->right != NULL) + return Minimum(Node->right); + else + { + node *Parent = Node->parent; + node *Child = Node; + while(Parent != NULL && Parent->right == Child) + { + Child = Parent; + Parent = Parent->parent; + } + return Parent; + } +} + +node *BST::Predecessor(node * Node) +{ + if(Node->left != NULL) + return Minimum(Node->left); + else + { + node *Parent = Node->parent; + node *Child = Node; + while(Parent != NULL && Parent->left == Child) + { + Child = Parent; + Parent = Parent->parent; + } + return Parent; + } + +} + +void BST::InOrderTraversal(node * Node) +{ + if(Node == NULL) + return; + InOrderTraversal(Node->left); + cout<info<<"\t"; + InOrderTraversal(Node->right); +} + +void BST::PreOrderTraversal(node * Node) +{ + if(Node == NULL) + return ; + cout<info<<"\t"; + PreOrderTraversal(Node->left); + PreOrderTraversal(Node->right); +} + +void BST::PostOrderTraversal(node * Node) +{ + if(Node == NULL) + return ; + PostOrderTraversal(Node->left); + PostOrderTraversal(Node->right); + cout<info<<"\t"; +} + +void BST::SearchDulpicate(int x) +{ + node * Node = MakeNode(x); + if(isEmpty()) + { + Root = Node; + } + else + { + node * p = Root; + node *q = NULL; + while(p != NULL) + { + q = p; + if(x == p->info) + { + cout<<"DUPLICATE ENTRY FOUND\t----\t"< p->info) + { + p = q->right; + } + else + { + p = q->left; + } + } + if(x > q->info) + q->right = Node; + else + q->left = Node; + Node->parent = q; + return ; + } +} + +int BST::LargestLevel(node * Node ,int Level) +{ + if(Node->left == NULL && Node->right == NULL) + { + return Level; + } + else if (Node->left == NULL) + { + return LargestLevel( Node->right , Level+1 ); + } + else if (Node->right == NULL) + { + return LargestLevel( Node->left , Level+1 ); + } + else + { + return max(LargestLevel( Node->right , Level+1 ) , LargestLevel( Node->left , Level+1 )); + } +} + +int BST::SmallestLevel(node * Node ,int Level) +{ + if(Node->left == NULL && Node->right == NULL) + { + return Level; + } + else if (Node->left == NULL) + { + return SmallestLevel( Node->right , Level+1 ); + } + else if (Node->right == NULL) + { + return SmallestLevel( Node->left , Level+1 ); + } + else + { + return min(SmallestLevel( Node->right , Level+1 ) , SmallestLevel( Node->left , Level+1 )); + } +} + +node * BST::LCA(int n1 , int n2) +{ + if(isEmpty()) + { + cout<<"Tree is Empty."<info == n1 || Root->info==n2 ) + { + return Root; + } + node * NodePtr = Root; + while(NodePtr) + { + if( NodePtr->info <= n2 && NodePtr->info >= n1 ) + { + return NodePtr; + } + else if ( NodePtr->info <= n1 && NodePtr->info <= n2 ) + { + NodePtr = NodePtr->right; + } + else // NodePtr->info >= n1 && NodePtr->info >= n2 + { + NodePtr = NodePtr->left; + } + } + + return NULL; +} + +//Returns the path to the node starting from the node to the root....returns false if the value is not found in the tree +bool PathToNode(node * Node , int x , vector & v) +{ + if(Node->info == x) + { + v.push_back(Node->info); + return true; + } + + if(Node->left != NULL) + { + if( PathToNode( Node->left , x , v ) ) + { + v.push_back( Node->info ); + return true; + } + } + + if(Node->right != NULL) + { + if( PathToNode( Node->right , x , v ) ) + { + v.push_back( Node->info ); + return true; + } + } + + return false; +} + +int diameterOpt(struct node *root, int* height) +{ + + int lh = 0, rh = 0; + + int ldiameter = 0, rdiameter = 0; + + if(root == NULL) + { + *height = 0; + return 0; + } + + /* Get the heights of left and right subtrees in lh and rh + And store the returned values in ldiameter and ldiameter */ + ldiameter = diameterOpt(root->left, &lh); + rdiameter = diameterOpt(root->right, &rh); + + /* Height of current node is max of heights of left and + right subtrees plus 1*/ + *height = max(lh, rh) + 1; + + return max(lh + rh + 1, max(ldiameter, rdiameter)); +} + + +// Printing LCA on the screen +int BST::LCA_GENERALTREE(int v , int w) +{ + // define two vectors for storing the paths from the node v and w to the root + vector v_Path; + vector w_Path; + + if( !PathToNode(Root , v , v_Path) ) // if there is no path from the root to the node 'v' + { + cout<::iterator v_it = v_Path.begin(), w_it = w_Path.begin(); + + // FOR DEBUGGING PURPOSE ONLY + /* + for(v_it;v_it!=v.end();v_it++) + cout<<" "<<*v_it; + for(w_it;w_it!=w.end();w_it++) + cout<<" "<<*w_it; + v_it = v.begin(); + w_it = w.begin(); + */ + + // LCA is the last common node in the two paths from root to 'v' and from root to 'w' + + // while both the vectors contain the same node , we can move to the next node + while(*v_it == *w_it) + { + v_it++; + w_it++; + } + + //return the last node which is common + return *(--v_it); +} + +int BST::Diameter(node * Node , int *Height) +{ + // If the node is null , then the dia will be zero around that node + if(Node == NULL) + { + *Height = 0; + return 0; + } + + // To store the diameter of left subtree and right subtree + int LeftDia = 0 , RightDia = 0; + + //to store the heights of the left and right subtree while recursing + int LeftHeight = 0 , RightHeight = 0; + + // Recursion updates the left and right heights of the left and right subtrees of the node and returns the diameter of left and right subtree + LeftDia = Diameter(Node->left , &LeftHeight); + RightDia = Diameter(Node->right , &RightHeight); + + // Height is the max of height of the left and right subtree + *Height = max(LeftHeight , RightHeight) +1; + + // Diameter is the max of the diameter of left subtree , right subtree and the diameter which passes through the current node(i.e. left height + right height + 1 ) + return max(LeftHeight+RightHeight+1 , max(LeftDia , RightDia)); +} \ No newline at end of file From f511ce3d47f3f848f596de190da8950631990345 Mon Sep 17 00:00:00 2001 From: Aaditya Khare Date: Tue, 17 Oct 2017 17:54:15 +0530 Subject: [PATCH 218/355] Add files via upload --- dynamic control/Readme.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 dynamic control/Readme.md diff --git a/dynamic control/Readme.md b/dynamic control/Readme.md new file mode 100644 index 0000000000..f47dadfa0a --- /dev/null +++ b/dynamic control/Readme.md @@ -0,0 +1,14 @@ +PID algorithm is a Control System based dynamic control algorithm. +In simpler terms it can be described as a dynamic error calculation +and correction algorithm/ + +Majorly used in wheeled robotic locomotion to follow and maintain +locomotion along a straight guideline usually drawn on the floor. + +The code here is a very basic implementation of the PID algorithm. +A very good algorithm for robotics enthusiasts struggling with robotic +locomotion. + +Do read the detailed documentation on the concepts and tuning formulas on: +https://en.wikipedia.org/wiki/PID_controller + From c9d0c592119e5982d0d9e439d042d17d7021b279 Mon Sep 17 00:00:00 2001 From: Aaditya Khare Date: Tue, 17 Oct 2017 17:54:43 +0530 Subject: [PATCH 219/355] Delete Readme.txt --- dynamic control/Readme.txt | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 dynamic control/Readme.txt diff --git a/dynamic control/Readme.txt b/dynamic control/Readme.txt deleted file mode 100644 index f47dadfa0a..0000000000 --- a/dynamic control/Readme.txt +++ /dev/null @@ -1,14 +0,0 @@ -PID algorithm is a Control System based dynamic control algorithm. -In simpler terms it can be described as a dynamic error calculation -and correction algorithm/ - -Majorly used in wheeled robotic locomotion to follow and maintain -locomotion along a straight guideline usually drawn on the floor. - -The code here is a very basic implementation of the PID algorithm. -A very good algorithm for robotics enthusiasts struggling with robotic -locomotion. - -Do read the detailed documentation on the concepts and tuning formulas on: -https://en.wikipedia.org/wiki/PID_controller - From 3a1f9c06329b8a90a39cfa8d8ac145c6a66a4910 Mon Sep 17 00:00:00 2001 From: Abhishek2019 Date: Tue, 17 Oct 2017 19:04:07 +0530 Subject: [PATCH 220/355] Abhishek2019: Best_First_Search --- .../JAVA/BestFirstSearch.java | 162 ++++++++++++++++++ .../best_first_search/JAVA/Sample_output.txt | 28 +++ 2 files changed, 190 insertions(+) create mode 100644 search/best_first_search/JAVA/BestFirstSearch.java create mode 100644 search/best_first_search/JAVA/Sample_output.txt diff --git a/search/best_first_search/JAVA/BestFirstSearch.java b/search/best_first_search/JAVA/BestFirstSearch.java new file mode 100644 index 0000000000..5aa5a8af93 --- /dev/null +++ b/search/best_first_search/JAVA/BestFirstSearch.java @@ -0,0 +1,162 @@ +import java.util.Comparator; +import java.util.InputMismatchException; +import java.util.PriorityQueue; +import java.util.Scanner; + +public class BestFirstSearch +{ + private PriorityQueue priorityQueue; + private int heuristicvalues[]; + private int numberOfNodes; + + public static final int MAX_VALUE = 999; + + public BestFirstSearch(int numberOfNodes) + { + this.numberOfNodes = numberOfNodes; + this.priorityQueue = new PriorityQueue(this.numberOfNodes, + new Vertex()); + } + + public void bestFirstSearch(int adjacencyMatrix[][], int[] heuristicvalues,int source) + { + int evaluationNode; + int destinationNode; + int visited[] = new int [numberOfNodes + 1]; + this.heuristicvalues = heuristicvalues; + + priorityQueue.add(new Vertex(source, this.heuristicvalues[source])); + visited[source] = 1; + + while (!priorityQueue.isEmpty()) + { + evaluationNode = getNodeWithMinimumHeuristicValue(); + destinationNode = 1; + + System.out.print(evaluationNode + "\t"); + while (destinationNode <= numberOfNodes) + { + Vertex vertex = new Vertex(destinationNode,this.heuristicvalues[destinationNode]); + if ((adjacencyMatrix[evaluationNode][destinationNode] != MAX_VALUE + && evaluationNode != destinationNode)&& visited[destinationNode] == 0) + { + priorityQueue.add(vertex); + visited[destinationNode] = 1; + } + destinationNode++; + } + } + } + + private int getNodeWithMinimumHeuristicValue() + { + Vertex vertex = priorityQueue.remove(); + return vertex.node; + } + + public static void main(String... arg) + { + int adjacency_matrix[][]; + int number_of_vertices; + int source = 0; + int heuristicvalues[]; + + Scanner scan = new Scanner(System.in); + try + { + System.out.println("Enter the number of vertices"); + number_of_vertices = scan.nextInt(); + adjacency_matrix = new int[number_of_vertices + 1][number_of_vertices + 1]; + heuristicvalues = new int[number_of_vertices + 1]; + + System.out.println("Enter the Weighted Matrix for the graph"); + for (int i = 1; i <= number_of_vertices; i++) + { + for (int j = 1; j <= number_of_vertices; j++) + { + adjacency_matrix[i][j] = scan.nextInt(); + if (i == j) + { + adjacency_matrix[i][j] = 0; + continue; + } + if (adjacency_matrix[i][j] == 0) + { + adjacency_matrix[i][j] = MAX_VALUE; + } + } + } + for (int i = 1; i <= number_of_vertices; i++) + { + for (int j = 1; j <= number_of_vertices; j++) + { + if (adjacency_matrix[i][j] == 1 && adjacency_matrix[j][i] == 0) + { + adjacency_matrix[j][i] = 1; + } + } + } + + System.out.println("Enter the heuristic values of the nodes"); + for (int vertex = 1; vertex <= number_of_vertices; vertex++) + { + System.out.print(vertex + "."); + heuristicvalues[vertex] = scan.nextInt(); + System.out.println(); + } + + System.out.println("Enter the source "); + source = scan.nextInt(); + + System.out.println("The graph is explored as follows"); + BestFirstSearch bestFirstSearch = new BestFirstSearch(number_of_vertices); + bestFirstSearch.bestFirstSearch(adjacency_matrix, heuristicvalues,source); + + } catch (InputMismatchException inputMismatch) + { + System.out.println("Wrong Input Format"); + } + scan.close(); + } +} + +class Vertex implements Comparator +{ + public int heuristicvalue; + public int node; + + public Vertex(int node, int heuristicvalue) + { + this.heuristicvalue = heuristicvalue; + this.node = node; + } + + public Vertex() + { + + } + + @Override + public int compare(Vertex vertex1, Vertex vertex2) + { + if (vertex1.heuristicvalue < vertex2.heuristicvalue) + return -1; + if (vertex1.heuristicvalue > vertex2.heuristicvalue) + return 1; + return 0; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Vertex) + { + Vertex node = (Vertex) obj; + if (this.node == node.node) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/search/best_first_search/JAVA/Sample_output.txt b/search/best_first_search/JAVA/Sample_output.txt new file mode 100644 index 0000000000..4b9927ae22 --- /dev/null +++ b/search/best_first_search/JAVA/Sample_output.txt @@ -0,0 +1,28 @@ +$javac BestFirstSearch.java +$java BestFirstSearch +Enter the number of vertices +6 +Enter the Weighted Matrix for the graph +0 0 1 1 0 1 +0 0 0 1 1 1 +1 0 0 1 0 0 +1 1 1 0 1 0 +0 1 0 1 0 0 +1 1 0 0 0 0 +Enter the heuristic values of the nodes +1.2 + +2.3 + +3.1 + +4.4 + +5.0 + +6.10 + +Enter the source +6 +The graph is explored as follows +6 1 3 2 5 4 \ No newline at end of file From 438784c4a8f36f5196bf640743ac2f104198327b Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Tue, 17 Oct 2017 18:54:02 +0200 Subject: [PATCH 221/355] Delete catalan.pyc --- math/catalan/python/catalan.pyc | Bin 541 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 math/catalan/python/catalan.pyc diff --git a/math/catalan/python/catalan.pyc b/math/catalan/python/catalan.pyc deleted file mode 100644 index 44a1e83f724e420befd23e1d31761b2742dd5973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 541 zcmcJJ%}T>S6ov03v5HtJ(o%3K2-(zyJ4HljK^M}6B1IX&Gzrbn{MgI{T4+|f@`-#Q zpTHOJ+-ZxxfPs7F-h0kWKKHx1JO2E73~BudoL4B_ghWK|L{Df0-TMwUA^Te>57kHM z56IFcrh>|rjUrwPn)k?Tyl&)hstu?6=Fs4|MKv~pmJXdEJ3FNj-*Rbw%(u|59{rnk zS811KFErx2E_K$aPVLds1EdR_p<+tKygqk^fy*GD#6EY1ce&wYUS)Ptc8cQFwv4q8 zldR}lbp3PrpyN`@p_(Qtm4hOzGNiS%t^O zz8Oz2ZsWnV%OtuDA+aYsry-8SKJ*ZJ;0!JNT?6hf&Ob5j;3pSZ5mjk?X`z_u2Mo?} A4gdfE From 88c44c6d124623643b5057c9e62440cdc5386ce3 Mon Sep 17 00:00:00 2001 From: MajAK Date: Tue, 17 Oct 2017 17:54:39 -0400 Subject: [PATCH 222/355] Activity-selection-python3 added --- greedy/activity_selection/{ => cpp}/README.md | 0 .../activity_selection/{ => cpp}/activity.cpp | 0 .../activity_selection/{ => cpp}/test_1.txt | 0 .../activity_selection/{ => cpp}/test_2.txt | 0 greedy/activity_selection/python/README.md | 37 +++++++++++++++++++ greedy/activity_selection/python/activity.py | 26 +++++++++++++ greedy/activity_selection/python/test1.txt | 2 + greedy/activity_selection/python/test2.txt | 2 + 8 files changed, 67 insertions(+) rename greedy/activity_selection/{ => cpp}/README.md (100%) rename greedy/activity_selection/{ => cpp}/activity.cpp (100%) rename greedy/activity_selection/{ => cpp}/test_1.txt (100%) rename greedy/activity_selection/{ => cpp}/test_2.txt (100%) create mode 100644 greedy/activity_selection/python/README.md create mode 100644 greedy/activity_selection/python/activity.py create mode 100644 greedy/activity_selection/python/test1.txt create mode 100644 greedy/activity_selection/python/test2.txt diff --git a/greedy/activity_selection/README.md b/greedy/activity_selection/cpp/README.md similarity index 100% rename from greedy/activity_selection/README.md rename to greedy/activity_selection/cpp/README.md diff --git a/greedy/activity_selection/activity.cpp b/greedy/activity_selection/cpp/activity.cpp similarity index 100% rename from greedy/activity_selection/activity.cpp rename to greedy/activity_selection/cpp/activity.cpp diff --git a/greedy/activity_selection/test_1.txt b/greedy/activity_selection/cpp/test_1.txt similarity index 100% rename from greedy/activity_selection/test_1.txt rename to greedy/activity_selection/cpp/test_1.txt diff --git a/greedy/activity_selection/test_2.txt b/greedy/activity_selection/cpp/test_2.txt similarity index 100% rename from greedy/activity_selection/test_2.txt rename to greedy/activity_selection/cpp/test_2.txt diff --git a/greedy/activity_selection/python/README.md b/greedy/activity_selection/python/README.md new file mode 100644 index 0000000000..606b39c030 --- /dev/null +++ b/greedy/activity_selection/python/README.md @@ -0,0 +1,37 @@ +# Activity Selection Problem + +## Problem Statement: + +A list of N activities is given ( each having its own start time (Si) and finish time (Fi) ). Two activities with start times Si, Sj and +finish times Fi, Fj respectively are said to be non conflicting if Si > Fj or Sj > Fi. Find the maximum number of activities which we can +schedule so that there are no conflicting activities among those scheduled. + +## Constraints: +``` +1 <= N <= 100000 +1 <= Si <= Fi <= 1e9 +``` +## Input: +First Line contains start times of activities +Second line contains finish time of activities +It is assumed that it is sorted in order of finish time + +## Output: +Activities chosen in diffrent lines + +## Example: +### Input : +``` +2 4 1 +3 4 5 +``` +### Output: +``` +The following activities are selected +0 +1 +``` + +## Explanation +Let the give set of activities be ```S = {1, 2, 3, ..n}``` and activities be sorted by finish time. The greedy choice is to always pick activity 1. How come the activity 1 always provides one of the optimal solutions. We can prove it by showing that if there is another solution B with first activity other than 1, then there is also a solution A of same size with activity 1 as first activity. Let the first activity selected by B be k, then there always exist ```A = {B – {k}} U {1}```.(Note that the activities in B are independent and k has smallest finishing time among all. Since k is not 1, ```finish(k) >= finish(1))``` + diff --git a/greedy/activity_selection/python/activity.py b/greedy/activity_selection/python/activity.py new file mode 100644 index 0000000000..1f038fb668 --- /dev/null +++ b/greedy/activity_selection/python/activity.py @@ -0,0 +1,26 @@ +"""Prints a maximum set of activities that can be done by a +single person, one at a time""" +# n --> Total number of activities +# s[]--> An array that contains start time of all activities +# f[] --> An array that conatins finish time of all activities + +def printMaxActivities(s , f ): + n = len(f) + print("The following activities are selected") + + # The first activity is always selected + i = 0 + print(i), + + # Consider rest of the activities + for j in range(n): + # If this activity has start time greater than + # or equal to the finish time of previously + # selected activity, then select it + if s[j] >= f[i]: + print(j) + i = j +# Driver program to test above function +s = list(map(int,input().split())) +f = list(map(int,input().split())) +printMaxActivities(s , f) diff --git a/greedy/activity_selection/python/test1.txt b/greedy/activity_selection/python/test1.txt new file mode 100644 index 0000000000..bc05db5af1 --- /dev/null +++ b/greedy/activity_selection/python/test1.txt @@ -0,0 +1,2 @@ +2 4 1 +3 4 5 diff --git a/greedy/activity_selection/python/test2.txt b/greedy/activity_selection/python/test2.txt new file mode 100644 index 0000000000..750f55ede8 --- /dev/null +++ b/greedy/activity_selection/python/test2.txt @@ -0,0 +1,2 @@ +1 3 0 5 8 5 +2 4 6 7 9 9 From 3caef3cd30dc2045b27d066aa00ab097ca4c5c46 Mon Sep 17 00:00:00 2001 From: MajAK Date: Tue, 17 Oct 2017 18:22:36 -0400 Subject: [PATCH 223/355] Rod-Cutting-Top-Down added in cpp --- dp/rod_cutting/cpp/README.md | 30 +++++++++++++++++++++++++++ dp/rod_cutting/cpp/rodCutting.cpp | 34 +++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 dp/rod_cutting/cpp/README.md create mode 100644 dp/rod_cutting/cpp/rodCutting.cpp diff --git a/dp/rod_cutting/cpp/README.md b/dp/rod_cutting/cpp/README.md new file mode 100644 index 0000000000..087915f5aa --- /dev/null +++ b/dp/rod_cutting/cpp/README.md @@ -0,0 +1,30 @@ +# Rod Cutting Problem + +## Problem Statement: +Given a rod of length n inches and an array of prices that contains prices of all pieces of size smaller than n. Determine the maximum value obtainable by cutting up the rod and selling the pieces. + +## Constraints: +``` +1 <= N <= 100000 +1 <= arr[i] <= 1e9 +``` +## Input: +First line contains integer N, the number of activities. +Next N lines each contain integer arr[i] (value of i length rod) + +## Output: +Output one single integer (maximum cost you can gain by cutting) + +## Example: +### Input : +``` +8 +1 5 8 9 10 17 17 20 +``` +### Output: +``` +Maximum Obtainable Value is:22 +``` + +### Explanation: +For example, if length of the rod is 8 and the values of different pieces are given as following, then the maximum obtainable value is 22 (by cutting in two pieces of lengths 2 and 6). diff --git a/dp/rod_cutting/cpp/rodCutting.cpp b/dp/rod_cutting/cpp/rodCutting.cpp new file mode 100644 index 0000000000..aece75df13 --- /dev/null +++ b/dp/rod_cutting/cpp/rodCutting.cpp @@ -0,0 +1,34 @@ +#include +#include + +using namespace std; + +int max(int a, int b) { return (a > b)? a : b;} + +/* Returns the best obtainable price for a rod of length n and + price[] as prices of different pieces */ +int cutRod(int price[], int n) +{ + if (n <= 0) + return 0; + int max_val = INT_MIN; + + // Recursively cut the rod in different pieces and compare different + // configurations + for (int i = 0; i> n; + int arr[n]; + for(int i=0;i> arr[i]; + cout << "Maximum Obtainable Value is:"<< cutRod(arr, n) <<"\n"; + return 0; +} From 73b4c2bda5942a93877eb3e81863451072af12d4 Mon Sep 17 00:00:00 2001 From: MajAK Date: Tue, 17 Oct 2017 18:26:50 -0400 Subject: [PATCH 224/355] Documentation added --- dp/rod_cutting/C/README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dp/rod_cutting/C/README.md diff --git a/dp/rod_cutting/C/README.md b/dp/rod_cutting/C/README.md new file mode 100644 index 0000000000..9a198535fb --- /dev/null +++ b/dp/rod_cutting/C/README.md @@ -0,0 +1,30 @@ +# Rod Cutting Problem + +## Problem Statement: +Given a rod of length n inches and an array of prices that contains prices of all pieces of size smaller than n. Determine the maximum value obtainable by cutting up the rod and selling the pieces. + +## Constraints: +``` +1 <= N <= 100000 +1 <= p[i] <= 10e9 +``` +## Input: +First line contains integer N, the number of activities. +Next N lines each contain integer arr[i] (value of i length rod) + +## Output: +Output one single integer (maximum cost you can gain by cutting) + +## Example: +### Input : +``` +8 +1 5 8 9 10 17 17 20 +``` +### Output: +``` +Maximum Obtainable Value is:22 +``` + +### Explanation: +For example, if length of the rod is 8 and the values of different pieces are given as following, then the maximum obtainable value is 22 (by cutting in two pieces of lengths 2 and 6). From 64cfb4b22bd0579628f3f9e28b3f236d363ca371 Mon Sep 17 00:00:00 2001 From: Eshraq Ibrahim Date: Tue, 17 Oct 2017 20:13:14 +0300 Subject: [PATCH 225/355] Queue using array --- data_structures/Queue/Java/queueArray | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 data_structures/Queue/Java/queueArray diff --git a/data_structures/Queue/Java/queueArray b/data_structures/Queue/Java/queueArray new file mode 100644 index 0000000000..b6ac0b6c85 --- /dev/null +++ b/data_structures/Queue/Java/queueArray @@ -0,0 +1,52 @@ + +public class queueArray { + + private int first = -1; + private int last = -1; + private int size = 0; + private int sizequeuee; + + queueArray(final int sizequeue) { + x = new Object[sizequeue]; + this.sizequeuee = sizequeue; + } + + public Object[] x = new Object[sizequeuee]; + + public boolean full() { + return ((first == last && last != -1 && first != -1) || (first == -1 && last == (x.length - 1))); + } + + public void enqueue(final Object item) { + if (this.full()) { + throw null; + } + last = (last + 1) % x.length; + x[last] = item; + size++; + + } + + public Object dequeue() { + if (this.isEmpty()) { + throw null; + } + first = (first + 1) % x.length; + Object z = x[first]; + if (first == last) { + first = -1; + last = -1; + } + size--; + return z; + } + + public boolean isEmpty() { + return first == -1 && last == -1; + } + + public int size() { + return size; + } + +} From d67c2b9252de0b376d4983517b903b5f3f8e4df0 Mon Sep 17 00:00:00 2001 From: Eshraq Ibrahim Date: Tue, 17 Oct 2017 20:13:40 +0300 Subject: [PATCH 226/355] Rename queueArray to queueArray.java --- data_structures/Queue/Java/{queueArray => queueArray.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data_structures/Queue/Java/{queueArray => queueArray.java} (100%) diff --git a/data_structures/Queue/Java/queueArray b/data_structures/Queue/Java/queueArray.java similarity index 100% rename from data_structures/Queue/Java/queueArray rename to data_structures/Queue/Java/queueArray.java From e0b9d62cb4d8b376f1c06a5913901a528731a6f7 Mon Sep 17 00:00:00 2001 From: Eshraq Ibrahim Date: Tue, 17 Oct 2017 20:14:37 +0300 Subject: [PATCH 227/355] Queue using LinkedList --- .../Queue/Java/queueLinkedList.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 data_structures/Queue/Java/queueLinkedList.java diff --git a/data_structures/Queue/Java/queueLinkedList.java b/data_structures/Queue/Java/queueLinkedList.java new file mode 100644 index 0000000000..d3158169b1 --- /dev/null +++ b/data_structures/Queue/Java/queueLinkedList.java @@ -0,0 +1,33 @@ +import java.util.LinkedList; + +public class queueLinkedList { + + LinkedList list = new LinkedList(); + + public void enqueue(final Object item) { + if (item == null) { + return; + } + list.addLast(item); + } + + public Object dequeue() { + if (list.isEmpty()) { + throw null; + } + Object x; + x = list.getFirst(); + list.removeFirst(); + return x; + } + + public boolean isEmpty() { + int z = list.size(); + return z == 0; + } + + public int size() { + return list.size(); + } + +} From 44f463adacebad75afb6fe46928e6f2be7c9d5de Mon Sep 17 00:00:00 2001 From: mgomaa Date: Tue, 17 Oct 2017 20:15:44 +0300 Subject: [PATCH 228/355] array stack in php --- data_structures/Stack/php/stack.php | 68 +++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 data_structures/Stack/php/stack.php diff --git a/data_structures/Stack/php/stack.php b/data_structures/Stack/php/stack.php new file mode 100644 index 0000000000..fedc9923c8 --- /dev/null +++ b/data_structures/Stack/php/stack.php @@ -0,0 +1,68 @@ +stack = array(); + // stack can only contain this many items + $this->limit = $limit; + } + + public function push($item) { + if (count($this->stack) < $this->limit) { + // prepend item to the start of the array + array_unshift($this->stack, $item); + } else { + throw new RunTimeException('Stack is full!'); + } + } + + public function pop() { + if ($this->isEmpty()) { + // trap for stack underflow + throw new RunTimeException('Stack is empty!'); + } else { + // pop item from the start of the array + return array_shift($this->stack); + } + } + + public function top() { + return current($this->stack); + } + + public function isEmpty() { + return empty($this->stack); + } +} + +//Lets add some items to the stack: +$myTasks = new Stack(); + +$myTasks->push('task one'); +$myTasks->push('task two'); +$myTasks->push('task three'); +$myTasks->push('task four'); +$myTasks->push('task five'); + +//To remove some items from the stack: +echo $myTasks->pop(); +echo "
"; +echo $myTasks->pop(); +echo "
"; + +//Lets see whats at the top of the stack: +echo $myTasks->top(); +echo "
"; + +// add new item +$myTasks->push('task six'); +echo $myTasks->pop(); + + + + +?> \ No newline at end of file From d1db2de15c8abb061734a49481d0a4c6e3ed613d Mon Sep 17 00:00:00 2001 From: apurva91 Date: Tue, 17 Oct 2017 22:59:57 +0530 Subject: [PATCH 229/355] Arithmetic On Large Numbers C++ --- .../C++/string_addition.cpp | 27 +++++++ .../C++/string_multiplication.cpp | 44 ++++++++++++ .../C++/string_subtract.cpp | 72 +++++++++++++++++++ math/factorial/C++/extra_long_factorial.cpp | 28 ++++++++ 4 files changed, 171 insertions(+) create mode 100644 math/Arithmetic on Very Large Numbers/C++/string_addition.cpp create mode 100644 math/Arithmetic on Very Large Numbers/C++/string_multiplication.cpp create mode 100644 math/Arithmetic on Very Large Numbers/C++/string_subtract.cpp create mode 100644 math/factorial/C++/extra_long_factorial.cpp diff --git a/math/Arithmetic on Very Large Numbers/C++/string_addition.cpp b/math/Arithmetic on Very Large Numbers/C++/string_addition.cpp new file mode 100644 index 0000000000..9addb4068e --- /dev/null +++ b/math/Arithmetic on Very Large Numbers/C++/string_addition.cpp @@ -0,0 +1,27 @@ +#include +using namespace std; + +string strAdd(string s, string r){ + int re=0; + string digit; + if(r.length()s.length()) s.insert(s.begin(),r.length()-s.length(),'0'); + for(int i=s.length()-1; i>=0;--i){ + int a=(int(s[i]+r[i])+re-96); + digit.insert(digit.begin(),char(a%10+48)); + re=a/10; + } + if(re!=0) digit.insert(digit.begin(),char(re+48)); + return digit; +} + +int main(){ + string s; + string c; + cout<<"Enter Number One"<>s; + cout<<"Enter Number Two"<>c; + cout<<"Addition Result: "< +using namespace std; + +string strAdd(string s, string r){ + int re=0; + string digit; + if(r.length()s.length()) s.insert(s.begin(),r.length()-s.length(),'0'); + for(int i=s.length()-1; i>=0;--i){ + int a=(int(s[i]+r[i])+re-96); + digit.insert(digit.begin(),char(a%10+48)); + re=a/10; + } + if(re!=0) digit.insert(digit.begin(),char(re+48)); + return digit; +} + +string strMul(string s, string c){ + string fina=""; + for(int j=c.length()-1;j>=0; j--){ + string digit=""; + int re=0; + for(int i=s.length()-1;i>=0; i--){ + int a = int(c[j]-'0')*int(s[i]-'0')+ re; + digit.insert(digit.begin(),char(a%10+48)); + re=a/10; + } + if(re!=0)digit.insert(digit.begin(),char(re+48)); + digit.append((c.length()-j-1),'0'); + fina = strAdd(fina,digit); + } + return fina; +} + +int main(){ + string s; + string c; + cout<<"Enter Number One"<>s; + cout<<"Enter Number Two"<>c; + cout<<"Multiplication Result: "< +using namespace std; + +bool isSmaller(string str1, string str2){ + int n1 = str1.length(), n2 = str2.length(); + + if (n1 < n2){ + return true; + } + if (n2 < n1){ + return false; + } + + for (int i=0; i str2[i]){ + return false; + } + } + return false; +} + +string strSub(string str1, string str2){ + if (isSmaller(str1, str2)) + swap(str1, str2); + + string str = ""; + + int n1 = str1.length(), n2 = str2.length(); + + reverse(str1.begin(), str1.end()); + reverse(str2.begin(), str2.end()); + + int carry = 0; + + for (int i=0; i>s; + cout<<"Enter Number Two"<>c; + cout<<"Subtraction Result: "< +using namespace std; + +int main(){ + int n; + cout<<"Enter The Number for Factorial"<> n; + vector digit; + digit.push_back(1); + for(int j=1; j=0; i--){ + x = j*digit[i]+y; + digit[i] = x%10; + y=x/10; + } + while(y!=0){ + digit.insert(digit.begin(),y%10); + y=y/10; + } + } + cout<<"The Factorial is: "< Date: Tue, 17 Oct 2017 19:52:51 +0200 Subject: [PATCH 230/355] Mv euler toient readme --- math/eulers_totient_function/{C => }/readme.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename math/eulers_totient_function/{C => }/readme.md (100%) diff --git a/math/eulers_totient_function/C/readme.md b/math/eulers_totient_function/readme.md similarity index 100% rename from math/eulers_totient_function/C/readme.md rename to math/eulers_totient_function/readme.md From de016cad0e5344e3fae51d04216c77daf8ab0055 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Tue, 17 Oct 2017 19:53:58 +0200 Subject: [PATCH 231/355] Rename selection_sort2 to selection_sort2.py --- .../selection_sort/python/{selection_sort2 => selection_sort2.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sort/selection_sort/python/{selection_sort2 => selection_sort2.py} (100%) diff --git a/sort/selection_sort/python/selection_sort2 b/sort/selection_sort/python/selection_sort2.py similarity index 100% rename from sort/selection_sort/python/selection_sort2 rename to sort/selection_sort/python/selection_sort2.py From b0825843dbf1e6860cb48ee3a115fc16a49f857e Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Tue, 17 Oct 2017 19:55:35 +0200 Subject: [PATCH 232/355] Rename Lavesh_singlyLinkedList to Lavesh_singlyLinkedList.cpp --- .../C++/{Lavesh_singlyLinkedList => Lavesh_singlyLinkedList.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data_structures/linked_list/C++/{Lavesh_singlyLinkedList => Lavesh_singlyLinkedList.cpp} (100%) diff --git a/data_structures/linked_list/C++/Lavesh_singlyLinkedList b/data_structures/linked_list/C++/Lavesh_singlyLinkedList.cpp similarity index 100% rename from data_structures/linked_list/C++/Lavesh_singlyLinkedList rename to data_structures/linked_list/C++/Lavesh_singlyLinkedList.cpp From 91eed6cdf09e37c7100d0d3ee491176a3b379dbd Mon Sep 17 00:00:00 2001 From: abhisheksuryavanshi Date: Tue, 17 Oct 2017 23:44:53 +0530 Subject: [PATCH 233/355] Added c++ code for binomial heap --- data_structures/heap/C++/Binomial_heap.cpp | 533 +++++++++++++++++++++ 1 file changed, 533 insertions(+) create mode 100644 data_structures/heap/C++/Binomial_heap.cpp diff --git a/data_structures/heap/C++/Binomial_heap.cpp b/data_structures/heap/C++/Binomial_heap.cpp new file mode 100644 index 0000000000..2280ec625d --- /dev/null +++ b/data_structures/heap/C++/Binomial_heap.cpp @@ -0,0 +1,533 @@ +/*--------------CONCEPT-------------------*/ + + /*----CONCEPT OF BINOMIAL HEAP AS TAUGHT IN CLASS AND FROM CORMEN BOOK IS USED----*/ + + /*----SETW FUNCTION FROM STANDARD LIBRARY IS USED----*/ +/*----------ASSUMPTION----------*/ + + /*----NUMBER OF HEAPS WILL ALWAYS BE LESS THAN 100----*/ + +#include + +using namespace std; + +//NODE DECLARATION +typedef struct node +{ + struct node *parent; + int key; + int degree; + struct node *leftmostchild; + struct node *sibling; + +}node; + + +//FUNCTION TO SWAP TWO INTEGERS +void swap(int *a,int *b) +{ + int temp = *a; + *a = *b; + *b = temp; +} + +//FUNCTION TO LINK TWO BINOMIAL TREES (MAKES X PARENT OF Y) +void binomiallink(node* y, node* x) +{ + y->parent = x; + y->sibling = x->leftmostchild; + x->leftmostchild = y; + x->degree = x->degree + 1; +} + +//FUNCTION TO ALLOCATE MEMORY AND HANDLE POINTERS FOR A NEWLY CREATED NODE +node* makebinomialheap() +{ + node* newnode = new node; + newnode->parent = NULL; + newnode->leftmostchild = NULL; + newnode->sibling = NULL; + newnode->degree = 0; + newnode->key = -1; + return newnode; +} + +//FUNCTION THAT RETURNS NODE WITH MINIMUM VALUE FROM A BINOMIAL HEAP +node* getmin(node* head) +{ + //Y IS USED TO POINT TO MINIMUM NODE + node* y = NULL; + + //X WILL BE USED TO ITERATE THROUGH THE ROOT LIST + node* x = head; + + //DENOTES INFINITY + int min = 99999; + + while(x != NULL) + { + if(x->key < min) + { + min = x->key; + y = x; + } + x = x->sibling; + } + + return y; +} + +//FUNCTION TO ADD NODE X BEFOR NODE P IN A BINOMIAL HEAP +node* insertbeforep(node* head ,node* p, node* x) +{ + //TEMP WILL POINT TO THE NODE JUST BEFORE NODE P + node* temp = head; + while(temp->sibling != NULL && temp->sibling != p)temp = temp->sibling; + + if(temp == head) + { + x->sibling = temp; + head = x; + } + else + { + temp->sibling = x; + x->sibling = p; + } + + return head; +} + +//FUNCTION TO MERGE TWO BINOMIAL HEAPS INTO ONE LIST BUT THAT LIST MAY NOT NECESSARILY BE A BINOMIAL HEAP +node *binomialmerge(node *h1, node *h2) +{ + //CHECK IF EITHER IS NULL + if (h1 == NULL && h2 != NULL) + { + return h2; + } + else if (h2 == NULL && h1 != NULL) + { + return h1; + } + else if (h1 == NULL && h2 == NULL) + { + return NULL; + } + + //Z DENOTES HEAD TO THE FINAL HEAP AFTER MERGING THE TWO INPUT HEAPS + node *z; + + //X WILL BE USED TO ITERATE HEAP 1 AND Y WILL BE USED TO ITERATE HEAP 2 + node *x = h1, *y = h2, *temp; + + //SELECT THE NODE WHICH HAS LEAST DEGREE FROM EITHER X OR Y + if (x->degree < y->degree) + { + temp = x; + x = x->sibling; + } + else + { + temp = y; + y = y->sibling; + } + + z = temp; + + //FROM THAT X OR Y SELECT A PART OF THAT HEAP WHERE DEGREE OF ALL ROOT NODES IS LESS THAN THE DEGREE OF OTHER + while(x != NULL && y != NULL) + { + if (x->degree < y->degree) + { + temp->sibling = x; + x = x->sibling; + } + else + { + temp->sibling = y; + y = y->sibling; + } + temp = temp->sibling; + } + + //WHEN EITHER OF THE LIST CONTAIN ONLY ONE NODE + if (temp->sibling == NULL) + { + if (x != NULL) + { + temp->sibling = x; + } + if (y != NULL) + { + temp->sibling = y; + } + } + + return z; +} + +//FUNCTION TO UNITE TWO BINOMIAL HEAP INTO ONE BINOMIAL HEAP +node* binomialheapunion(node* h1, node* h2) +{ + //FINAL HEAP DENOTES THE HEAD OF THE BINOMIAL HEAP FORMED AFTER MERGING THE TWO HEAPS + node* finalheap = makebinomialheap(); + + //MERGER THE TWO HEAPS + finalheap = binomialmerge(h1,h2); + + //NOW WE JUST HAVE TO REORGANISE THE FINALHEAP SO THAT IT FOLLOWS ALL PROPERTIES OF BINOMIAL HEAP + + if(finalheap == NULL) return finalheap; + + //THREE POINTERS X, NEXTX AND PREVX WII BE USED + + //X IS ITERATOR WHICH STARTS FROM HEAD OF THE FINALHEAP + node* x = makebinomialheap(); + x=finalheap; + + //NEXTX WILL ALWAYS POINT TO SIBILING OF X + node* nextx = x->sibling; + + //PREVX WILL ALWAYS POINT TO NODE PREVIOUSTO X WHICH INITIALLY IS NULL + node* prevx = NULL; + + //WHILE X HAS NOT REACHED THE FINAL NODE + while(nextx != NULL) + { + //UPDATE NEXTX + nextx = x->sibling; + + if(nextx == NULL) break; + + //ALL THE CONDITIONS MENTIONED HERE ARE THE CONDITIONS WHERE NOTHING NEEDS TO BE DONE SO JUST UPDATE X AND PREVX AND NEXTX + if((x->degree != nextx->degree) || (nextx->sibling != NULL && (nextx->sibling)->degree == x->degree)) + { + prevx = x; + x = nextx; + } + else + { + //MAKE NODE WITH LEAST KEY THE PARENT NODE + if(x->key <= nextx->key){ + + //UPDATE POINTER OF X AS NEXTX WILL BECOME ITS CHILD + x->sibling = nextx->sibling; + + //LINK NEXTX AND X + binomiallink(nextx,x); + } + else + { + //UPDATE PREVX + if(prevx == NULL) + { + finalheap = nextx; + } + else + { + prevx->sibling = nextx; + } + + //LINK X AND NEXTX + binomiallink(x,nextx); + x = nextx; + } + } + } + return finalheap; + +} + +//FUNCTION USED TO INSERT A NUMBER X INTO A BINOMIAL HEAP +node* binomialinsert(node* head, int x) +{ + //IF THE BINOMIAL HEAP IS EMPTY THEN HEAD->HEY == -1 + if(head->key == -1) + { + head->key = x; + return head; + } + + //TRANSFER X TO A TEMPORARY NODE AND TAKE UNION OF THAT NODE WITH THE ORIGINAL HEAP + node* temp = makebinomialheap(); + temp->key = x; + temp->degree = 0; + head = binomialheapunion(head,temp); + + return head; +} + + +//FUNCTION WHICH RETURNS MINIMUM OF THREE NUMBERS +int min (int a, int b, int c) +{ + int min = b; + if(asibling != NULL) + { + showheap(node->sibling , depth); + } + + //FOR NODES IN THE ROOT LIST + if (node->parent == NULL) + { + cout<leftmostchild != NULL || node->parent == NULL ) + { + //GIVE INDENTION = DEPTH*6+4 THEN PRINT THEN KEY + cout<key; + + if (node->leftmostchild == NULL) + { + cout<key<leftmostchild != NULL) + { + showheap(node->leftmostchild , depth+1); + } + +} + +//FUNCTION TO PRINT THE BINOMIAL HEAP +void printheap(node *head) +{ + cout<<"Structure of the binomial Heap (rotated 90 degrees cwise) is :\n\n "; + if (head == NULL){ + cout<<"Heap is empty"<leftmostchild; + + //BRING TEMP JUST PREVIOUS TO MIN NODE + while(temp != min && (temp->sibling != NULL && temp->sibling != min)) + { + temp = temp->sibling; + } + + //IF MINIMUM IS EQUAL TO THE HEAD + if(min == head) + { + head = head->sibling; + } + else + { + //ISOLATE MIN NODE FORM THE ROOT LIST + temp->sibling = min->sibling; + min->sibling = NULL; + min->leftmostchild = NULL; + + } + + //REVERSE THE CHILD LIST OF MIN + if(leftchild != NULL) + { + //TEMPLC WILL DENOTE THE HEAD OF THE CHILD LIST OF THE MIN NODE + node* templc = leftchild; + temp = leftchild->sibling; + leftchild->sibling = NULL; + leftchild->parent == NULL; + while(temp != NULL) + { + x = temp->sibling; + temp->sibling = leftchild; + leftchild = temp; + temp = x; + leftchild->parent = NULL; + } + + //NOW UNITE REVERSED CHILD LIST AND THE MAIN HEAP + head = binomialheapunion(head,leftchild); + } + + return min; +} + +//FUNCTION THAT ORIGINALLY PRINTS ALL THE AVAILABLE CHOICES +void choices() +{ + cout<>x; + switch(x) + { + case 'c': + { + heap[numberofheaps] = makebinomialheap(); + numberofheaps++; + cout<<"Made empty heap with index: "<>a>>b; + if (a >= numberofheaps || b >= numberofheaps || a < 0 || b < 0) + { + cout<<"ERROR : No Heap Found at that INDEX"<>x; + heap[numberofheaps-1] = binomialinsert(heap[numberofheaps-1], x); + break; + } + case 'd': + { + if(numberofheaps == 0) + { + cout<<"Create a heap first"<key< 1) + { + cout<<"Which Heap do you want to print? Please enter the index of that heap(Available Heaps are from 0 to "<>x; + if (x < 0 || x >= numberofheaps) + { + cout<<"Please Enter A valid HEAP INDEX"< Date: Tue, 17 Oct 2017 23:47:34 +0530 Subject: [PATCH 234/355] Multiplication of large numbers by Karatsuba's Algorithm in Java --- .../Java/karger.java | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 math/Arithmetic on Very Large Numbers/Java/karger.java diff --git a/math/Arithmetic on Very Large Numbers/Java/karger.java b/math/Arithmetic on Very Large Numbers/Java/karger.java new file mode 100644 index 0000000000..dd10e50abd --- /dev/null +++ b/math/Arithmetic on Very Large Numbers/Java/karger.java @@ -0,0 +1,235 @@ +import java.lang.*; +import java.util.Scanner; +import java.util.concurrent.ThreadLocalRandom; +public class karger +{ + public static int [][] merge(int a[][],int rn1,int rn2) + { + int i,len; + int k=0; + + for(i=a[rn1-1][0]+2;i0) + { + str.trim(); + + a[i][++a[i][0]]=Integer.parseInt(str.substring(0,str.indexOf(' '))); + str=str.substring(str.indexOf(' ')+1); + } + } + System.out.println(); + + for(i=0;i2) + { + rn1=ThreadLocalRandom.current().nextInt(1,nodes+1); + rn2=ThreadLocalRandom.current().nextInt(1,nodes+1); + + while(a[rn1-1][0]==0) + rn1=ThreadLocalRandom.current().nextInt(1,nodes+1); + while(a[rn2-1][0]==0 || rn1==rn2) + rn2=a[rn1-1][ThreadLocalRandom.current().nextInt(2,a[rn1-1][0]+2)]; + + for(i=0;i0) +// { +// str.trim(); + +// a[i][++a[i][0]]=Integer.parseInt(str.substring(0,str.indexOf(' '))); +// str=str.substring(str.indexOf(' ')+1); +// } +// } +// System.out.println(); + +// for(i=0;i<8;i++) +// a[i][0]-=1; + + +// int [][] backup_a = new int[a.length][]; +// for(int y = 0; y < a.length; y++) +// backup_a[y] = a[y].clone(); + +// for(z=1;z<=500;z++) +// { +// for(int y = 0; y < backup_a.length; y++) +// a[y] = backup_a[y].clone(); + +// // System.out.println(z); + +// col_len=no_of_rows(a); +// while(col_len>2) +// { +// rn1=ThreadLocalRandom.current().nextInt(1,9); +// rn2=ThreadLocalRandom.current().nextInt(1,9); + +// while(a[rn1-1][0]==0) +// rn1=ThreadLocalRandom.current().nextInt(1,9); +// while(a[rn2-1][0]==0 || rn1==rn2) +// rn2=a[rn1-1][ThreadLocalRandom.current().nextInt(2,a[rn1-1][0]+2)]; + +// for(i=0;i<8;i++) +// { +// if(i==(rn1-1) || i==(rn2-1)) +// continue; +// for(j=2;j<(2+a[i][0]);j++) +// if(a[i][j]==rn2) +// a[i][j]=rn1; +// } +// a=merge(a,rn1,rn2); +// col_len=no_of_rows(a); +// } + +// i=0; +// while(true) +// { +// if(a[i][0]!=0) +// { +// if(a[i][0] Date: Wed, 18 Oct 2017 00:21:56 +0530 Subject: [PATCH 236/355] Lowest_Common_Ancestor --- .../Cpp/lowest_common_ancestor.cpp | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 dp/Lowest_Common_Ancestor/Cpp/lowest_common_ancestor.cpp diff --git a/dp/Lowest_Common_Ancestor/Cpp/lowest_common_ancestor.cpp b/dp/Lowest_Common_Ancestor/Cpp/lowest_common_ancestor.cpp new file mode 100644 index 0000000000..62927f5e50 --- /dev/null +++ b/dp/Lowest_Common_Ancestor/Cpp/lowest_common_ancestor.cpp @@ -0,0 +1,82 @@ +#include + +using namespace std; + +const int maxn = 1e5+5; //maximum number of nodes in tree +const int maxlog = 17; + +int p[maxn][maxlog+1], level[maxn]; +vector adj[maxn]; + +void dfs(int i, int par=0, int d = 1){ + + p[i][0] = par; + level[i] = d; + + for(auto next : adj[i]){ + if(next == par) + continue; + dfs(next, i, d+1); + } +} + +void process(int n){ + memset(p, -1, sizeof(p)); + + dfs(1); + + for(int j = 1; (1< 0){ + int raise = log2(dist); + + u = p[u][raise]; + + dist -= (1LL<=0; j--){ + if(p[u][j] != -1 && p[u][j] != p[v][j]){ + u = p[u][j]; + v = p[v][j]; + } + } + return p[u][0]; +} + +int dist(int u, int v){ + return level[u] + level[v] - 2*level[lca(u, v)] + 1; +} + +int main(){ + int n = 6; + + //Taking input + adj[1].push_back(2); + adj[1].push_back(3); + adj[3].push_back(4); + adj[3].push_back(5); + adj[4].push_back(6); + + process(n); + + cout << "LCA of 5 and 6 = " << lca(5, 6) << endl; + + return 0; +} \ No newline at end of file From cd31c76ff4a0c698a1df2c6fb7330ecbe34dce81 Mon Sep 17 00:00:00 2001 From: Shubham <8shubhamkothari@gmail.com> Date: Wed, 18 Oct 2017 00:27:42 +0530 Subject: [PATCH 237/355] Lowest_Common_Ancestor --- dp/Lowest_Common_Ancestor/Cpp/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 dp/Lowest_Common_Ancestor/Cpp/README.md diff --git a/dp/Lowest_Common_Ancestor/Cpp/README.md b/dp/Lowest_Common_Ancestor/Cpp/README.md new file mode 100644 index 0000000000..8f7d25daa0 --- /dev/null +++ b/dp/Lowest_Common_Ancestor/Cpp/README.md @@ -0,0 +1,8 @@ +Lowest Common Ancestor : + +This solution uses dynamic programming for calculating lca. +Preprocessing - O(NlogN) +Query - O(logN) + +1. Implemented in Cpp +2. Test Case is provided From d9b5006697c67d3fa577d1f53b1e8856d2415094 Mon Sep 17 00:00:00 2001 From: deepakgouda Date: Wed, 18 Oct 2017 00:29:34 +0530 Subject: [PATCH 238/355] Find Minimum cut using Random Contraction in Java --- data_structures/Graphs/Java/karger.java | 136 ++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 data_structures/Graphs/Java/karger.java diff --git a/data_structures/Graphs/Java/karger.java b/data_structures/Graphs/Java/karger.java new file mode 100644 index 0000000000..c7bb108517 --- /dev/null +++ b/data_structures/Graphs/Java/karger.java @@ -0,0 +1,136 @@ +/* +Sample Input +8 +1 2 4 3 +2 1 3 4 5 +3 1 2 4 +4 3 1 2 7 +5 2 6 8 7 +6 5 7 8 +7 4 5 6 8 +8 7 6 5 + +Here, first number is the node number and the following numbers in each row are it's adjacent rows. + +Sample Output +Minimum Cut=2 +*/ +import java.lang.*; +import java.util.Scanner; +import java.util.concurrent.ThreadLocalRandom; +public class karger +{ + public static int [][] merge(int a[][],int rn1,int rn2) + { + int i,len; + int k=0; + + for(i=a[rn1-1][0]+2;i0) + { + str.trim(); + + a[i][++a[i][0]]=Integer.parseInt(str.substring(0,str.indexOf(' '))); + str=str.substring(str.indexOf(' ')+1); + } + } + System.out.println(); + + for(i=0;i2) + { + rn1=ThreadLocalRandom.current().nextInt(1,nodes+1); + rn2=ThreadLocalRandom.current().nextInt(1,nodes+1); + + while(a[rn1-1][0]==0) + rn1=ThreadLocalRandom.current().nextInt(1,nodes+1); + while(a[rn2-1][0]==0 || rn1==rn2) + rn2=a[rn1-1][ThreadLocalRandom.current().nextInt(2,a[rn1-1][0]+2)]; + + for(i=0;i 0 STARTRANGE ENDRANGE DELTA") +print("FOR RANGE SUM QUERY => 1 STARTRANGE ENDRANGE") + +while c: + query = list(map(int,input("Enter query : ").split())) + if query[0] == 0: + updateTreeLazy(query[1]-1,query[2]-1,query[3],0,n-1,0) + elif query[0] == 1: + print("The range sum is :",queryLazy(0,0,n-1,query[1]-1,query[2]-1)) + c -= 1 \ No newline at end of file From 80c9a125d05a934d3ff3569ed7b5b9e349ac8405 Mon Sep 17 00:00:00 2001 From: Divyam Madaan Date: Wed, 18 Oct 2017 01:05:03 +0530 Subject: [PATCH 240/355] Add longest bitonic sequence in cpp --- .../cpp/longest_bitonic_sequence.cpp | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 dp/longest_bitonic_sequence/cpp/longest_bitonic_sequence.cpp diff --git a/dp/longest_bitonic_sequence/cpp/longest_bitonic_sequence.cpp b/dp/longest_bitonic_sequence/cpp/longest_bitonic_sequence.cpp new file mode 100644 index 0000000000..34b8cc7da6 --- /dev/null +++ b/dp/longest_bitonic_sequence/cpp/longest_bitonic_sequence.cpp @@ -0,0 +1,44 @@ +#include +using namespace std; +int main(){ + int n; + int cases; + cin>>cases; + while(cases--){ + cin>>n; + vector v(n+1); + for(int i = 0; i < n; i++){ + cin>>v[i]; + } + vector dp(n+1); + for(int i = 0; i v[j]){ + dp[i] = max(dp[i],dp[j]+1); + } + } + } + vector dp1(n+1); + for(int i = 0; i < n; i++){ + dp1[i] = 1; + } + for(int i = n-2; i >=0 ; i--){ + for(int j = n-1; j > i; j--){ + if(v[i] > v[j]){ + dp1[i] = max(dp1[i],dp1[j]+1); + } + } + } + vector ans(n+1); + for(int i = 0; i < n; i++){ + ans[i] = dp[i] + dp1[i] - 1; + } + auto res = *max_element(ans.begin(),ans.end()); + cout< Date: Tue, 17 Oct 2017 21:36:18 +0200 Subject: [PATCH 241/355] Add Ternary search in java --- lab/.gitignore | 21 +++ lab/Gemfile | 49 +++++ lab/Gemfile.lock | 170 ++++++++++++++++++ lab/README.md | 24 +++ lab/Rakefile | 6 + lab/app/assets/config/manifest.js | 3 + lab/app/assets/images/.keep | 0 lab/app/assets/javascripts/application.js | 16 ++ lab/app/assets/javascripts/cable.js | 13 ++ lab/app/assets/javascripts/channels/.keep | 0 lab/app/assets/javascripts/users.coffee | 3 + lab/app/assets/stylesheets/application.css | 15 ++ lab/app/assets/stylesheets/users.scss | 3 + lab/app/channels/application_cable/channel.rb | 4 + .../channels/application_cable/connection.rb | 4 + lab/app/controllers/application_controller.rb | 3 + lab/app/controllers/concerns/.keep | 0 lab/app/controllers/users_controller.rb | 24 +++ lab/app/helpers/application_helper.rb | 2 + lab/app/helpers/users_helper.rb | 2 + lab/app/jobs/application_job.rb | 2 + lab/app/mailers/application_mailer.rb | 4 + lab/app/models/application_record.rb | 3 + lab/app/models/concerns/.keep | 0 lab/app/models/user.rb | 4 + lab/app/views/layouts/application.html.erb | 12 ++ lab/app/views/layouts/mailer.html.erb | 13 ++ lab/app/views/layouts/mailer.text.erb | 1 + lab/app/views/users/index.html.erb | 5 + lab/app/views/users/new.html.erb | 8 + lab/bin/bundle | 3 + lab/bin/rails | 4 + lab/bin/rake | 4 + lab/bin/setup | 34 ++++ lab/bin/update | 29 +++ lab/config.ru | 5 + lab/config/application.rb | 15 ++ lab/config/boot.rb | 3 + lab/config/cable.yml | 9 + lab/config/database.yml | 25 +++ lab/config/environment.rb | 5 + lab/config/environments/development.rb | 54 ++++++ lab/config/environments/production.rb | 86 +++++++++ lab/config/environments/test.rb | 42 +++++ .../application_controller_renderer.rb | 6 + lab/config/initializers/assets.rb | 11 ++ .../initializers/backtrace_silencers.rb | 7 + lab/config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + lab/config/initializers/inflections.rb | 16 ++ lab/config/initializers/mime_types.rb | 4 + .../initializers/new_framework_defaults.rb | 26 +++ lab/config/initializers/session_store.rb | 3 + lab/config/initializers/wrap_parameters.rb | 14 ++ lab/config/locales/en.yml | 23 +++ lab/config/puma.rb | 47 +++++ lab/config/routes.rb | 6 + lab/config/secrets.yml | 22 +++ lab/db/migrate/20170902111617_create_users.rb | 13 ++ lab/db/schema.rb | 24 +++ lab/db/seeds.rb | 7 + lab/lib/assets/.keep | 0 lab/lib/tasks/.keep | 0 lab/log/.keep | 0 lab/public/404.html | 67 +++++++ lab/public/422.html | 67 +++++++ lab/public/500.html | 66 +++++++ lab/public/apple-touch-icon-precomposed.png | 0 lab/public/apple-touch-icon.png | 0 lab/public/favicon.ico | 0 lab/public/robots.txt | 5 + lab/test/controllers/.keep | 0 lab/test/controllers/users_controller_test.rb | 7 + lab/test/fixtures/.keep | 0 lab/test/fixtures/files/.keep | 0 lab/test/fixtures/users.yml | 11 ++ lab/test/helpers/.keep | 0 lab/test/integration/.keep | 0 lab/test/mailers/.keep | 0 lab/test/models/.keep | 0 lab/test/models/user_test.rb | 7 + lab/test/test_helper.rb | 10 ++ lab/tmp/.keep | 0 lab/vendor/assets/javascripts/.keep | 0 lab/vendor/assets/stylesheets/.keep | 0 search/ternary_search/Java/TernarySearch.java | 133 ++++++++++++++ 86 files changed, 1343 insertions(+) create mode 100644 lab/.gitignore create mode 100644 lab/Gemfile create mode 100644 lab/Gemfile.lock create mode 100644 lab/README.md create mode 100644 lab/Rakefile create mode 100644 lab/app/assets/config/manifest.js create mode 100644 lab/app/assets/images/.keep create mode 100644 lab/app/assets/javascripts/application.js create mode 100644 lab/app/assets/javascripts/cable.js create mode 100644 lab/app/assets/javascripts/channels/.keep create mode 100644 lab/app/assets/javascripts/users.coffee create mode 100644 lab/app/assets/stylesheets/application.css create mode 100644 lab/app/assets/stylesheets/users.scss create mode 100644 lab/app/channels/application_cable/channel.rb create mode 100644 lab/app/channels/application_cable/connection.rb create mode 100644 lab/app/controllers/application_controller.rb create mode 100644 lab/app/controllers/concerns/.keep create mode 100644 lab/app/controllers/users_controller.rb create mode 100644 lab/app/helpers/application_helper.rb create mode 100644 lab/app/helpers/users_helper.rb create mode 100644 lab/app/jobs/application_job.rb create mode 100644 lab/app/mailers/application_mailer.rb create mode 100644 lab/app/models/application_record.rb create mode 100644 lab/app/models/concerns/.keep create mode 100644 lab/app/models/user.rb create mode 100644 lab/app/views/layouts/application.html.erb create mode 100644 lab/app/views/layouts/mailer.html.erb create mode 100644 lab/app/views/layouts/mailer.text.erb create mode 100644 lab/app/views/users/index.html.erb create mode 100644 lab/app/views/users/new.html.erb create mode 100644 lab/bin/bundle create mode 100644 lab/bin/rails create mode 100644 lab/bin/rake create mode 100644 lab/bin/setup create mode 100644 lab/bin/update create mode 100644 lab/config.ru create mode 100644 lab/config/application.rb create mode 100644 lab/config/boot.rb create mode 100644 lab/config/cable.yml create mode 100644 lab/config/database.yml create mode 100644 lab/config/environment.rb create mode 100644 lab/config/environments/development.rb create mode 100644 lab/config/environments/production.rb create mode 100644 lab/config/environments/test.rb create mode 100644 lab/config/initializers/application_controller_renderer.rb create mode 100644 lab/config/initializers/assets.rb create mode 100644 lab/config/initializers/backtrace_silencers.rb create mode 100644 lab/config/initializers/cookies_serializer.rb create mode 100644 lab/config/initializers/filter_parameter_logging.rb create mode 100644 lab/config/initializers/inflections.rb create mode 100644 lab/config/initializers/mime_types.rb create mode 100644 lab/config/initializers/new_framework_defaults.rb create mode 100644 lab/config/initializers/session_store.rb create mode 100644 lab/config/initializers/wrap_parameters.rb create mode 100644 lab/config/locales/en.yml create mode 100644 lab/config/puma.rb create mode 100644 lab/config/routes.rb create mode 100644 lab/config/secrets.yml create mode 100644 lab/db/migrate/20170902111617_create_users.rb create mode 100644 lab/db/schema.rb create mode 100644 lab/db/seeds.rb create mode 100644 lab/lib/assets/.keep create mode 100644 lab/lib/tasks/.keep create mode 100644 lab/log/.keep create mode 100644 lab/public/404.html create mode 100644 lab/public/422.html create mode 100644 lab/public/500.html create mode 100644 lab/public/apple-touch-icon-precomposed.png create mode 100644 lab/public/apple-touch-icon.png create mode 100644 lab/public/favicon.ico create mode 100644 lab/public/robots.txt create mode 100644 lab/test/controllers/.keep create mode 100644 lab/test/controllers/users_controller_test.rb create mode 100644 lab/test/fixtures/.keep create mode 100644 lab/test/fixtures/files/.keep create mode 100644 lab/test/fixtures/users.yml create mode 100644 lab/test/helpers/.keep create mode 100644 lab/test/integration/.keep create mode 100644 lab/test/mailers/.keep create mode 100644 lab/test/models/.keep create mode 100644 lab/test/models/user_test.rb create mode 100644 lab/test/test_helper.rb create mode 100644 lab/tmp/.keep create mode 100644 lab/vendor/assets/javascripts/.keep create mode 100644 lab/vendor/assets/stylesheets/.keep create mode 100644 search/ternary_search/Java/TernarySearch.java diff --git a/lab/.gitignore b/lab/.gitignore new file mode 100644 index 0000000000..bab620de0c --- /dev/null +++ b/lab/.gitignore @@ -0,0 +1,21 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore the default SQLite database. +/db/*.sqlite3 +/db/*.sqlite3-journal + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore Byebug command history file. +.byebug_history diff --git a/lab/Gemfile b/lab/Gemfile new file mode 100644 index 0000000000..663e28dda4 --- /dev/null +++ b/lab/Gemfile @@ -0,0 +1,49 @@ +source 'https://rubygems.org' + +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end + + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.0.5' +# Use sqlite3 as the database for Active Record +gem 'sqlite3' +# Use Puma as the app server +gem 'puma', '~> 3.0' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.2' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'therubyracer', platforms: :ruby + +# Use jquery as the JavaScript library +gem 'jquery-rails' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 3.0' +# Use ActiveModel has_secure_password + gem 'bcrypt', '~> 3.1.7' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platform: :mri +end + +group :development do + # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. + gem 'web-console', '>= 3.3.0' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/lab/Gemfile.lock b/lab/Gemfile.lock new file mode 100644 index 0000000000..d0184d92d5 --- /dev/null +++ b/lab/Gemfile.lock @@ -0,0 +1,170 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.0.5) + actionpack (= 5.0.5) + nio4r (>= 1.2, < 3.0) + websocket-driver (~> 0.6.1) + actionmailer (5.0.5) + actionpack (= 5.0.5) + actionview (= 5.0.5) + activejob (= 5.0.5) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.0.5) + actionview (= 5.0.5) + activesupport (= 5.0.5) + rack (~> 2.0) + rack-test (~> 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.0.5) + activesupport (= 5.0.5) + builder (~> 3.1) + erubis (~> 2.7.0) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.0.5) + activesupport (= 5.0.5) + globalid (>= 0.3.6) + activemodel (5.0.5) + activesupport (= 5.0.5) + activerecord (5.0.5) + activemodel (= 5.0.5) + activesupport (= 5.0.5) + arel (~> 7.0) + activesupport (5.0.5) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (~> 0.7) + minitest (~> 5.1) + tzinfo (~> 1.1) + arel (7.1.4) + bcrypt (3.1.11-x86-mingw32) + bindex (0.5.0) + builder (3.2.3) + coffee-rails (4.2.2) + coffee-script (>= 2.2.0) + railties (>= 4.0.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) + concurrent-ruby (1.0.5) + erubis (2.7.0) + execjs (2.7.0) + ffi (1.9.18-x86-mingw32) + globalid (0.4.0) + activesupport (>= 4.2.0) + i18n (0.8.6) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-rails (4.3.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + loofah (2.0.3) + nokogiri (>= 1.5.9) + mail (2.6.6) + mime-types (>= 1.16, < 4) + method_source (0.8.2) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_portile2 (2.2.0) + minitest (5.10.3) + multi_json (1.12.1) + nio4r (2.1.0) + nokogiri (1.8.0-x86-mingw32) + mini_portile2 (~> 2.2.0) + puma (3.10.0) + rack (2.0.3) + rack-test (0.6.3) + rack (>= 1.0) + rails (5.0.5) + actioncable (= 5.0.5) + actionmailer (= 5.0.5) + actionpack (= 5.0.5) + actionview (= 5.0.5) + activejob (= 5.0.5) + activemodel (= 5.0.5) + activerecord (= 5.0.5) + activesupport (= 5.0.5) + bundler (>= 1.3.0) + railties (= 5.0.5) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.3) + loofah (~> 2.0) + railties (5.0.5) + actionpack (= 5.0.5) + activesupport (= 5.0.5) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.0.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + sass (3.5.1) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (5.0.6) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + sqlite3 (1.3.13-x86-mingw32) + thor (0.20.0) + thread_safe (0.3.6) + tilt (2.0.8) + turbolinks (5.0.1) + turbolinks-source (~> 5) + turbolinks-source (5.0.3) + tzinfo (1.2.3) + thread_safe (~> 0.1) + tzinfo-data (1.2017.2) + tzinfo (>= 1.0.0) + uglifier (3.2.0) + execjs (>= 0.3.0, < 3) + web-console (3.5.1) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + websocket-driver (0.6.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.2) + +PLATFORMS + x86-mingw32 + +DEPENDENCIES + bcrypt (~> 3.1.7) + byebug + coffee-rails (~> 4.2) + jbuilder (~> 2.5) + jquery-rails + puma (~> 3.0) + rails (~> 5.0.5) + sass-rails (~> 5.0) + sqlite3 + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +BUNDLED WITH + 1.13.6 diff --git a/lab/README.md b/lab/README.md new file mode 100644 index 0000000000..7db80e4ca1 --- /dev/null +++ b/lab/README.md @@ -0,0 +1,24 @@ +# README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... diff --git a/lab/Rakefile b/lab/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /dev/null +++ b/lab/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/lab/app/assets/config/manifest.js b/lab/app/assets/config/manifest.js new file mode 100644 index 0000000000..b16e53d6d5 --- /dev/null +++ b/lab/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/lab/app/assets/images/.keep b/lab/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/app/assets/javascripts/application.js b/lab/app/assets/javascripts/application.js new file mode 100644 index 0000000000..b12018d099 --- /dev/null +++ b/lab/app/assets/javascripts/application.js @@ -0,0 +1,16 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require jquery +//= require jquery_ujs +//= require turbolinks +//= require_tree . diff --git a/lab/app/assets/javascripts/cable.js b/lab/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..71ee1e66de --- /dev/null +++ b/lab/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the rails generate channel command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/lab/app/assets/javascripts/channels/.keep b/lab/app/assets/javascripts/channels/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/app/assets/javascripts/users.coffee b/lab/app/assets/javascripts/users.coffee new file mode 100644 index 0000000000..24f83d18bb --- /dev/null +++ b/lab/app/assets/javascripts/users.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/lab/app/assets/stylesheets/application.css b/lab/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..0ebd7fe829 --- /dev/null +++ b/lab/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/lab/app/assets/stylesheets/users.scss b/lab/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..31a2eacb84 --- /dev/null +++ b/lab/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/lab/app/channels/application_cable/channel.rb b/lab/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/lab/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/lab/app/channels/application_cable/connection.rb b/lab/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/lab/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/lab/app/controllers/application_controller.rb b/lab/app/controllers/application_controller.rb new file mode 100644 index 0000000000..1c07694e9d --- /dev/null +++ b/lab/app/controllers/application_controller.rb @@ -0,0 +1,3 @@ +class ApplicationController < ActionController::Base + protect_from_forgery with: :exception +end diff --git a/lab/app/controllers/concerns/.keep b/lab/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/app/controllers/users_controller.rb b/lab/app/controllers/users_controller.rb new file mode 100644 index 0000000000..d229bd6004 --- /dev/null +++ b/lab/app/controllers/users_controller.rb @@ -0,0 +1,24 @@ +class UsersController < ApplicationController + def index + @users = User.all + end + def new + @user = User.new +end + def create + @user = User.new(user_params) + if @user.save + session[:user_id] = @user.id + redirect_to '/show' + else + redirect_to '/signup' + end +end + + + private + def user_params + params.require(:user).permit(:first_name, :last_name, :email, :password) + end + +end diff --git a/lab/app/helpers/application_helper.rb b/lab/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/lab/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/lab/app/helpers/users_helper.rb b/lab/app/helpers/users_helper.rb new file mode 100644 index 0000000000..2310a240d7 --- /dev/null +++ b/lab/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/lab/app/jobs/application_job.rb b/lab/app/jobs/application_job.rb new file mode 100644 index 0000000000..a009ace51c --- /dev/null +++ b/lab/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/lab/app/mailers/application_mailer.rb b/lab/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/lab/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/lab/app/models/application_record.rb b/lab/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/lab/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/lab/app/models/concerns/.keep b/lab/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/app/models/user.rb b/lab/app/models/user.rb new file mode 100644 index 0000000000..22bceaaee8 --- /dev/null +++ b/lab/app/models/user.rb @@ -0,0 +1,4 @@ +class User < ApplicationRecord + has_secure_password + +end diff --git a/lab/app/views/layouts/application.html.erb b/lab/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..574f1844c0 --- /dev/null +++ b/lab/app/views/layouts/application.html.erb @@ -0,0 +1,12 @@ + + + + Lab + <%= csrf_meta_tags %> + + + + + <%= yield %> + + diff --git a/lab/app/views/layouts/mailer.html.erb b/lab/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/lab/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/lab/app/views/layouts/mailer.text.erb b/lab/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/lab/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/lab/app/views/users/index.html.erb b/lab/app/views/users/index.html.erb new file mode 100644 index 0000000000..fcb0f03618 --- /dev/null +++ b/lab/app/views/users/index.html.erb @@ -0,0 +1,5 @@ +<% @users.each do |message| %> +

<%= message.email %>

+

<%= message.created_at %>

+<% end %> +<%= link_to 'New Message', "users/new" %> \ No newline at end of file diff --git a/lab/app/views/users/new.html.erb b/lab/app/views/users/new.html.erb new file mode 100644 index 0000000000..7167ff9895 --- /dev/null +++ b/lab/app/views/users/new.html.erb @@ -0,0 +1,8 @@ +<%= form_for(@user) do |f| %> + <%= f.text_field :first_name, :placeholder => "First name" %> + <%= f.text_field :last_name, :placeholder => "Last name" %> + <%= f.email_field :email, :placeholder => "Email" %> + <%= f.password_field :password, :placeholder => "Password" %> + <%= f.submit "Create an account"%> + <% end %> + diff --git a/lab/bin/bundle b/lab/bin/bundle new file mode 100644 index 0000000000..e3c2f622b6 --- /dev/null +++ b/lab/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby.exe +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/lab/bin/rails b/lab/bin/rails new file mode 100644 index 0000000000..bec72ac231 --- /dev/null +++ b/lab/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby.exe +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/lab/bin/rake b/lab/bin/rake new file mode 100644 index 0000000000..f6ed5a2a66 --- /dev/null +++ b/lab/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby.exe +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/lab/bin/setup b/lab/bin/setup new file mode 100644 index 0000000000..929edb73f6 --- /dev/null +++ b/lab/bin/setup @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby.exe +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/lab/bin/update b/lab/bin/update new file mode 100644 index 0000000000..deb1df28e2 --- /dev/null +++ b/lab/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby.exe +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/lab/config.ru b/lab/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/lab/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/lab/config/application.rb b/lab/config/application.rb new file mode 100644 index 0000000000..56312073db --- /dev/null +++ b/lab/config/application.rb @@ -0,0 +1,15 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Lab + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + end +end diff --git a/lab/config/boot.rb b/lab/config/boot.rb new file mode 100644 index 0000000000..30f5120df6 --- /dev/null +++ b/lab/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/lab/config/cable.yml b/lab/config/cable.yml new file mode 100644 index 0000000000..0bbde6f74f --- /dev/null +++ b/lab/config/cable.yml @@ -0,0 +1,9 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 diff --git a/lab/config/database.yml b/lab/config/database.yml new file mode 100644 index 0000000000..1c1a37ca8d --- /dev/null +++ b/lab/config/database.yml @@ -0,0 +1,25 @@ +# SQLite version 3.x +# gem install sqlite3 +# +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' +# +default: &default + adapter: sqlite3 + pool: 5 + timeout: 5000 + +development: + <<: *default + database: db/development.sqlite3 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: db/test.sqlite3 + +production: + <<: *default + database: db/production.sqlite3 diff --git a/lab/config/environment.rb b/lab/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/lab/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/lab/config/environments/development.rb b/lab/config/environments/development.rb new file mode 100644 index 0000000000..e64889cdb3 --- /dev/null +++ b/lab/config/environments/development.rb @@ -0,0 +1,54 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + if Rails.root.join('tmp/caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => 'public, max-age=172800' + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + # config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/lab/config/environments/production.rb b/lab/config/environments/production.rb new file mode 100644 index 0000000000..2f41476a67 --- /dev/null +++ b/lab/config/environments/production.rb @@ -0,0 +1,86 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "lab_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/lab/config/environments/test.rb b/lab/config/environments/test.rb new file mode 100644 index 0000000000..30587ef6d5 --- /dev/null +++ b/lab/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => 'public, max-age=3600' + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/lab/config/initializers/application_controller_renderer.rb b/lab/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..51639b67a0 --- /dev/null +++ b/lab/config/initializers/application_controller_renderer.rb @@ -0,0 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) diff --git a/lab/config/initializers/assets.rb b/lab/config/initializers/assets.rb new file mode 100644 index 0000000000..01ef3e6630 --- /dev/null +++ b/lab/config/initializers/assets.rb @@ -0,0 +1,11 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path +# Rails.application.config.assets.paths << Emoji.images_path + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. +# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/lab/config/initializers/backtrace_silencers.rb b/lab/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/lab/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/lab/config/initializers/cookies_serializer.rb b/lab/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/lab/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/lab/config/initializers/filter_parameter_logging.rb b/lab/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/lab/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/lab/config/initializers/inflections.rb b/lab/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/lab/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/lab/config/initializers/mime_types.rb b/lab/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/lab/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/lab/config/initializers/new_framework_defaults.rb b/lab/config/initializers/new_framework_defaults.rb new file mode 100644 index 0000000000..dd236b5fee --- /dev/null +++ b/lab/config/initializers/new_framework_defaults.rb @@ -0,0 +1,26 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 5.0 upgrade. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +Rails.application.config.action_controller.raise_on_unfiltered_parameters = true + +# Enable per-form CSRF tokens. Previous versions had false. +Rails.application.config.action_controller.per_form_csrf_tokens = true + +# Enable origin-checking CSRF mitigation. Previous versions had false. +Rails.application.config.action_controller.forgery_protection_origin_check = true + +# Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`. +# Previous versions had false. +ActiveSupport.to_time_preserves_timezone = true + +# Require `belongs_to` associations by default. Previous versions had false. +Rails.application.config.active_record.belongs_to_required_by_default = true + +# Do not halt callback chains when a callback returns false. Previous versions had true. +ActiveSupport.halt_callback_chains_on_return_false = false + +# Configure SSL options to enable HSTS with subdomains. Previous versions had false. +Rails.application.config.ssl_options = { hsts: { subdomains: true } } diff --git a/lab/config/initializers/session_store.rb b/lab/config/initializers/session_store.rb new file mode 100644 index 0000000000..9486d8bf21 --- /dev/null +++ b/lab/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_lab_session' diff --git a/lab/config/initializers/wrap_parameters.rb b/lab/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/lab/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/lab/config/locales/en.yml b/lab/config/locales/en.yml new file mode 100644 index 0000000000..0653957166 --- /dev/null +++ b/lab/config/locales/en.yml @@ -0,0 +1,23 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/lab/config/puma.rb b/lab/config/puma.rb new file mode 100644 index 0000000000..c7f311f811 --- /dev/null +++ b/lab/config/puma.rb @@ -0,0 +1,47 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum, this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests, default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted this block will be run, if you are using `preload_app!` +# option you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/lab/config/routes.rb b/lab/config/routes.rb new file mode 100644 index 0000000000..12c1d509b2 --- /dev/null +++ b/lab/config/routes.rb @@ -0,0 +1,6 @@ +Rails.application.routes.draw do + get 'signup' => 'users#new' + resources :users + get 'show' => 'users#index' + +end diff --git a/lab/config/secrets.yml b/lab/config/secrets.yml new file mode 100644 index 0000000000..7a955a1d36 --- /dev/null +++ b/lab/config/secrets.yml @@ -0,0 +1,22 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +development: + secret_key_base: 7192ab37d919c054834febc9c0a63ff983a8b0f4e807974bce0b63512438f45401a59590588518b8154863ecc9516b7973e9510a39419e1746d3312c2eec52dd + +test: + secret_key_base: 67526201ded7448d2da862fe7409eec790375264a087395e20eba755f7b05dcdfe2a1247da110d6652127646ca0746c8e6b84baf8126266134cd82bb459e07d2 + +# Do not keep production secrets in the repository, +# instead read values from the environment. +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/lab/db/migrate/20170902111617_create_users.rb b/lab/db/migrate/20170902111617_create_users.rb new file mode 100644 index 0000000000..3c4e19acdf --- /dev/null +++ b/lab/db/migrate/20170902111617_create_users.rb @@ -0,0 +1,13 @@ +class CreateUsers < ActiveRecord::Migration[5.0] + def change + create_table :users do |t| + t.string :first_name + t.string :last_name + t.string :email + t.string :password_digest + t.string :hamada + + t.timestamps + end + end +end diff --git a/lab/db/schema.rb b/lab/db/schema.rb new file mode 100644 index 0000000000..16fd72090f --- /dev/null +++ b/lab/db/schema.rb @@ -0,0 +1,24 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20170902111617) do + + create_table "users", force: :cascade do |t| + t.string "first_name" + t.string "last_name" + t.string "email" + t.string "password_digest" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/lab/db/seeds.rb b/lab/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/lab/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/lab/lib/assets/.keep b/lab/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/lib/tasks/.keep b/lab/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/log/.keep b/lab/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/public/404.html b/lab/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/lab/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/lab/public/422.html b/lab/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/lab/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/lab/public/500.html b/lab/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/lab/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/lab/public/apple-touch-icon-precomposed.png b/lab/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/public/apple-touch-icon.png b/lab/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/public/favicon.ico b/lab/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/public/robots.txt b/lab/public/robots.txt new file mode 100644 index 0000000000..3c9c7c01f3 --- /dev/null +++ b/lab/public/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: / diff --git a/lab/test/controllers/.keep b/lab/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/controllers/users_controller_test.rb b/lab/test/controllers/users_controller_test.rb new file mode 100644 index 0000000000..6c3da770c9 --- /dev/null +++ b/lab/test/controllers/users_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UsersControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end diff --git a/lab/test/fixtures/.keep b/lab/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/fixtures/files/.keep b/lab/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/fixtures/users.yml b/lab/test/fixtures/users.yml new file mode 100644 index 0000000000..80aed36e30 --- /dev/null +++ b/lab/test/fixtures/users.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/lab/test/helpers/.keep b/lab/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/integration/.keep b/lab/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/mailers/.keep b/lab/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/models/.keep b/lab/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/test/models/user_test.rb b/lab/test/models/user_test.rb new file mode 100644 index 0000000000..82f61e0109 --- /dev/null +++ b/lab/test/models/user_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UserTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/lab/test/test_helper.rb b/lab/test/test_helper.rb new file mode 100644 index 0000000000..92e39b2d78 --- /dev/null +++ b/lab/test/test_helper.rb @@ -0,0 +1,10 @@ +ENV['RAILS_ENV'] ||= 'test' +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/lab/tmp/.keep b/lab/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/vendor/assets/javascripts/.keep b/lab/vendor/assets/javascripts/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lab/vendor/assets/stylesheets/.keep b/lab/vendor/assets/stylesheets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/search/ternary_search/Java/TernarySearch.java b/search/ternary_search/Java/TernarySearch.java new file mode 100644 index 0000000000..69d1d9d4b8 --- /dev/null +++ b/search/ternary_search/Java/TernarySearch.java @@ -0,0 +1,133 @@ + /** + + ** Java Program to Implement Ternary Search Algorithm + + **/ + + + + import java.util.Scanner; + + + + /** Class TernarySearch **/ + + public class TernarySearch + + { + + /** call function **/ + + public static int ternarySearch (int[] A, int value) + + { + + return ternarySearch(A, value, 0, A.length - 1); + + } + + /** TernarySearch function **/ + + public static int ternarySearch (int[] A, int value, int start, int end) + + { + + if (start > end) + + return -1; + + + + /** First boundary: add 1/3 of length to start **/ + + int mid1 = start + (end-start) / 3; + + /** Second boundary: add 2/3 of length to start **/ + + int mid2 = start + 2*(end-start) / 3; + + + + if (A[mid1] == value) + + return mid1; + + + + else if (A[mid2] == value) + + return mid2; + + /** Search 1st third **/ + + else if (value < A[mid1]) + + return ternarySearch (A, value, start, mid1-1); + + /** Search 3rd third **/ + + else if (value > A[mid2]) + + return ternarySearch (A, value, mid2+1, end); + + /** Search middle third **/ + + else + + return ternarySearch (A, value, mid1,mid2); + + } + + /** Main method **/ + + public static void main(String[] args) + + { + + Scanner scan = new Scanner( System.in ); + + System.out.println("Ternary Search Test\n"); + + int n, i; + + /** Accept number of elements **/ + + System.out.println("Enter number of integer elements"); + + n = scan.nextInt(); + + /** Create integer array on n elements **/ + + int arr[] = new int[ n ]; + + /** Accept elements **/ + + System.out.println("\nEnter "+ n +" sorted integer elements"); + + for (i = 0; i < n; i++) + + arr[i] = scan.nextInt(); + + System.out.println("\nEnter element to search for : "); + + int key = scan.nextInt(); + + + + int result = ternarySearch(arr, key); + + + + if (result == -1) + + System.out.println("\n"+ key +" element not found"); + + else + + System.out.println("\n"+ key +" element found at position "+ result); + + + + } + + } \ No newline at end of file From b7eb686e659859c03fc412125372b1419545d69b Mon Sep 17 00:00:00 2001 From: shazly333 Date: Tue, 17 Oct 2017 21:36:59 +0200 Subject: [PATCH 242/355] Add Ternary search in java --- lab/.gitignore | 21 --- lab/Gemfile | 49 ----- lab/Gemfile.lock | 170 ------------------ lab/README.md | 24 --- lab/Rakefile | 6 - lab/app/assets/config/manifest.js | 3 - lab/app/assets/images/.keep | 0 lab/app/assets/javascripts/application.js | 16 -- lab/app/assets/javascripts/cable.js | 13 -- lab/app/assets/javascripts/channels/.keep | 0 lab/app/assets/javascripts/users.coffee | 3 - lab/app/assets/stylesheets/application.css | 15 -- lab/app/assets/stylesheets/users.scss | 3 - lab/app/channels/application_cable/channel.rb | 4 - .../channels/application_cable/connection.rb | 4 - lab/app/controllers/application_controller.rb | 3 - lab/app/controllers/concerns/.keep | 0 lab/app/controllers/users_controller.rb | 24 --- lab/app/helpers/application_helper.rb | 2 - lab/app/helpers/users_helper.rb | 2 - lab/app/jobs/application_job.rb | 2 - lab/app/mailers/application_mailer.rb | 4 - lab/app/models/application_record.rb | 3 - lab/app/models/concerns/.keep | 0 lab/app/models/user.rb | 4 - lab/app/views/layouts/application.html.erb | 12 -- lab/app/views/layouts/mailer.html.erb | 13 -- lab/app/views/layouts/mailer.text.erb | 1 - lab/app/views/users/index.html.erb | 5 - lab/app/views/users/new.html.erb | 8 - lab/bin/bundle | 3 - lab/bin/rails | 4 - lab/bin/rake | 4 - lab/bin/setup | 34 ---- lab/bin/update | 29 --- lab/config.ru | 5 - lab/config/application.rb | 15 -- lab/config/boot.rb | 3 - lab/config/cable.yml | 9 - lab/config/database.yml | 25 --- lab/config/environment.rb | 5 - lab/config/environments/development.rb | 54 ------ lab/config/environments/production.rb | 86 --------- lab/config/environments/test.rb | 42 ----- .../application_controller_renderer.rb | 6 - lab/config/initializers/assets.rb | 11 -- .../initializers/backtrace_silencers.rb | 7 - lab/config/initializers/cookies_serializer.rb | 5 - .../initializers/filter_parameter_logging.rb | 4 - lab/config/initializers/inflections.rb | 16 -- lab/config/initializers/mime_types.rb | 4 - .../initializers/new_framework_defaults.rb | 26 --- lab/config/initializers/session_store.rb | 3 - lab/config/initializers/wrap_parameters.rb | 14 -- lab/config/locales/en.yml | 23 --- lab/config/puma.rb | 47 ----- lab/config/routes.rb | 6 - lab/config/secrets.yml | 22 --- lab/db/migrate/20170902111617_create_users.rb | 13 -- lab/db/schema.rb | 24 --- lab/db/seeds.rb | 7 - lab/lib/assets/.keep | 0 lab/lib/tasks/.keep | 0 lab/log/.keep | 0 lab/public/404.html | 67 ------- lab/public/422.html | 67 ------- lab/public/500.html | 66 ------- lab/public/apple-touch-icon-precomposed.png | 0 lab/public/apple-touch-icon.png | 0 lab/public/favicon.ico | 0 lab/public/robots.txt | 5 - lab/test/controllers/.keep | 0 lab/test/controllers/users_controller_test.rb | 7 - lab/test/fixtures/.keep | 0 lab/test/fixtures/files/.keep | 0 lab/test/fixtures/users.yml | 11 -- lab/test/helpers/.keep | 0 lab/test/integration/.keep | 0 lab/test/mailers/.keep | 0 lab/test/models/.keep | 0 lab/test/models/user_test.rb | 7 - lab/test/test_helper.rb | 10 -- lab/tmp/.keep | 0 lab/vendor/assets/javascripts/.keep | 0 lab/vendor/assets/stylesheets/.keep | 0 85 files changed, 1210 deletions(-) delete mode 100644 lab/.gitignore delete mode 100644 lab/Gemfile delete mode 100644 lab/Gemfile.lock delete mode 100644 lab/README.md delete mode 100644 lab/Rakefile delete mode 100644 lab/app/assets/config/manifest.js delete mode 100644 lab/app/assets/images/.keep delete mode 100644 lab/app/assets/javascripts/application.js delete mode 100644 lab/app/assets/javascripts/cable.js delete mode 100644 lab/app/assets/javascripts/channels/.keep delete mode 100644 lab/app/assets/javascripts/users.coffee delete mode 100644 lab/app/assets/stylesheets/application.css delete mode 100644 lab/app/assets/stylesheets/users.scss delete mode 100644 lab/app/channels/application_cable/channel.rb delete mode 100644 lab/app/channels/application_cable/connection.rb delete mode 100644 lab/app/controllers/application_controller.rb delete mode 100644 lab/app/controllers/concerns/.keep delete mode 100644 lab/app/controllers/users_controller.rb delete mode 100644 lab/app/helpers/application_helper.rb delete mode 100644 lab/app/helpers/users_helper.rb delete mode 100644 lab/app/jobs/application_job.rb delete mode 100644 lab/app/mailers/application_mailer.rb delete mode 100644 lab/app/models/application_record.rb delete mode 100644 lab/app/models/concerns/.keep delete mode 100644 lab/app/models/user.rb delete mode 100644 lab/app/views/layouts/application.html.erb delete mode 100644 lab/app/views/layouts/mailer.html.erb delete mode 100644 lab/app/views/layouts/mailer.text.erb delete mode 100644 lab/app/views/users/index.html.erb delete mode 100644 lab/app/views/users/new.html.erb delete mode 100644 lab/bin/bundle delete mode 100644 lab/bin/rails delete mode 100644 lab/bin/rake delete mode 100644 lab/bin/setup delete mode 100644 lab/bin/update delete mode 100644 lab/config.ru delete mode 100644 lab/config/application.rb delete mode 100644 lab/config/boot.rb delete mode 100644 lab/config/cable.yml delete mode 100644 lab/config/database.yml delete mode 100644 lab/config/environment.rb delete mode 100644 lab/config/environments/development.rb delete mode 100644 lab/config/environments/production.rb delete mode 100644 lab/config/environments/test.rb delete mode 100644 lab/config/initializers/application_controller_renderer.rb delete mode 100644 lab/config/initializers/assets.rb delete mode 100644 lab/config/initializers/backtrace_silencers.rb delete mode 100644 lab/config/initializers/cookies_serializer.rb delete mode 100644 lab/config/initializers/filter_parameter_logging.rb delete mode 100644 lab/config/initializers/inflections.rb delete mode 100644 lab/config/initializers/mime_types.rb delete mode 100644 lab/config/initializers/new_framework_defaults.rb delete mode 100644 lab/config/initializers/session_store.rb delete mode 100644 lab/config/initializers/wrap_parameters.rb delete mode 100644 lab/config/locales/en.yml delete mode 100644 lab/config/puma.rb delete mode 100644 lab/config/routes.rb delete mode 100644 lab/config/secrets.yml delete mode 100644 lab/db/migrate/20170902111617_create_users.rb delete mode 100644 lab/db/schema.rb delete mode 100644 lab/db/seeds.rb delete mode 100644 lab/lib/assets/.keep delete mode 100644 lab/lib/tasks/.keep delete mode 100644 lab/log/.keep delete mode 100644 lab/public/404.html delete mode 100644 lab/public/422.html delete mode 100644 lab/public/500.html delete mode 100644 lab/public/apple-touch-icon-precomposed.png delete mode 100644 lab/public/apple-touch-icon.png delete mode 100644 lab/public/favicon.ico delete mode 100644 lab/public/robots.txt delete mode 100644 lab/test/controllers/.keep delete mode 100644 lab/test/controllers/users_controller_test.rb delete mode 100644 lab/test/fixtures/.keep delete mode 100644 lab/test/fixtures/files/.keep delete mode 100644 lab/test/fixtures/users.yml delete mode 100644 lab/test/helpers/.keep delete mode 100644 lab/test/integration/.keep delete mode 100644 lab/test/mailers/.keep delete mode 100644 lab/test/models/.keep delete mode 100644 lab/test/models/user_test.rb delete mode 100644 lab/test/test_helper.rb delete mode 100644 lab/tmp/.keep delete mode 100644 lab/vendor/assets/javascripts/.keep delete mode 100644 lab/vendor/assets/stylesheets/.keep diff --git a/lab/.gitignore b/lab/.gitignore deleted file mode 100644 index bab620de0c..0000000000 --- a/lab/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# See https://help.github.com/articles/ignoring-files for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile '~/.gitignore_global' - -# Ignore bundler config. -/.bundle - -# Ignore the default SQLite database. -/db/*.sqlite3 -/db/*.sqlite3-journal - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore Byebug command history file. -.byebug_history diff --git a/lab/Gemfile b/lab/Gemfile deleted file mode 100644 index 663e28dda4..0000000000 --- a/lab/Gemfile +++ /dev/null @@ -1,49 +0,0 @@ -source 'https://rubygems.org' - -git_source(:github) do |repo_name| - repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") - "https://github.com/#{repo_name}.git" -end - - -# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 5.0.5' -# Use sqlite3 as the database for Active Record -gem 'sqlite3' -# Use Puma as the app server -gem 'puma', '~> 3.0' -# Use SCSS for stylesheets -gem 'sass-rails', '~> 5.0' -# Use Uglifier as compressor for JavaScript assets -gem 'uglifier', '>= 1.3.0' -# Use CoffeeScript for .coffee assets and views -gem 'coffee-rails', '~> 4.2' -# See https://github.com/rails/execjs#readme for more supported runtimes -# gem 'therubyracer', platforms: :ruby - -# Use jquery as the JavaScript library -gem 'jquery-rails' -# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.5' -# Use Redis adapter to run Action Cable in production -# gem 'redis', '~> 3.0' -# Use ActiveModel has_secure_password - gem 'bcrypt', '~> 3.1.7' - -# Use Capistrano for deployment -# gem 'capistrano-rails', group: :development - -group :development, :test do - # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platform: :mri -end - -group :development do - # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. - gem 'web-console', '>= 3.3.0' -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/lab/Gemfile.lock b/lab/Gemfile.lock deleted file mode 100644 index d0184d92d5..0000000000 --- a/lab/Gemfile.lock +++ /dev/null @@ -1,170 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - actioncable (5.0.5) - actionpack (= 5.0.5) - nio4r (>= 1.2, < 3.0) - websocket-driver (~> 0.6.1) - actionmailer (5.0.5) - actionpack (= 5.0.5) - actionview (= 5.0.5) - activejob (= 5.0.5) - mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 2.0) - actionpack (5.0.5) - actionview (= 5.0.5) - activesupport (= 5.0.5) - rack (~> 2.0) - rack-test (~> 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.0.5) - activesupport (= 5.0.5) - builder (~> 3.1) - erubis (~> 2.7.0) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.0.5) - activesupport (= 5.0.5) - globalid (>= 0.3.6) - activemodel (5.0.5) - activesupport (= 5.0.5) - activerecord (5.0.5) - activemodel (= 5.0.5) - activesupport (= 5.0.5) - arel (~> 7.0) - activesupport (5.0.5) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (~> 0.7) - minitest (~> 5.1) - tzinfo (~> 1.1) - arel (7.1.4) - bcrypt (3.1.11-x86-mingw32) - bindex (0.5.0) - builder (3.2.3) - coffee-rails (4.2.2) - coffee-script (>= 2.2.0) - railties (>= 4.0.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - concurrent-ruby (1.0.5) - erubis (2.7.0) - execjs (2.7.0) - ffi (1.9.18-x86-mingw32) - globalid (0.4.0) - activesupport (>= 4.2.0) - i18n (0.8.6) - jbuilder (2.7.0) - activesupport (>= 4.2.0) - multi_json (>= 1.2) - jquery-rails (4.3.1) - rails-dom-testing (>= 1, < 3) - railties (>= 4.2.0) - thor (>= 0.14, < 2.0) - loofah (2.0.3) - nokogiri (>= 1.5.9) - mail (2.6.6) - mime-types (>= 1.16, < 4) - method_source (0.8.2) - mime-types (3.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2016.0521) - mini_portile2 (2.2.0) - minitest (5.10.3) - multi_json (1.12.1) - nio4r (2.1.0) - nokogiri (1.8.0-x86-mingw32) - mini_portile2 (~> 2.2.0) - puma (3.10.0) - rack (2.0.3) - rack-test (0.6.3) - rack (>= 1.0) - rails (5.0.5) - actioncable (= 5.0.5) - actionmailer (= 5.0.5) - actionpack (= 5.0.5) - actionview (= 5.0.5) - activejob (= 5.0.5) - activemodel (= 5.0.5) - activerecord (= 5.0.5) - activesupport (= 5.0.5) - bundler (>= 1.3.0) - railties (= 5.0.5) - sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) - nokogiri (>= 1.6) - rails-html-sanitizer (1.0.3) - loofah (~> 2.0) - railties (5.0.5) - actionpack (= 5.0.5) - activesupport (= 5.0.5) - method_source - rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) - rake (12.0.0) - rb-fsevent (0.10.2) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) - sass (3.5.1) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sass-rails (5.0.6) - railties (>= 4.0.0, < 6) - sass (~> 3.1) - sprockets (>= 2.8, < 4.0) - sprockets-rails (>= 2.0, < 4.0) - tilt (>= 1.1, < 3) - sprockets (3.7.1) - concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.1) - actionpack (>= 4.0) - activesupport (>= 4.0) - sprockets (>= 3.0.0) - sqlite3 (1.3.13-x86-mingw32) - thor (0.20.0) - thread_safe (0.3.6) - tilt (2.0.8) - turbolinks (5.0.1) - turbolinks-source (~> 5) - turbolinks-source (5.0.3) - tzinfo (1.2.3) - thread_safe (~> 0.1) - tzinfo-data (1.2017.2) - tzinfo (>= 1.0.0) - uglifier (3.2.0) - execjs (>= 0.3.0, < 3) - web-console (3.5.1) - actionview (>= 5.0) - activemodel (>= 5.0) - bindex (>= 0.4.0) - railties (>= 5.0) - websocket-driver (0.6.5) - websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.2) - -PLATFORMS - x86-mingw32 - -DEPENDENCIES - bcrypt (~> 3.1.7) - byebug - coffee-rails (~> 4.2) - jbuilder (~> 2.5) - jquery-rails - puma (~> 3.0) - rails (~> 5.0.5) - sass-rails (~> 5.0) - sqlite3 - turbolinks (~> 5) - tzinfo-data - uglifier (>= 1.3.0) - web-console (>= 3.3.0) - -BUNDLED WITH - 1.13.6 diff --git a/lab/README.md b/lab/README.md deleted file mode 100644 index 7db80e4ca1..0000000000 --- a/lab/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# README - -This README would normally document whatever steps are necessary to get the -application up and running. - -Things you may want to cover: - -* Ruby version - -* System dependencies - -* Configuration - -* Database creation - -* Database initialization - -* How to run the test suite - -* Services (job queues, cache servers, search engines, etc.) - -* Deployment instructions - -* ... diff --git a/lab/Rakefile b/lab/Rakefile deleted file mode 100644 index e85f913914..0000000000 --- a/lab/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require_relative 'config/application' - -Rails.application.load_tasks diff --git a/lab/app/assets/config/manifest.js b/lab/app/assets/config/manifest.js deleted file mode 100644 index b16e53d6d5..0000000000 --- a/lab/app/assets/config/manifest.js +++ /dev/null @@ -1,3 +0,0 @@ -//= link_tree ../images -//= link_directory ../javascripts .js -//= link_directory ../stylesheets .css diff --git a/lab/app/assets/images/.keep b/lab/app/assets/images/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/app/assets/javascripts/application.js b/lab/app/assets/javascripts/application.js deleted file mode 100644 index b12018d099..0000000000 --- a/lab/app/assets/javascripts/application.js +++ /dev/null @@ -1,16 +0,0 @@ -// This is a manifest file that'll be compiled into application.js, which will include all the files -// listed below. -// -// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, -// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. -// -// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// compiled file. JavaScript code in this file should be added after the last require_* statement. -// -// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details -// about supported directives. -// -//= require jquery -//= require jquery_ujs -//= require turbolinks -//= require_tree . diff --git a/lab/app/assets/javascripts/cable.js b/lab/app/assets/javascripts/cable.js deleted file mode 100644 index 71ee1e66de..0000000000 --- a/lab/app/assets/javascripts/cable.js +++ /dev/null @@ -1,13 +0,0 @@ -// Action Cable provides the framework to deal with WebSockets in Rails. -// You can generate new channels where WebSocket features live using the rails generate channel command. -// -//= require action_cable -//= require_self -//= require_tree ./channels - -(function() { - this.App || (this.App = {}); - - App.cable = ActionCable.createConsumer(); - -}).call(this); diff --git a/lab/app/assets/javascripts/channels/.keep b/lab/app/assets/javascripts/channels/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/app/assets/javascripts/users.coffee b/lab/app/assets/javascripts/users.coffee deleted file mode 100644 index 24f83d18bb..0000000000 --- a/lab/app/assets/javascripts/users.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/lab/app/assets/stylesheets/application.css b/lab/app/assets/stylesheets/application.css deleted file mode 100644 index 0ebd7fe829..0000000000 --- a/lab/app/assets/stylesheets/application.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS - * files in this directory. Styles in this file should be added after the last require_* statement. - * It is generally better to create a new file per style scope. - * - *= require_tree . - *= require_self - */ diff --git a/lab/app/assets/stylesheets/users.scss b/lab/app/assets/stylesheets/users.scss deleted file mode 100644 index 31a2eacb84..0000000000 --- a/lab/app/assets/stylesheets/users.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the Users controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/lab/app/channels/application_cable/channel.rb b/lab/app/channels/application_cable/channel.rb deleted file mode 100644 index d672697283..0000000000 --- a/lab/app/channels/application_cable/channel.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ApplicationCable - class Channel < ActionCable::Channel::Base - end -end diff --git a/lab/app/channels/application_cable/connection.rb b/lab/app/channels/application_cable/connection.rb deleted file mode 100644 index 0ff5442f47..0000000000 --- a/lab/app/channels/application_cable/connection.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ApplicationCable - class Connection < ActionCable::Connection::Base - end -end diff --git a/lab/app/controllers/application_controller.rb b/lab/app/controllers/application_controller.rb deleted file mode 100644 index 1c07694e9d..0000000000 --- a/lab/app/controllers/application_controller.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationController < ActionController::Base - protect_from_forgery with: :exception -end diff --git a/lab/app/controllers/concerns/.keep b/lab/app/controllers/concerns/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/app/controllers/users_controller.rb b/lab/app/controllers/users_controller.rb deleted file mode 100644 index d229bd6004..0000000000 --- a/lab/app/controllers/users_controller.rb +++ /dev/null @@ -1,24 +0,0 @@ -class UsersController < ApplicationController - def index - @users = User.all - end - def new - @user = User.new -end - def create - @user = User.new(user_params) - if @user.save - session[:user_id] = @user.id - redirect_to '/show' - else - redirect_to '/signup' - end -end - - - private - def user_params - params.require(:user).permit(:first_name, :last_name, :email, :password) - end - -end diff --git a/lab/app/helpers/application_helper.rb b/lab/app/helpers/application_helper.rb deleted file mode 100644 index de6be7945c..0000000000 --- a/lab/app/helpers/application_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module ApplicationHelper -end diff --git a/lab/app/helpers/users_helper.rb b/lab/app/helpers/users_helper.rb deleted file mode 100644 index 2310a240d7..0000000000 --- a/lab/app/helpers/users_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module UsersHelper -end diff --git a/lab/app/jobs/application_job.rb b/lab/app/jobs/application_job.rb deleted file mode 100644 index a009ace51c..0000000000 --- a/lab/app/jobs/application_job.rb +++ /dev/null @@ -1,2 +0,0 @@ -class ApplicationJob < ActiveJob::Base -end diff --git a/lab/app/mailers/application_mailer.rb b/lab/app/mailers/application_mailer.rb deleted file mode 100644 index 286b2239d1..0000000000 --- a/lab/app/mailers/application_mailer.rb +++ /dev/null @@ -1,4 +0,0 @@ -class ApplicationMailer < ActionMailer::Base - default from: 'from@example.com' - layout 'mailer' -end diff --git a/lab/app/models/application_record.rb b/lab/app/models/application_record.rb deleted file mode 100644 index 10a4cba84d..0000000000 --- a/lab/app/models/application_record.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationRecord < ActiveRecord::Base - self.abstract_class = true -end diff --git a/lab/app/models/concerns/.keep b/lab/app/models/concerns/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/app/models/user.rb b/lab/app/models/user.rb deleted file mode 100644 index 22bceaaee8..0000000000 --- a/lab/app/models/user.rb +++ /dev/null @@ -1,4 +0,0 @@ -class User < ApplicationRecord - has_secure_password - -end diff --git a/lab/app/views/layouts/application.html.erb b/lab/app/views/layouts/application.html.erb deleted file mode 100644 index 574f1844c0..0000000000 --- a/lab/app/views/layouts/application.html.erb +++ /dev/null @@ -1,12 +0,0 @@ - - - - Lab - <%= csrf_meta_tags %> - - - - - <%= yield %> - - diff --git a/lab/app/views/layouts/mailer.html.erb b/lab/app/views/layouts/mailer.html.erb deleted file mode 100644 index cbd34d2e9d..0000000000 --- a/lab/app/views/layouts/mailer.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - <%= yield %> - - diff --git a/lab/app/views/layouts/mailer.text.erb b/lab/app/views/layouts/mailer.text.erb deleted file mode 100644 index 37f0bddbd7..0000000000 --- a/lab/app/views/layouts/mailer.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/lab/app/views/users/index.html.erb b/lab/app/views/users/index.html.erb deleted file mode 100644 index fcb0f03618..0000000000 --- a/lab/app/views/users/index.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -<% @users.each do |message| %> -

<%= message.email %>

-

<%= message.created_at %>

-<% end %> -<%= link_to 'New Message', "users/new" %> \ No newline at end of file diff --git a/lab/app/views/users/new.html.erb b/lab/app/views/users/new.html.erb deleted file mode 100644 index 7167ff9895..0000000000 --- a/lab/app/views/users/new.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -<%= form_for(@user) do |f| %> - <%= f.text_field :first_name, :placeholder => "First name" %> - <%= f.text_field :last_name, :placeholder => "Last name" %> - <%= f.email_field :email, :placeholder => "Email" %> - <%= f.password_field :password, :placeholder => "Password" %> - <%= f.submit "Create an account"%> - <% end %> - diff --git a/lab/bin/bundle b/lab/bin/bundle deleted file mode 100644 index e3c2f622b6..0000000000 --- a/lab/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby.exe -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/lab/bin/rails b/lab/bin/rails deleted file mode 100644 index bec72ac231..0000000000 --- a/lab/bin/rails +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby.exe -APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' diff --git a/lab/bin/rake b/lab/bin/rake deleted file mode 100644 index f6ed5a2a66..0000000000 --- a/lab/bin/rake +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby.exe -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/lab/bin/setup b/lab/bin/setup deleted file mode 100644 index 929edb73f6..0000000000 --- a/lab/bin/setup +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env ruby.exe -require 'pathname' -require 'fileutils' -include FileUtils - -# path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) - -def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") -end - -chdir APP_ROOT do - # This script is a starting point to setup your application. - # Add necessary setup steps to this file. - - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') - - # puts "\n== Copying sample files ==" - # unless File.exist?('config/database.yml') - # cp 'config/database.yml.sample', 'config/database.yml' - # end - - puts "\n== Preparing database ==" - system! 'bin/rails db:setup' - - puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' - - puts "\n== Restarting application server ==" - system! 'bin/rails restart' -end diff --git a/lab/bin/update b/lab/bin/update deleted file mode 100644 index deb1df28e2..0000000000 --- a/lab/bin/update +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby.exe -require 'pathname' -require 'fileutils' -include FileUtils - -# path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) - -def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") -end - -chdir APP_ROOT do - # This script is a way to update your development environment automatically. - # Add necessary update steps to this file. - - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') - - puts "\n== Updating database ==" - system! 'bin/rails db:migrate' - - puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' - - puts "\n== Restarting application server ==" - system! 'bin/rails restart' -end diff --git a/lab/config.ru b/lab/config.ru deleted file mode 100644 index f7ba0b527b..0000000000 --- a/lab/config.ru +++ /dev/null @@ -1,5 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -require_relative 'config/environment' - -run Rails.application diff --git a/lab/config/application.rb b/lab/config/application.rb deleted file mode 100644 index 56312073db..0000000000 --- a/lab/config/application.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative 'boot' - -require 'rails/all' - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(*Rails.groups) - -module Lab - class Application < Rails::Application - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. - end -end diff --git a/lab/config/boot.rb b/lab/config/boot.rb deleted file mode 100644 index 30f5120df6..0000000000 --- a/lab/config/boot.rb +++ /dev/null @@ -1,3 +0,0 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) - -require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/lab/config/cable.yml b/lab/config/cable.yml deleted file mode 100644 index 0bbde6f74f..0000000000 --- a/lab/config/cable.yml +++ /dev/null @@ -1,9 +0,0 @@ -development: - adapter: async - -test: - adapter: async - -production: - adapter: redis - url: redis://localhost:6379/1 diff --git a/lab/config/database.yml b/lab/config/database.yml deleted file mode 100644 index 1c1a37ca8d..0000000000 --- a/lab/config/database.yml +++ /dev/null @@ -1,25 +0,0 @@ -# SQLite version 3.x -# gem install sqlite3 -# -# Ensure the SQLite 3 gem is defined in your Gemfile -# gem 'sqlite3' -# -default: &default - adapter: sqlite3 - pool: 5 - timeout: 5000 - -development: - <<: *default - database: db/development.sqlite3 - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - <<: *default - database: db/test.sqlite3 - -production: - <<: *default - database: db/production.sqlite3 diff --git a/lab/config/environment.rb b/lab/config/environment.rb deleted file mode 100644 index 426333bb46..0000000000 --- a/lab/config/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the Rails application. -require_relative 'application' - -# Initialize the Rails application. -Rails.application.initialize! diff --git a/lab/config/environments/development.rb b/lab/config/environments/development.rb deleted file mode 100644 index e64889cdb3..0000000000 --- a/lab/config/environments/development.rb +++ /dev/null @@ -1,54 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Do not eager load code on boot. - config.eager_load = false - - # Show full error reports. - config.consider_all_requests_local = true - - # Enable/disable caching. By default caching is disabled. - if Rails.root.join('tmp/caching-dev.txt').exist? - config.action_controller.perform_caching = true - - config.cache_store = :memory_store - config.public_file_server.headers = { - 'Cache-Control' => 'public, max-age=172800' - } - else - config.action_controller.perform_caching = false - - config.cache_store = :null_store - end - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - config.action_mailer.perform_caching = false - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true - - # Suppress logger output for asset requests. - config.assets.quiet = true - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true - - # Use an evented file watcher to asynchronously detect changes in source code, - # routes, locales, etc. This feature depends on the listen gem. - # config.file_watcher = ActiveSupport::EventedFileUpdateChecker -end diff --git a/lab/config/environments/production.rb b/lab/config/environments/production.rb deleted file mode 100644 index 2f41476a67..0000000000 --- a/lab/config/environments/production.rb +++ /dev/null @@ -1,86 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? - - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false - - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - - # Mount Action Cable outside main process or domain - # config.action_cable.mount_path = nil - # config.action_cable.url = 'wss://example.com/cable' - # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true - - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug - - # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Use a real queuing backend for Active Job (and separate queues per environment) - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "lab_#{Rails.env}" - config.action_mailer.perform_caching = false - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require 'syslog/logger' - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false -end diff --git a/lab/config/environments/test.rb b/lab/config/environments/test.rb deleted file mode 100644 index 30587ef6d5..0000000000 --- a/lab/config/environments/test.rb +++ /dev/null @@ -1,42 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! - config.cache_classes = true - - # Do not eager load code on boot. This avoids loading your whole application - # just for the purpose of running a single test. If you are using a tool that - # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false - - # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.enabled = true - config.public_file_server.headers = { - 'Cache-Control' => 'public, max-age=3600' - } - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false - - # Disable request forgery protection in test environment. - config.action_controller.allow_forgery_protection = false - config.action_mailer.perform_caching = false - - # Tell Action Mailer not to deliver emails to the real world. - # The :test delivery method accumulates sent emails in the - # ActionMailer::Base.deliveries array. - config.action_mailer.delivery_method = :test - - # Print deprecation notices to the stderr. - config.active_support.deprecation = :stderr - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true -end diff --git a/lab/config/initializers/application_controller_renderer.rb b/lab/config/initializers/application_controller_renderer.rb deleted file mode 100644 index 51639b67a0..0000000000 --- a/lab/config/initializers/application_controller_renderer.rb +++ /dev/null @@ -1,6 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# ApplicationController.renderer.defaults.merge!( -# http_host: 'example.org', -# https: false -# ) diff --git a/lab/config/initializers/assets.rb b/lab/config/initializers/assets.rb deleted file mode 100644 index 01ef3e6630..0000000000 --- a/lab/config/initializers/assets.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' - -# Add additional assets to the asset load path -# Rails.application.config.assets.paths << Emoji.images_path - -# Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/lab/config/initializers/backtrace_silencers.rb b/lab/config/initializers/backtrace_silencers.rb deleted file mode 100644 index 59385cdf37..0000000000 --- a/lab/config/initializers/backtrace_silencers.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } - -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! diff --git a/lab/config/initializers/cookies_serializer.rb b/lab/config/initializers/cookies_serializer.rb deleted file mode 100644 index 5a6a32d371..0000000000 --- a/lab/config/initializers/cookies_serializer.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Specify a serializer for the signed and encrypted cookie jars. -# Valid options are :json, :marshal, and :hybrid. -Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/lab/config/initializers/filter_parameter_logging.rb b/lab/config/initializers/filter_parameter_logging.rb deleted file mode 100644 index 4a994e1e7b..0000000000 --- a/lab/config/initializers/filter_parameter_logging.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] diff --git a/lab/config/initializers/inflections.rb b/lab/config/initializers/inflections.rb deleted file mode 100644 index ac033bf9dc..0000000000 --- a/lab/config/initializers/inflections.rb +++ /dev/null @@ -1,16 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format. Inflections -# are locale specific, and you may define rules for as many different -# locales as you wish. All of these examples are active by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym 'RESTful' -# end diff --git a/lab/config/initializers/mime_types.rb b/lab/config/initializers/mime_types.rb deleted file mode 100644 index dc1899682b..0000000000 --- a/lab/config/initializers/mime_types.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new mime types for use in respond_to blocks: -# Mime::Type.register "text/richtext", :rtf diff --git a/lab/config/initializers/new_framework_defaults.rb b/lab/config/initializers/new_framework_defaults.rb deleted file mode 100644 index dd236b5fee..0000000000 --- a/lab/config/initializers/new_framework_defaults.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Be sure to restart your server when you modify this file. -# -# This file contains migration options to ease your Rails 5.0 upgrade. -# -# Read the Guide for Upgrading Ruby on Rails for more info on each option. - -Rails.application.config.action_controller.raise_on_unfiltered_parameters = true - -# Enable per-form CSRF tokens. Previous versions had false. -Rails.application.config.action_controller.per_form_csrf_tokens = true - -# Enable origin-checking CSRF mitigation. Previous versions had false. -Rails.application.config.action_controller.forgery_protection_origin_check = true - -# Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`. -# Previous versions had false. -ActiveSupport.to_time_preserves_timezone = true - -# Require `belongs_to` associations by default. Previous versions had false. -Rails.application.config.active_record.belongs_to_required_by_default = true - -# Do not halt callback chains when a callback returns false. Previous versions had true. -ActiveSupport.halt_callback_chains_on_return_false = false - -# Configure SSL options to enable HSTS with subdomains. Previous versions had false. -Rails.application.config.ssl_options = { hsts: { subdomains: true } } diff --git a/lab/config/initializers/session_store.rb b/lab/config/initializers/session_store.rb deleted file mode 100644 index 9486d8bf21..0000000000 --- a/lab/config/initializers/session_store.rb +++ /dev/null @@ -1,3 +0,0 @@ -# Be sure to restart your server when you modify this file. - -Rails.application.config.session_store :cookie_store, key: '_lab_session' diff --git a/lab/config/initializers/wrap_parameters.rb b/lab/config/initializers/wrap_parameters.rb deleted file mode 100644 index bbfc3961bf..0000000000 --- a/lab/config/initializers/wrap_parameters.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# This file contains settings for ActionController::ParamsWrapper which -# is enabled by default. - -# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. -ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] -end - -# To enable root element in JSON for ActiveRecord objects. -# ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true -# end diff --git a/lab/config/locales/en.yml b/lab/config/locales/en.yml deleted file mode 100644 index 0653957166..0000000000 --- a/lab/config/locales/en.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Files in the config/locales directory are used for internationalization -# and are automatically loaded by Rails. If you want to use locales other -# than English, add the necessary files in this directory. -# -# To use the locales, use `I18n.t`: -# -# I18n.t 'hello' -# -# In views, this is aliased to just `t`: -# -# <%= t('hello') %> -# -# To use a different locale, set it with `I18n.locale`: -# -# I18n.locale = :es -# -# This would use the information in config/locales/es.yml. -# -# To learn more, please read the Rails Internationalization guide -# available at http://guides.rubyonrails.org/i18n.html. - -en: - hello: "Hello world" diff --git a/lab/config/puma.rb b/lab/config/puma.rb deleted file mode 100644 index c7f311f811..0000000000 --- a/lab/config/puma.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum, this matches the default thread size of Active Record. -# -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i -threads threads_count, threads_count - -# Specifies the `port` that Puma will listen on to receive requests, default is 3000. -# -port ENV.fetch("PORT") { 3000 } - -# Specifies the `environment` that Puma will run in. -# -environment ENV.fetch("RAILS_ENV") { "development" } - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked webserver processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. If you use this option -# you need to make sure to reconnect any threads in the `on_worker_boot` -# block. -# -# preload_app! - -# The code in the `on_worker_boot` will be called if you are using -# clustered mode by specifying a number of `workers`. After each worker -# process is booted this block will be run, if you are using `preload_app!` -# option you will want to use this block to reconnect to any threads -# or connections that may have been created at application boot, Ruby -# cannot share connections between processes. -# -# on_worker_boot do -# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) -# end - -# Allow puma to be restarted by `rails restart` command. -plugin :tmp_restart diff --git a/lab/config/routes.rb b/lab/config/routes.rb deleted file mode 100644 index 12c1d509b2..0000000000 --- a/lab/config/routes.rb +++ /dev/null @@ -1,6 +0,0 @@ -Rails.application.routes.draw do - get 'signup' => 'users#new' - resources :users - get 'show' => 'users#index' - -end diff --git a/lab/config/secrets.yml b/lab/config/secrets.yml deleted file mode 100644 index 7a955a1d36..0000000000 --- a/lab/config/secrets.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! - -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# You can use `rails secret` to generate a secure secret key. - -# Make sure the secrets in this file are kept private -# if you're sharing your code publicly. - -development: - secret_key_base: 7192ab37d919c054834febc9c0a63ff983a8b0f4e807974bce0b63512438f45401a59590588518b8154863ecc9516b7973e9510a39419e1746d3312c2eec52dd - -test: - secret_key_base: 67526201ded7448d2da862fe7409eec790375264a087395e20eba755f7b05dcdfe2a1247da110d6652127646ca0746c8e6b84baf8126266134cd82bb459e07d2 - -# Do not keep production secrets in the repository, -# instead read values from the environment. -production: - secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/lab/db/migrate/20170902111617_create_users.rb b/lab/db/migrate/20170902111617_create_users.rb deleted file mode 100644 index 3c4e19acdf..0000000000 --- a/lab/db/migrate/20170902111617_create_users.rb +++ /dev/null @@ -1,13 +0,0 @@ -class CreateUsers < ActiveRecord::Migration[5.0] - def change - create_table :users do |t| - t.string :first_name - t.string :last_name - t.string :email - t.string :password_digest - t.string :hamada - - t.timestamps - end - end -end diff --git a/lab/db/schema.rb b/lab/db/schema.rb deleted file mode 100644 index 16fd72090f..0000000000 --- a/lab/db/schema.rb +++ /dev/null @@ -1,24 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 20170902111617) do - - create_table "users", force: :cascade do |t| - t.string "first_name" - t.string "last_name" - t.string "email" - t.string "password_digest" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - -end diff --git a/lab/db/seeds.rb b/lab/db/seeds.rb deleted file mode 100644 index 1beea2accd..0000000000 --- a/lab/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) diff --git a/lab/lib/assets/.keep b/lab/lib/assets/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/lib/tasks/.keep b/lab/lib/tasks/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/log/.keep b/lab/log/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/public/404.html b/lab/public/404.html deleted file mode 100644 index 2be3af26fc..0000000000 --- a/lab/public/404.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - - - -
-
-

The page you were looking for doesn't exist.

-

You may have mistyped the address or the page may have moved.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/lab/public/422.html b/lab/public/422.html deleted file mode 100644 index c08eac0d1d..0000000000 --- a/lab/public/422.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - - -
-
-

The change you wanted was rejected.

-

Maybe you tried to change something you didn't have access to.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/lab/public/500.html b/lab/public/500.html deleted file mode 100644 index 78a030af22..0000000000 --- a/lab/public/500.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - We're sorry, but something went wrong (500) - - - - - - -
-
-

We're sorry, but something went wrong.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/lab/public/apple-touch-icon-precomposed.png b/lab/public/apple-touch-icon-precomposed.png deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/public/apple-touch-icon.png b/lab/public/apple-touch-icon.png deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/public/favicon.ico b/lab/public/favicon.ico deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/public/robots.txt b/lab/public/robots.txt deleted file mode 100644 index 3c9c7c01f3..0000000000 --- a/lab/public/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-agent: * -# Disallow: / diff --git a/lab/test/controllers/.keep b/lab/test/controllers/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/controllers/users_controller_test.rb b/lab/test/controllers/users_controller_test.rb deleted file mode 100644 index 6c3da770c9..0000000000 --- a/lab/test/controllers/users_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class UsersControllerTest < ActionDispatch::IntegrationTest - # test "the truth" do - # assert true - # end -end diff --git a/lab/test/fixtures/.keep b/lab/test/fixtures/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/fixtures/files/.keep b/lab/test/fixtures/files/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/fixtures/users.yml b/lab/test/fixtures/users.yml deleted file mode 100644 index 80aed36e30..0000000000 --- a/lab/test/fixtures/users.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -# This model initially had no columns defined. If you add columns to the -# model remove the '{}' from the fixture names and add the columns immediately -# below each fixture, per the syntax in the comments below -# -one: {} -# column: value -# -two: {} -# column: value diff --git a/lab/test/helpers/.keep b/lab/test/helpers/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/integration/.keep b/lab/test/integration/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/mailers/.keep b/lab/test/mailers/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/models/.keep b/lab/test/models/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/test/models/user_test.rb b/lab/test/models/user_test.rb deleted file mode 100644 index 82f61e0109..0000000000 --- a/lab/test/models/user_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class UserTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/lab/test/test_helper.rb b/lab/test/test_helper.rb deleted file mode 100644 index 92e39b2d78..0000000000 --- a/lab/test/test_helper.rb +++ /dev/null @@ -1,10 +0,0 @@ -ENV['RAILS_ENV'] ||= 'test' -require File.expand_path('../../config/environment', __FILE__) -require 'rails/test_help' - -class ActiveSupport::TestCase - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... -end diff --git a/lab/tmp/.keep b/lab/tmp/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/vendor/assets/javascripts/.keep b/lab/vendor/assets/javascripts/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lab/vendor/assets/stylesheets/.keep b/lab/vendor/assets/stylesheets/.keep deleted file mode 100644 index e69de29bb2..0000000000 From e1a37a66cb5c2f73cd5b64c5b0bc1fc77243d17c Mon Sep 17 00:00:00 2001 From: Adelmo Junior Date: Tue, 17 Oct 2017 18:14:43 -0300 Subject: [PATCH 243/355] fix heap_sort test case --- sort/heap_sort/python/heap_sort.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sort/heap_sort/python/heap_sort.py b/sort/heap_sort/python/heap_sort.py index 1fe28b4404..19d5f4b38a 100644 --- a/sort/heap_sort/python/heap_sort.py +++ b/sort/heap_sort/python/heap_sort.py @@ -36,12 +36,12 @@ def heapSort(arr): heapify(arr, i, 0) def test(): - test1 = [12, 11, 13, 5, 6, 7] - test2 = [10,67,2,998,23,56,32,21,91,21,22] + test1 = test3 = [12, 11, 13, 5, 6, 7] + test2 = test4 = [10,67,2,998,23,56,32,21,91,21,22] heapSort(test1) heapSort(test2) - print(test1) - print(test2) + assert (sorted(test3) == test1) + assert (sorted(test4) == test2) if __name__=="__main__": test() From aeff0359c24e829612ce097f6711071d1ec4663b Mon Sep 17 00:00:00 2001 From: Braulio Ruiz Date: Tue, 17 Oct 2017 18:27:23 -0500 Subject: [PATCH 244/355] Add test for ArrayStack.js --- .../Stack/javascript/ArrayStack.js | 4 +- .../Stack/javascript/ArrayStack_test.js | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 data_structures/Stack/javascript/ArrayStack_test.js diff --git a/data_structures/Stack/javascript/ArrayStack.js b/data_structures/Stack/javascript/ArrayStack.js index 0088203b20..c72c598a4b 100644 --- a/data_structures/Stack/javascript/ArrayStack.js +++ b/data_structures/Stack/javascript/ArrayStack.js @@ -20,4 +20,6 @@ function Stack() { this.clear = function() { items = []; }; -} \ No newline at end of file +} + +module.exports = Stack; diff --git a/data_structures/Stack/javascript/ArrayStack_test.js b/data_structures/Stack/javascript/ArrayStack_test.js new file mode 100644 index 0000000000..d0ad9dc351 --- /dev/null +++ b/data_structures/Stack/javascript/ArrayStack_test.js @@ -0,0 +1,45 @@ +// use jasmine to run this file +// https://jasmine.github.io +// +// npm install -g jasmine +// jasmine + +const Stack = require('./ArrayStack'); + +describe('Stack [data-structure]', function(){ + let myStack = new Stack(); + const sampleData = [1,2,3,4,10,23,2]; + + it("IsEmpty at the begining", function() { + expect(myStack.isEmpty()).toBe(true); + }); + + it("Can add elements with Push", function() { + for (let index = 0; index < sampleData.length; index++) { + let element = sampleData[index]; + myStack.push(element); + expect(myStack.isEmpty()).toBe(false); + } + }); + + it("Can retrieve elements with Pop", function() { + let index = 0; + while(!myStack.isEmpty()) { + index++; + expect(myStack.pop()).toBe(sampleData[sampleData.length-index]); + } + }); + + it("Can be cleaned up", function() { + for (let index = 0; index < sampleData.length; index++) { + let element = sampleData[index]; + myStack.push(element); + } + expect(myStack.isEmpty()).toBe(false); + + myStack.clear(); + expect(myStack.isEmpty()).toBe(true); + }); + +}) + From f1f14a7779ccdd1b1298531b062d1198f62ec5c1 Mon Sep 17 00:00:00 2001 From: Bhaumik Mistry Date: Tue, 17 Oct 2017 21:34:58 -0400 Subject: [PATCH 245/355] Fixed fibonacci Fixed the fibonacci.py added the Test unittest_fibonacci.py --- math/fibonacci/python/fibonacci.py | 10 +++++----- math/fibonacci/python/unittest_fibonacci.py | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 math/fibonacci/python/unittest_fibonacci.py diff --git a/math/fibonacci/python/fibonacci.py b/math/fibonacci/python/fibonacci.py index 839a0121ae..2d40c9cf7e 100644 --- a/math/fibonacci/python/fibonacci.py +++ b/math/fibonacci/python/fibonacci.py @@ -1,11 +1,11 @@ def fibonacci(n): - fib = [1, 1] + fib = [0, 1] - for i in range(2, n): - fib.append(fib[i-1] + fib[i-2]) + for i in range(n+1): + fib.append(fib[-1] + fib[-2]) - return fib[-1] + return fib[n] -for i in range(1,10): +for i in range(0,10): print(fibonacci(i)) diff --git a/math/fibonacci/python/unittest_fibonacci.py b/math/fibonacci/python/unittest_fibonacci.py new file mode 100644 index 0000000000..952914bcf3 --- /dev/null +++ b/math/fibonacci/python/unittest_fibonacci.py @@ -0,0 +1,20 @@ +import unittest +import fibonacci + +class Test(unittest.TestCase): + + def test_simple(self): + self.assertEqual(fibonacci.fibonacci(0),0) + self.assertEqual(fibonacci.fibonacci(1),1) + self.assertEqual(fibonacci.fibonacci(2),1) + + def test(self): + self.assertEqual(fibonacci.fibonacci(5),5) + self.assertEqual(fibonacci.fibonacci(10),55) + self.assertEqual(fibonacci.fibonacci(20),6765) + self.assertEqual(fibonacci.fibonacci(30),832040) + self.assertEqual(fibonacci.fibonacci(40),102334155) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From aec1567f6f0ac7474426b3f1e1f9506e58b8f32e Mon Sep 17 00:00:00 2001 From: Bhaumik Mistry Date: Tue, 17 Oct 2017 21:48:35 -0400 Subject: [PATCH 246/355] test for russian peasant python Added file unittest_russian_peasant.py --- .../python/unittest_russian_peasant.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 math/russian_peasant/python/unittest_russian_peasant.py diff --git a/math/russian_peasant/python/unittest_russian_peasant.py b/math/russian_peasant/python/unittest_russian_peasant.py new file mode 100644 index 0000000000..2cb6b270be --- /dev/null +++ b/math/russian_peasant/python/unittest_russian_peasant.py @@ -0,0 +1,20 @@ +import unittest +from russian_peasant import russian_peasant as rp + +class Test(unittest.TestCase): + + def test_simple(self): + self.assertEqual(rp(0,0),0) + self.assertEqual(rp(1,1),1) + self.assertEqual(rp(2,1),2) + + + def test(self): + self.assertEqual(rp(100,100),10000) + self.assertEqual(rp(1234,345234),426018756) + self.assertEqual(rp(1582,76565),121125830) + self.assertEqual(rp(879,95246),83721234) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From 745cb5e4759a122f3c4f5d04bbe9e78dd2aeca8b Mon Sep 17 00:00:00 2001 From: Pritam Negi Date: Wed, 18 Oct 2017 09:20:47 +0530 Subject: [PATCH 247/355] Create INFIX_TO_POSTFIX.c --- data_structures/Stack/C/INFIX_TO_POSTFIX.c | 109 +++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 data_structures/Stack/C/INFIX_TO_POSTFIX.c diff --git a/data_structures/Stack/C/INFIX_TO_POSTFIX.c b/data_structures/Stack/C/INFIX_TO_POSTFIX.c new file mode 100644 index 0000000000..e06a5f99c3 --- /dev/null +++ b/data_structures/Stack/C/INFIX_TO_POSTFIX.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#define MAX 100 +char st[MAX]; +int top=-1; +void push(char st[], char); +char pop(char st[]); +void InfixtoPostfix(char source[], char target[]); +int getPriority(char); +int main() +{ + char infix[100], postfix[100]; + clrscr(); + printf("\n Enter any infix expression : "); + gets(infix); + strcpy(postfix, ""); + InfixtoPostfix(infix, postfix); + printf("\n The corresponding postfix expression is : "); + puts(postfix); + getch(); + return 0; +} +void InfixtoPostfix(char source[], char target[]) +{ + int i=0, j=0; + char temp; + strcpy(target, ""); + while(source[i]!='\0') + { + if(source[i]=='(') + { + push(st, source[i]); + i++; + } + else if(source[i]==')') + { + while((top!=-1) && (st[top]!='(')) + { + target[j]=pop(st); + j++; + } + if(top==-1) + { + printf("\n INCORRECT EXPRESSION"); + exit(1); + } + temp=pop(st); + i++; + } + else if(isdigit(source[i]) || isalpha(source[i])) + { + target[j]=source[i]; + j++; + i++; + } + else if(source[i]=='+' || source[i]=='-' || source[i]=='*' || source[i]=='/' || source[i]=='%') + { + while((top!=-1) && (st[top]!='(') && (getPriority(st[top]) > getPriority(source[i]))) + { + target[j]=pop(st); + j++; + } + push(st, source[i]); + i++; + } + else + { + printf("\n INCORRECT ELEMENT IN EXPRESSION"); + exit(1); + } + } + while((top!=-1) && (st[top]!='(')) + { + target[j]=pop(st); + j++; + } + target[j]='\0'; +} +int getPriority(char op) +{ + if(op=='/' || op=='*' || op=='%') + return 1; + else if(op=='+' || op=='-') + return 0; +} +void push(char st[], char val) +{ + if(top==MAX-1) + printf("\n STACK OVERFLOW"); + else + { + top++; + st[top]=val; + } +} +char pop(char st[]) +{ + char val=' '; + if(top==-1) + printf("\n STACK UNDERFLOW"); + else + { + val=st[top]; + top--; + } + return val; +} From cd31eb72fe82d1a7be56a2fc13ca1881cf069d5c Mon Sep 17 00:00:00 2001 From: Divyam Madaan Date: Wed, 18 Oct 2017 11:52:25 +0530 Subject: [PATCH 248/355] Add FCFS in C++ in process scheduling --- process_scheduling/fcfs/cpp/fcfs.cpp | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 process_scheduling/fcfs/cpp/fcfs.cpp diff --git a/process_scheduling/fcfs/cpp/fcfs.cpp b/process_scheduling/fcfs/cpp/fcfs.cpp new file mode 100644 index 0000000000..3e5243e3e0 --- /dev/null +++ b/process_scheduling/fcfs/cpp/fcfs.cpp @@ -0,0 +1,41 @@ +#include +#include +using namespace std; +int main() +{ + int n; + cout<<"Enter total number of processes\n"; cin>>n; + vector burstTime(n); // Array of burst times of processes + + cout<<"Enter burst times for processes.\n"; + for(int i = 0;i < n;i++) { + cout<<"P["<>burstTime[i]; + } + + vector waitingTime(n); // Array of waiting Times of processes + //calculating waiting time + for(int i = 1; i < n; i++) { + waitingTime[i] = 0; + for(int j = 0; j < i; j++) + waitingTime[i] += burstTime[j]; // WaitingTime[process] += burstTime[process] + } + + cout<<"\nProcess\t\tBurst Time\tWaiting Time\tTurnaround Time"; + vector turnAroundTime(n); // Turn Around time[process] = waitingTime[process] + burstTime[process] + //calculating turnaround time + int averageWaitingTime = 0, averageTurnAroundTime = 0; + + for(int i = 0; i < n; i++) { + turnAroundTime[i] = burstTime[i] + waitingTime[i]; + averageWaitingTime += waitingTime[i]; + averageTurnAroundTime += turnAroundTime[i]; + cout<<"\nP["< Date: Wed, 18 Oct 2017 15:15:32 +0530 Subject: [PATCH 249/355] Added BFS in java --- .../java/ajstriderBFS.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 graphsearch/breadth-first-search/java/ajstriderBFS.java diff --git a/graphsearch/breadth-first-search/java/ajstriderBFS.java b/graphsearch/breadth-first-search/java/ajstriderBFS.java new file mode 100644 index 0000000000..5e49ab6f17 --- /dev/null +++ b/graphsearch/breadth-first-search/java/ajstriderBFS.java @@ -0,0 +1,99 @@ + +import java.util.Scanner; +import java.util.HashSet; +import java.util.ArrayDeque; + +public class Solution { + private static final int EDGE_WEIGHT = 6; + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + int numQueries = scan.nextInt(); + + for (int q = 0; q < numQueries; q++) { + int numNodes = scan.nextInt(); + int numEdges = scan.nextInt(); + + /* Create Nodes */ + Node [] node = new Node[numNodes + 1]; // node "i" will be at index "i" + node[0] = null; + for (int i = 1; i <= numNodes; i++) { + node[i] = new Node(i); + } + + /* Connect Nodes */ + for (int i = 0; i < numEdges; i++) { + int n1 = scan.nextInt(); + int n2 = scan.nextInt(); + node[n1].addNeighbor(node[n2]); + } + + /* Create MST */ + int start = scan.nextInt(); + findDistances(node[start]); + + /* Print results */ + for (int i = 1; i <= numNodes; i++) { + if (i != start) { + System.out.print(node[i].distance + " "); + } + } + System.out.println(); + } + scan.close(); + } + + /* Uses BFS to find minimum distance of each Node from "start". + Can use BFS instead of Dijkstra's Algorithm since edges are equally weighted. */ + private static void findDistances(Node start) { + if (start == null) { + return; + } + ArrayDeque deque = new ArrayDeque<>(); // use deque as a queue + start.distance = 0; + deque.add(start); + while (!deque.isEmpty()) { + Node curr = deque.remove(); + for (Node neighbor : curr.neighbors) { + if (neighbor.distance == -1) { // meaning it's unvisited + neighbor.distance = curr.distance + EDGE_WEIGHT; + deque.add(neighbor); + } + } + } + } + + /* Implementation of an UNDIRECTED graph */ + public static class Node { + public final int id; // each Node will have a unique ID + public int distance; // Also tells us if Node has been visited (-1 means unvisited) + public HashSet neighbors; + + public Node (int id) { + this.id = id; + distance = -1; + neighbors = new HashSet<>(); + } + + public void addNeighbor(Node neighbor) { + neighbors.add(neighbor); + neighbor.neighbors.add(this); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } else if (other == null || !(other instanceof Node)) { + return false; + } + Node otherNode = (Node) other; + return this.id == otherNode.id; + } + + @Override + public int hashCode() { + return id; // simple and effective + } + } +} From 629f84a62e8c6302639b4e001bf6d28449d39f49 Mon Sep 17 00:00:00 2001 From: ajstrider Date: Wed, 18 Oct 2017 15:29:29 +0530 Subject: [PATCH 250/355] Added quicksort Inplace in Java --- sort/quick_sort/java/quicksort_inplace.java | 58 +++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sort/quick_sort/java/quicksort_inplace.java diff --git a/sort/quick_sort/java/quicksort_inplace.java b/sort/quick_sort/java/quicksort_inplace.java new file mode 100644 index 0000000000..e5c1052ee5 --- /dev/null +++ b/sort/quick_sort/java/quicksort_inplace.java @@ -0,0 +1,58 @@ + +import java.util.Scanner; + +public class Solution { + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + int s = scan.nextInt(); + int[] array = new int[s]; + for (int i = 0; i < s; i++) { + array[i] = scan.nextInt(); + } + scan.close(); + quickSort(array); + } + + public static void quickSort(int [] array) { + if (array != null) { + quickSort(array, 0, array.length - 1); + } + } + + private static void quickSort(int [] array, int start, int end) { + if (start < end) { + int pivotIndex = partition(array, start, end); + printArray(array, 0, array.length - 1); + quickSort(array, start, pivotIndex - 1); + quickSort(array, pivotIndex + 1, end); + } + } + + /* Must use "Lomuto Partition" scheme (which isn't very efficient) from Wikipedia: + https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme */ + private static int partition(int[] A, int lo, int hi) { + int pivot = A[hi]; + int i = lo - 1; + for (int j = lo; j <= hi - 1; j++) { + if (A[j] <= pivot) { + i++; + swap(A, i , j); + } + } + swap(A, i + 1, hi); + return i + 1; + } + + private static void swap(int [] array, int i, int j) { + int temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + private static void printArray(int[] array, int start, int end) { + for (int i = start; i <= end; i++) { + System.out.print(array[i] + " "); + } + System.out.println(); + } +} From 957d18159000e3778bbceecd2fe4660957f9e8c0 Mon Sep 17 00:00:00 2001 From: deepakgouda Date: Wed, 18 Oct 2017 15:45:52 +0530 Subject: [PATCH 251/355] Added README.md file for Multiply.java --- math/Arithmetic on Very Large Numbers/Java/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 math/Arithmetic on Very Large Numbers/Java/README.md diff --git a/math/Arithmetic on Very Large Numbers/Java/README.md b/math/Arithmetic on Very Large Numbers/Java/README.md new file mode 100644 index 0000000000..09a3fa282e --- /dev/null +++ b/math/Arithmetic on Very Large Numbers/Java/README.md @@ -0,0 +1,9 @@ +Multiply.java + +Used to multiply to large numbers using the Karatsuba's Divide and Conquer Algorithm. + +1. Install JDK. +2. Use "javac Multiply.java" to compile the .java file. +3. Multiply.class will be generated. +4. Use "java Multiply" to run the code. +5. Enter the two numbers to multiply. \ No newline at end of file From 7d8d39d16004ef11f6970cd24bfbdcd2f1b560fc Mon Sep 17 00:00:00 2001 From: ajstrider Date: Wed, 18 Oct 2017 16:03:56 +0530 Subject: [PATCH 252/355] Added Finding a Median using 2 heaps --- data_structures/heap/Java/running_median.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 data_structures/heap/Java/running_median.java diff --git a/data_structures/heap/Java/running_median.java b/data_structures/heap/Java/running_median.java new file mode 100644 index 0000000000..a36810639e --- /dev/null +++ b/data_structures/heap/Java/running_median.java @@ -0,0 +1,63 @@ + +import java.util.Scanner; +import java.util.PriorityQueue; +import java.util.Collections; + +// - We use 2 Heaps to keep track of median +// - We make sure that 1 of the following conditions is always true: +// 1) maxHeap.size() == minHeap.size() +// 2) maxHeap.size() - 1 = minHeap.size() + +public class Solution { + private static PriorityQueue maxHeap = new PriorityQueue<>(Collections.reverseOrder()); // keeps track of the SMALL numbers + private static PriorityQueue minHeap = new PriorityQueue<>(); // keeps track of the LARGE numbers + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + int n = scan.nextInt(); + int [] array = new int[n]; + for (int i = 0; i < n; i++) { + array[i] = scan.nextInt(); + } + scan.close(); + medianTracker(array); + } + + public static void medianTracker(int [] array) { + for (int i = 0; i < array.length; i++) { + addNumber(array[i]); + System.out.println(getMedian()); + } + } + + private static void addNumber(int n) { + if (maxHeap.isEmpty()) { + maxHeap.add(n); + } else if (maxHeap.size() == minHeap.size()) { + if (n < minHeap.peek()) { + maxHeap.add(n); + } else { + minHeap.add(n); + maxHeap.add(minHeap.remove()); + } + } else if (maxHeap.size() > minHeap.size()) { + if (n > maxHeap.peek()) { + minHeap.add(n); + } else { + maxHeap.add(n); + minHeap.add(maxHeap.remove()); + } + } + // maxHeap will never have fewer elements than minHeap + } + + private static double getMedian() { + if (maxHeap.isEmpty()) { + return 0; + } else if (maxHeap.size() == minHeap.size()) { + return (maxHeap.peek() + minHeap.peek()) / 2.0; + } else { // maxHeap must have more elements than minHeap + return maxHeap.peek(); + } + } +} From 1b0ac44978976c796fff37a59a09e1fc6164792b Mon Sep 17 00:00:00 2001 From: Norbert Varga Date: Wed, 18 Oct 2017 12:38:43 +0200 Subject: [PATCH 253/355] Add a few more coding practice sites --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4eb23d07bb..69763be488 100644 --- a/README.md +++ b/README.md @@ -165,3 +165,5 @@ Clean example implementations of data structures and algorithms written in diffe * [Codeforces](http://codeforces.com/) * [Project Euler](https://projecteuler.net/) * [LeetCode](https://leetcode.com/) + * [CodingGame](https://www.codingame.com/) + * [CodeWars](https://codewars.com/) From f53a92d04f8e898ba088bd251148a8aa99a052d0 Mon Sep 17 00:00:00 2001 From: ajstrider Date: Wed, 18 Oct 2017 16:11:39 +0530 Subject: [PATCH 254/355] Added Binary Insertion Sort in C --- sort/Binary Insertion Sort.cpp | 65 ++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 sort/Binary Insertion Sort.cpp diff --git a/sort/Binary Insertion Sort.cpp b/sort/Binary Insertion Sort.cpp new file mode 100644 index 0000000000..dcdb24fbe9 --- /dev/null +++ b/sort/Binary Insertion Sort.cpp @@ -0,0 +1,65 @@ +#include +#include + + + +using namespace std ; + +//Variable indicating no of comparisons in BS +int binarysearch; +//Binary Search by dividing into 2 subparts findind data and return its location +int BS(int arr[],int data,int low,int high){ + int mid =(low +high)/2 ; + + if (low == high) { + + return high ; +} + if (data > arr[mid]){ + binarysearch++; + return BS(arr,data,mid+1,high); + + } + if (data = location ; j--) + arr[j + 1] = arr[j]; + arr[location]= temp ; + } +} + + +int main(){ + int n; + cin>>n; + + binarysearch =0 ; + + int *arr =new int[n]; + for(int i=0;i>arr[i]; + } + BIS(arr,n); + cout< Date: Wed, 18 Oct 2017 16:12:42 +0530 Subject: [PATCH 255/355] Added cpp implementation of KMP Algorithm --- .../cpp/knuth_morris_pratt.cpp | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 string_search/knuth_morris_pratt/cpp/knuth_morris_pratt.cpp diff --git a/string_search/knuth_morris_pratt/cpp/knuth_morris_pratt.cpp b/string_search/knuth_morris_pratt/cpp/knuth_morris_pratt.cpp new file mode 100644 index 0000000000..f41a929888 --- /dev/null +++ b/string_search/knuth_morris_pratt/cpp/knuth_morris_pratt.cpp @@ -0,0 +1,66 @@ +#include +using namespace std; + +int pi[100010],m,n; +string pat,text; + +void buildpi() +{ + pi[0]=0; + for(int i=1;i>pat>>text; + n=text.length(); + m=pat.length(); + buildpi(); + matchtext(); + return 0; +} From 138b1fbb29261e71a1848c6ccc3b361bfc91f732 Mon Sep 17 00:00:00 2001 From: lavina Date: Wed, 18 Oct 2017 16:33:05 +0530 Subject: [PATCH 256/355] Added problem statement for Knuth Morris Pratt problem --- .../knuth_morris_pratt/cpp/README.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 string_search/knuth_morris_pratt/cpp/README.md diff --git a/string_search/knuth_morris_pratt/cpp/README.md b/string_search/knuth_morris_pratt/cpp/README.md new file mode 100644 index 0000000000..816bcb4231 --- /dev/null +++ b/string_search/knuth_morris_pratt/cpp/README.md @@ -0,0 +1,38 @@ +# Knuth Morris Pratt + +## Problem Statement + +Given two strings s and t (|s|<=|t|), find the starting index of all the occurences of s in t. + +## Constraints + +``` +1 <= |s| <= |t| <= 100000 +``` + +## Input: + +First line of the input contains the string s. +Second line of the input contains the string t. + +## Output: + +In new lines, output the starting index of occurences of s in t. +Assume 0-based indexing. + +## Example + +### Input: + +``` +xt +txtxtxtx +``` + +### Output: + +``` +1 +3 +5 +``` From 1deabbce3104f46776045943a3a7dbb175528d97 Mon Sep 17 00:00:00 2001 From: agnipanda Date: Wed, 18 Oct 2017 17:07:56 +0530 Subject: [PATCH 257/355] added merge sort with user input using python --- sort/merge_sort/python/merge_sort2.py | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 sort/merge_sort/python/merge_sort2.py diff --git a/sort/merge_sort/python/merge_sort2.py b/sort/merge_sort/python/merge_sort2.py new file mode 100644 index 0000000000..79b57f7c60 --- /dev/null +++ b/sort/merge_sort/python/merge_sort2.py @@ -0,0 +1,38 @@ +print("Enter the list of numbers to be sorted:") +s=input() +if(s[-1]==" "): + s=s[0:len(s)-1:1] +s=list(map(int,s.split(" "))) + +#MERGE SORT +def merge(a,b,c): + k=0 + i=0 + j=0 + while(len(a)>i and len(b)>j): + if(a[i]>=b[j]): + c[k]=b[j] + j+=1 + else: + c[k]=a[i] + i+=1 + k+=1 + while(len(a)>i): + c[k]=a[i] + k+=1 + i+=1 + while(len(b)>j): + c[k]=b[j] + k+=1 + j+=1 +def mergesort(l): + if(len(l)<2): + return + mid=len(l)//2 + L=l[0:mid:1] + R=l[mid:len(l):1] + mergesort(L) + mergesort(R) + merge(L,R,l) +mergesort(s) +print(" ".join(list(map(str,s)))) \ No newline at end of file From 65f07f14eb6a33d852d0f868e2494ce314b3fd81 Mon Sep 17 00:00:00 2001 From: agnipanda Date: Wed, 18 Oct 2017 17:19:40 +0530 Subject: [PATCH 258/355] addded singlylinkedlist with insert,delete,reverse,display features --- .../linked_list/C++/SinglyLinkedLIst2.cpp | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 data_structures/linked_list/C++/SinglyLinkedLIst2.cpp diff --git a/data_structures/linked_list/C++/SinglyLinkedLIst2.cpp b/data_structures/linked_list/C++/SinglyLinkedLIst2.cpp new file mode 100755 index 0000000000..1086d2c7e1 --- /dev/null +++ b/data_structures/linked_list/C++/SinglyLinkedLIst2.cpp @@ -0,0 +1,108 @@ +#include "iostream" +#include "cstdlib" +using namespace std; +struct Node +{ + int data; + Node* link; +}; +Node* A; +void insert() +{ + int n,p; + cout<<"Enter the no to be Inserted:"; + cin>>n; + cout<<"Enter the position:"; + cin>>p; + Node* temp=new Node; + if (p==1) + { + temp->link=A; + temp->data=n; + A=temp; + return; + } + Node* temp2=A; + for(int i=1;ilink; + } + temp->link=temp2->link; + temp2->link=temp; + temp->data=n; +} +void delet() +{ + int p; + cout<<"Enter the position of the element to be deleted:"; + cin>>p; + Node* temp=A; + if (p==1) + { + A=temp->link; + temp=NULL; + return; + } + Node* temp2=new Node; + for(int i=1;ilink; + } + temp2=temp->link; + temp->link=temp2->link; + temp2=NULL; + +} +void display() +{ + Node* temp=A; + while(temp!=NULL) + { + cout<<"->"<data; + temp=temp->link; + } + cout<<"\n"<<"---------------------------"<<"\n"; +} +void rev() +{ + Node* temp=A; + Node* temp2=new Node; + Node* prev=temp->link; + while(prev!=NULL) + { + temp2=prev->link; + prev->link=temp; + temp=prev; + prev=temp2; + } + A->link=NULL; + A=temp; +} +int main() +{ + A=NULL; + while(1) + { + int ch; + cout<<"Enter your choice:\n1-Insert\n2-Delete\n3-Display\n4-Reverse\n5-Exit\n->"; + cin>>ch; + switch(ch) + { + case 1: + insert(); + break; + case 2: + delet(); + break; + case 3: + display(); + break; + case 4: + rev(); + break; + case 5: + exit(0); + } + } +} + From dba1ee0adafcde081417a28bef17774df001f714 Mon Sep 17 00:00:00 2001 From: agnipanda Date: Wed, 18 Oct 2017 17:26:34 +0530 Subject: [PATCH 259/355] addded doublylinkedlist with insert,delete,reverse,display features --- .../linked_list/C++/Doubly Linked LIst2.cpp | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100755 data_structures/linked_list/C++/Doubly Linked LIst2.cpp diff --git a/data_structures/linked_list/C++/Doubly Linked LIst2.cpp b/data_structures/linked_list/C++/Doubly Linked LIst2.cpp new file mode 100755 index 0000000000..15dfa2acb8 --- /dev/null +++ b/data_structures/linked_list/C++/Doubly Linked LIst2.cpp @@ -0,0 +1,125 @@ +#include "iostream.h" +using namespace std; +struct Node +{ + int data; + Node* prevs; + Node* link; +}; +Node* A; +void insert() +{ + int n,p; + Node* temp=new Node; + cout<<"Enter the number to be inserted:"; + cin>>n; + cout<<"Enter the position:"; + cin>>p; + if(p==1) + { + temp->prevs=NULL; + temp->data=n; + temp->link=A; + A=temp; + return; + } + Node* temp2=new Node; + temp=A; + for (int i=1;ilink; + } + temp2->data=n; + temp2->link=temp->link; + temp2->prevs=temp; + temp->link=temp2; + temp=temp2->link; + if (temp!=NULL) + { + temp->prevs=temp2; + } +} +void delet() +{ + int p; + cout<<"Enter the position to be deleted:"; + cin>>p; + Node* temp=A; + if(p==1) + { + A=temp->link; + temp=NULL; + A->prevs=NULL; + return; + } + for(int i=1;i<=p-1;i++) + { + temp=temp->link; + } + Node* temp2=new Node; + temp2=temp->prevs; + temp2->link=temp->link; + temp=NULL; + if(temp2->link==NULL) + { + return; + } + temp=temp2->link; + temp->prevs=temp2; +} +void display() +{ + Node* temp=new Node; + temp=A; + while(temp!=NULL) + { + cout<<"->"<data; + temp=temp->link; + } + cout<<"\n"; +} +void rev() +{ + Node* temp=A; + Node* pt=new Node; + while(temp!=NULL) + { + if(temp->link==NULL) + { + A=temp; + } + pt=temp->link; + temp->link=temp->prevs; + temp->prevs=pt; + temp=temp->prevs; + } + +} +void main() +{ + A=NULL; + while(1) + { + int ch; + cout<<"Enter your choice:\n1-Insert\n2-Delete\n3-Display\n4-Reverse\n5-Exit\n->"; + cin>>ch; + switch(ch) + { + case 1: + insert(); + break; + case 2: + delet(); + break; + case 3: + display(); + break; + case 4: + rev(); + break; + case 5: + exit(0); + } + } +} + From 017ccf4cd9d52b35f969211406e7fc2e480d680e Mon Sep 17 00:00:00 2001 From: Manik Tharaka Date: Wed, 18 Oct 2017 18:22:53 +0530 Subject: [PATCH 260/355] implementation of vernam cipher in scala --- .../vernam_cipher/scala/vernam_cipher.scala | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 cryptography/vernam_cipher/scala/vernam_cipher.scala diff --git a/cryptography/vernam_cipher/scala/vernam_cipher.scala b/cryptography/vernam_cipher/scala/vernam_cipher.scala new file mode 100644 index 0000000000..010dfa838e --- /dev/null +++ b/cryptography/vernam_cipher/scala/vernam_cipher.scala @@ -0,0 +1,45 @@ + +val alphabet = Array("a","b","c","d","e","f","g","h","i","j","k","l","m", + "n","o","p","q","r","s","t","u","v","w","x","y","z", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z") + +def encrypt(plain_text:String):String={ + //The lenght of the key should be greater than or equal to plain_text + val key = "welltrytodosopasjkfdssfllo" + + //Inner recursive function to encrypt + def encrypt_in(ptext:String,ki:Int):String={ + + if(ptext.isEmpty) "" else + alphabet(alphabet.indexOf(ptext.head.toString) + alphabet.indexOf(key(ki).toString)) + encrypt_in(ptext.tail,ki+1) + } + + encrypt_in(plain_text,0) + +} + + +def decrypt(plain_text:String):String={ + + //The lenght of the key should be greater than or equal to plain_text + val key = "welltrytodosopasjkfdssfllo" + + //Inner recursive function to decrypt + def decrypt_in(ptext:String,ki:Int):String={ + + if(ptext.isEmpty) "" else + alphabet(alphabet.indexOf(ptext.head.toString) - alphabet.indexOf(key(ki).toString)) + decrypt_in(ptext.tail,ki+1) + } + + decrypt_in(plain_text,0) + +} + + +def test(){ + val text = "youcantbreakme" + + assert(decrypt(encrypt(text)) == text) + +} \ No newline at end of file From 810333a806636a3971e007008d410126ba1e4d04 Mon Sep 17 00:00:00 2001 From: shazly333 Date: Wed, 18 Oct 2017 17:33:17 +0200 Subject: [PATCH 261/355] Dijkstra in Java --- graphsearch/dijkstra/Java/Dijkstra.java | 73 +++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 graphsearch/dijkstra/Java/Dijkstra.java diff --git a/graphsearch/dijkstra/Java/Dijkstra.java b/graphsearch/dijkstra/Java/Dijkstra.java new file mode 100644 index 0000000000..cc5e1f13eb --- /dev/null +++ b/graphsearch/dijkstra/Java/Dijkstra.java @@ -0,0 +1,73 @@ +import java.util.*; + +public class Dijkstra { + + // assumes Nodes are numbered 0, 1, ... n and that the source Node is 0 + ArrayList findShortestPath(Node[] nodes, Edge[] edges, Node target) { + int[][] Weight = initializeWeight(nodes, edges); + int[] D = new int[nodes.length]; + Node[] P = new Node[nodes.length]; + ArrayList C = new ArrayList(); + + // initialize: + // (C)andidate set, + // (D)yjkstra special path length, and + // (P)revious Node along shortest path + for(int i=0; ithat Node + for(int j=0; j Date: Wed, 18 Oct 2017 22:35:38 +0530 Subject: [PATCH 262/355] Added Permuted Index in C++ --- .vs/ProjectSettings.json | 3 + .vs/VSWorkspaceState.json | 15 +++ .vs/al-go-rithms/v15/.suo | Bin 0 -> 14336 bytes .vs/al-go-rithms/v15/Browse.VC.db | Bin 0 -> 671744 bytes .vs/slnx.sqlite | Bin 0 -> 241664 bytes PermutedIndex/Header.h | 48 ++++++++ PermutedIndex/PermutedIndex1.cpp | 179 ++++++++++++++++++++++++++++++ PermutedIndex/PermutedIndex2.cpp | 96 ++++++++++++++++ 8 files changed, 341 insertions(+) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/al-go-rithms/v15/.suo create mode 100644 .vs/al-go-rithms/v15/Browse.VC.db create mode 100644 .vs/slnx.sqlite create mode 100644 PermutedIndex/Header.h create mode 100644 PermutedIndex/PermutedIndex1.cpp create mode 100644 PermutedIndex/PermutedIndex2.cpp diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000000..f8b4888565 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000000..a4cc5719ef --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,15 @@ +{ + "ExpandedNodes": [ + "", + "\\cryptography", + "\\cryptography\\chinese_cipher", + "\\cryptography\\chinese_cipher\\perl", + "\\data_structures", + "\\data_structures\\binarySearch_tree", + "\\data_structures\\binarySearch_tree\\C++", + "\\data_structures\\Graphs", + "\\data_structures\\Graphs\\Java" + ], + "SelectedNode": "\\data_structures\\Graphs\\Java\\karger.java", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/al-go-rithms/v15/.suo b/.vs/al-go-rithms/v15/.suo new file mode 100644 index 0000000000000000000000000000000000000000..082bbc957af1c2eca527e4341ccb038e7ef7107d GIT binary patch literal 14336 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

i=xs1r=8 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

4#NC<^HN5%Gh~SXRu#Ib%OGF+v(^N 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 Date: Sat, 14 Oct 2017 00:06:14 +0200 Subject: [PATCH 038/355] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7c8a0db5d5..406794cf42 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ Clean examples implementations of data structures and algorithms written in diff * Please include description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps to people that are learning new algorithm. * Graphical example would be verry helpful too. * Don't forget to include tests. - + * Don't remove previous implementation of algorithms. Just add new file with your own implementation. ## Resources From 56a1a6189e946e67043e351a56a77cbbf225a3a8 Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 03:57:08 +0530 Subject: [PATCH 039/355] Added eulers totient function --- .../C/eulers_totient_func.c | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 math/eulers_totient_function/C/eulers_totient_func.c diff --git a/math/eulers_totient_function/C/eulers_totient_func.c b/math/eulers_totient_function/C/eulers_totient_func.c new file mode 100644 index 0000000000..c10dcd956c --- /dev/null +++ b/math/eulers_totient_function/C/eulers_totient_func.c @@ -0,0 +1,29 @@ +// A simple C program to calculate Euler's Totient Function +#include + +// Function to return gcd of a and b +int gcd(int a, int b) +{ + if (a == 0) + return b; + return gcd(b%a, a); +} + +// A simple method to evaluate Euler Totient Function +int phi(unsigned int n) +{ + unsigned int result = 1; + for (int i=2; i < n; i++) + if (gcd(i, n) == 1) + result++; + return result; +} + +// Driver program to test above function +int main() +{ + int n; + for (n=1; n<=10; n++) + printf("phi(%d) = %d\n", n, phi(n)); + return 0; +} From c13464027bfcf3b5dfee5a89e3156ce47e9fdd3f Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 04:13:02 +0530 Subject: [PATCH 040/355] Added readme --- math/eulers_totient_function/C/readme.md | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 math/eulers_totient_function/C/readme.md diff --git a/math/eulers_totient_function/C/readme.md b/math/eulers_totient_function/C/readme.md new file mode 100644 index 0000000000..6319b2c7fa --- /dev/null +++ b/math/eulers_totient_function/C/readme.md @@ -0,0 +1,30 @@ +###Euler's Totient Function + +Euler’s Totient function Φ(n) for an input n is count of numbers in {1, 2, 3, …, n} that are relatively prime to n, i.e., the numbers whose GCD (Greatest Common Divisor) with n is 1. + +''' +Φ(1) = 1 +gcd(1, 1) is 1 + +Φ(2) = 1 +gcd(1, 2) is 1, but gcd(2, 2) is 2. + +Φ(3) = 2 +gcd(1, 3) is 1 and gcd(2, 3) is 1 + +Φ(4) = 2 +gcd(1, 4) is 1 and gcd(3, 4) is 1 + +Φ(5) = 4 +gcd(1, 5) is 1, gcd(2, 5) is 1, +gcd(3, 5) is 1 and gcd(4, 5) is 1 + +Φ(6) = 2 +gcd(1, 6) is 1 and gcd(5, 6) is 1 +''' + +#How to compute Φ(n) for an input n? + +A simple solution is to iterate through all numbers from 1 to n-1 and count numbers with gcd with n as 1. + + From 06d0b2e705c91aac46c9b6bb1ee50d2d759853e9 Mon Sep 17 00:00:00 2001 From: mattgd Date: Fri, 13 Oct 2017 18:46:49 -0400 Subject: [PATCH 041/355] Implement Fibonacci in JavaScript. --- math/fibonacci/JavaScript/fibonacci.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 math/fibonacci/JavaScript/fibonacci.js diff --git a/math/fibonacci/JavaScript/fibonacci.js b/math/fibonacci/JavaScript/fibonacci.js new file mode 100644 index 0000000000..40b9b24066 --- /dev/null +++ b/math/fibonacci/JavaScript/fibonacci.js @@ -0,0 +1,13 @@ +function fibonacci(n) { + var fib = [1, 1]; + + for (i = 2; i < n; i++) { + fib.push(fib[i - 1] + fib[i - 2]); + } + + return fib; +} + +for (i = 1; i < 10; i++) { + console.log(fibonacci(i)); +} \ No newline at end of file From c74972b9d39977d8976428da0f7278f40d9c646a Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 04:17:29 +0530 Subject: [PATCH 042/355] Revised the readme --- math/eulers_totient_function/C/{readme.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename math/eulers_totient_function/C/{readme.md => README.md} (100%) diff --git a/math/eulers_totient_function/C/readme.md b/math/eulers_totient_function/C/README.md similarity index 100% rename from math/eulers_totient_function/C/readme.md rename to math/eulers_totient_function/C/README.md From 8aff26754691112cbe3b730f829e50597da972b4 Mon Sep 17 00:00:00 2001 From: mattgd Date: Fri, 13 Oct 2017 18:50:04 -0400 Subject: [PATCH 043/355] Add explanation of Fibonacci for JavaScript. --- math/fibonacci/JavaScript/fibonacci.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/math/fibonacci/JavaScript/fibonacci.js b/math/fibonacci/JavaScript/fibonacci.js index 40b9b24066..98fd2a560e 100644 --- a/math/fibonacci/JavaScript/fibonacci.js +++ b/math/fibonacci/JavaScript/fibonacci.js @@ -1,6 +1,13 @@ +/** + * Finds the series of n numbers in which each + * number is the sum of the two preceding numbers. + * @param {integer} n The number of iterations of Fibonacci + */ function fibonacci(n) { + // Define base case var fib = [1, 1]; - + + // Iterate through using the sum of the last two values for (i = 2; i < n; i++) { fib.push(fib[i - 1] + fib[i - 2]); } From 5cdf10d0401081c50610fb6c8fcf8079bb96ff45 Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 04:22:15 +0530 Subject: [PATCH 044/355] Revised the readme --- math/eulers_totient_function/C/readme.md | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 math/eulers_totient_function/C/readme.md diff --git a/math/eulers_totient_function/C/readme.md b/math/eulers_totient_function/C/readme.md new file mode 100644 index 0000000000..0cbe344cb1 --- /dev/null +++ b/math/eulers_totient_function/C/readme.md @@ -0,0 +1,31 @@ +###Euler's Totient Function + +Euler’s Totient function Φ(n) for an input n is count of numbers in {1, 2, 3, …, n} that are relatively prime to n, i.e., the numbers whose GCD (Greatest Common Divisor) with n is 1. + +``` +Φ(1) = 1 +gcd(1, 1) is 1 + +Φ(2) = 1 +gcd(1, 2) is 1, but gcd(2, 2) is 2. + +Φ(3) = 2 +gcd(1, 3) is 1 and gcd(2, 3) is 1 + +Φ(4) = 2 +gcd(1, 4) is 1 and gcd(3, 4) is 1 + +Φ(5) = 4 +gcd(1, 5) is 1, gcd(2, 5) is 1, +gcd(3, 5) is 1 and gcd(4, 5) is 1 + +Φ(6) = 2 +gcd(1, 6) is 1 and gcd(5, 6) is 1 + +``` + +#How to compute Φ(n) for an input n? + +A simple solution is to iterate through all numbers from 1 to n-1 and count numbers with gcd with n as 1. + + From 1f04d8e033485b23820cd3c8191f0f5faae1a0bd Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 04:23:28 +0530 Subject: [PATCH 045/355] Revised the readme --- math/eulers_totient_function/C/README.md | 30 ------------------------ 1 file changed, 30 deletions(-) delete mode 100644 math/eulers_totient_function/C/README.md diff --git a/math/eulers_totient_function/C/README.md b/math/eulers_totient_function/C/README.md deleted file mode 100644 index 6319b2c7fa..0000000000 --- a/math/eulers_totient_function/C/README.md +++ /dev/null @@ -1,30 +0,0 @@ -###Euler's Totient Function - -Euler’s Totient function Φ(n) for an input n is count of numbers in {1, 2, 3, …, n} that are relatively prime to n, i.e., the numbers whose GCD (Greatest Common Divisor) with n is 1. - -''' -Φ(1) = 1 -gcd(1, 1) is 1 - -Φ(2) = 1 -gcd(1, 2) is 1, but gcd(2, 2) is 2. - -Φ(3) = 2 -gcd(1, 3) is 1 and gcd(2, 3) is 1 - -Φ(4) = 2 -gcd(1, 4) is 1 and gcd(3, 4) is 1 - -Φ(5) = 4 -gcd(1, 5) is 1, gcd(2, 5) is 1, -gcd(3, 5) is 1 and gcd(4, 5) is 1 - -Φ(6) = 2 -gcd(1, 6) is 1 and gcd(5, 6) is 1 -''' - -#How to compute Φ(n) for an input n? - -A simple solution is to iterate through all numbers from 1 to n-1 and count numbers with gcd with n as 1. - - From 88711d6e7dbe078afd3eff69a8c345f1c4fbd2e2 Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 04:24:47 +0530 Subject: [PATCH 046/355] Revised the readme --- math/eulers_totient_function/C/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/math/eulers_totient_function/C/readme.md b/math/eulers_totient_function/C/readme.md index 0cbe344cb1..86cdeb1a15 100644 --- a/math/eulers_totient_function/C/readme.md +++ b/math/eulers_totient_function/C/readme.md @@ -1,4 +1,4 @@ -###Euler's Totient Function +### Euler's Totient Function Euler’s Totient function Φ(n) for an input n is count of numbers in {1, 2, 3, …, n} that are relatively prime to n, i.e., the numbers whose GCD (Greatest Common Divisor) with n is 1. @@ -24,7 +24,7 @@ gcd(1, 6) is 1 and gcd(5, 6) is 1 ``` -#How to compute Φ(n) for an input n? +# How to compute Φ(n) for an input n? A simple solution is to iterate through all numbers from 1 to n-1 and count numbers with gcd with n as 1. From 18d8f5e0f241c63b99c1ba9394c5f3fc051c43ee Mon Sep 17 00:00:00 2001 From: npochhi Date: Sat, 14 Oct 2017 04:25:23 +0530 Subject: [PATCH 047/355] Revised the readme --- math/eulers_totient_function/C/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/math/eulers_totient_function/C/readme.md b/math/eulers_totient_function/C/readme.md index 86cdeb1a15..f492800fbc 100644 --- a/math/eulers_totient_function/C/readme.md +++ b/math/eulers_totient_function/C/readme.md @@ -1,4 +1,4 @@ -### Euler's Totient Function +# Euler's Totient Function Euler’s Totient function Φ(n) for an input n is count of numbers in {1, 2, 3, …, n} that are relatively prime to n, i.e., the numbers whose GCD (Greatest Common Divisor) with n is 1. @@ -24,7 +24,7 @@ gcd(1, 6) is 1 and gcd(5, 6) is 1 ``` -# How to compute Φ(n) for an input n? +### How to compute Φ(n) for an input n? A simple solution is to iterate through all numbers from 1 to n-1 and count numbers with gcd with n as 1. From 270d0cc728d23787dc923da0815389969e99d233 Mon Sep 17 00:00:00 2001 From: goksgie Date: Sat, 14 Oct 2017 02:36:43 +0300 Subject: [PATCH 048/355] nqueens problem is added in C++ --- backtracking/n-queens/C++/nqueens.cpp | 89 +++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 backtracking/n-queens/C++/nqueens.cpp diff --git a/backtracking/n-queens/C++/nqueens.cpp b/backtracking/n-queens/C++/nqueens.cpp new file mode 100644 index 0000000000..27a52ab3b0 --- /dev/null +++ b/backtracking/n-queens/C++/nqueens.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#define BOARD_SIZE 9 + +// rows[i] shows either -1 if empty or colum number of placed queen +int rows[BOARD_SIZE]; +// cols[i] shows either -1 if ith colum has no queens or 1 if there is a queen +int cols[BOARD_SIZE]; + +// check positions by order of increasing colum +bool check_forwards(int row, int col){ + int tmp_row = row; int tmp_col = col; + while((row < BOARD_SIZE) && (col < BOARD_SIZE)){ + if(rows[row] == col) + return true; + row++; + col++; + } + while((tmp_row >= 0) && (tmp_col < BOARD_SIZE)){ + if(rows[tmp_row] == tmp_col) + return true; + tmp_col++; + tmp_row--; + } + return false; +} +// check positions by order of decreasing colum +bool check_backwards(int row, int col){ + int tmp_row = row; int tmp_col = col; + while((row >= 0) && (col >= 0)){ + if(rows[row] == col) + return true; + row--; + col--; + } + while((tmp_row < BOARD_SIZE) && (tmp_col >= 0)){ + if(rows[tmp_row] == tmp_col) + return true; + tmp_col--; + tmp_row++; + } + return false; +} + +bool attacked(int row, int col){ + // check backwards + if(cols[col] != -1) return true; + if(rows[row] != -1) return true; + //std::cout< Date: Sat, 14 Oct 2017 07:48:37 +0530 Subject: [PATCH 049/355] Added math/towers_of_hanoi C++ implementation --- math/towers_of_hanoi/c++/test.cpp | 17 ++++++++++++++++ math/towers_of_hanoi/c++/towers_of_hanoi.hpp | 21 ++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 math/towers_of_hanoi/c++/test.cpp create mode 100644 math/towers_of_hanoi/c++/towers_of_hanoi.hpp diff --git a/math/towers_of_hanoi/c++/test.cpp b/math/towers_of_hanoi/c++/test.cpp new file mode 100644 index 0000000000..0a6e765c21 --- /dev/null +++ b/math/towers_of_hanoi/c++/test.cpp @@ -0,0 +1,17 @@ +#include + +#include "towers_of_hanoi.hpp" + +using std::cout; +using std::endl; + +int main() +{ + cout << "Towers of Hanoi with 3 disks" << endl; + print_moves(3); + + cout << "Towers of Hanoi with 4 disks" << endl; + print_moves(4, 1, 2, 3); + + return 0; +} \ No newline at end of file diff --git a/math/towers_of_hanoi/c++/towers_of_hanoi.hpp b/math/towers_of_hanoi/c++/towers_of_hanoi.hpp new file mode 100644 index 0000000000..b7281e6a91 --- /dev/null +++ b/math/towers_of_hanoi/c++/towers_of_hanoi.hpp @@ -0,0 +1,21 @@ +#ifndef _TOWERS_OF_HANOI_ +#define _TOWERS_OF_HANOI_ + +#include + +using std::cout; +using std::endl; + +void print_moves(int n, int src = 1, int dest = 2, int aux = 3) +{ + if (n < 1) + return ; + + print_moves(n - 1, src, aux, dest); + + cout << "Move: " << src << " -> " << dest << endl; + + print_moves(n - 1, aux, dest, src); +} + +#endif \ No newline at end of file From 7aef3ced593e3e0e364640ee83029276f775f79d Mon Sep 17 00:00:00 2001 From: nikhilhassija Date: Sat, 14 Oct 2017 08:11:58 +0530 Subject: [PATCH 050/355] Added math/euclids_gcd in C++ --- math/euclids_gcd/c++/euclids_gcd.hpp | 12 ++++++++++++ math/euclids_gcd/c++/tests.cpp | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 math/euclids_gcd/c++/euclids_gcd.hpp create mode 100644 math/euclids_gcd/c++/tests.cpp diff --git a/math/euclids_gcd/c++/euclids_gcd.hpp b/math/euclids_gcd/c++/euclids_gcd.hpp new file mode 100644 index 0000000000..3fa3c32e0b --- /dev/null +++ b/math/euclids_gcd/c++/euclids_gcd.hpp @@ -0,0 +1,12 @@ +#ifndef _EUCLIDS_GCD_ +#define _EUCLIDS_GCD_ + +int euclids_gcd(int a, int b) +{ + if (a == 0) + return b; + + return euclids_gcd(b % a, a); +} + +#endif \ No newline at end of file diff --git a/math/euclids_gcd/c++/tests.cpp b/math/euclids_gcd/c++/tests.cpp new file mode 100644 index 0000000000..d23682146b --- /dev/null +++ b/math/euclids_gcd/c++/tests.cpp @@ -0,0 +1,17 @@ +#include + +#include "euclids_gcd.hpp" + +using std::cout; +using std::endl; + +int main() +{ + cout << euclids_gcd(1, 10) << endl; + + cout << euclids_gcd(2, 4) << endl; + + cout << euclids_gcd(2, 9) << endl; + + cout << euclids_gcd(37, 91) << endl; +} \ No newline at end of file From 9a0348f2f702f616d12c89156ea5d12712778eb6 Mon Sep 17 00:00:00 2001 From: nikhilhassija Date: Sat, 14 Oct 2017 08:36:00 +0530 Subject: [PATCH 051/355] Added math/fast_exponentiation in Python3 --- .../python/fast_exponentiation.py | 14 ++++++++++++++ math/fast_exponentiation/python/test.py | 10 ++++++++++ 2 files changed, 24 insertions(+) create mode 100644 math/fast_exponentiation/python/fast_exponentiation.py create mode 100644 math/fast_exponentiation/python/test.py diff --git a/math/fast_exponentiation/python/fast_exponentiation.py b/math/fast_exponentiation/python/fast_exponentiation.py new file mode 100644 index 0000000000..823e934220 --- /dev/null +++ b/math/fast_exponentiation/python/fast_exponentiation.py @@ -0,0 +1,14 @@ +def fast_exp(base, power): + result = 1 + + current = base + + while power > 0: + if power % 2 == 1: + result = result * current + + current = current * current + + power = power // 2 + + return result \ No newline at end of file diff --git a/math/fast_exponentiation/python/test.py b/math/fast_exponentiation/python/test.py new file mode 100644 index 0000000000..36808fd45d --- /dev/null +++ b/math/fast_exponentiation/python/test.py @@ -0,0 +1,10 @@ +#!/usr/bin/python3 + +from fast_exponentiation import fast_exp + +if __name__ == "__main__": + print("2 ^ 4 = {}".format(fast_exp(2, 4))) + + print("10 ^ 100 = {}".format(fast_exp(10, 100))) + + print("123 ^ 123 = {}".format(fast_exp(123, 123))) \ No newline at end of file From 6d87badb68f2e20a3907f670b9190956ebd127e8 Mon Sep 17 00:00:00 2001 From: Pat McGee Date: Fri, 13 Oct 2017 20:24:58 -0700 Subject: [PATCH 052/355] Create AddBinaryNumbers.py --- math/AddBinaryNumbers/Python/AddBinaryNumbers.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 math/AddBinaryNumbers/Python/AddBinaryNumbers.py diff --git a/math/AddBinaryNumbers/Python/AddBinaryNumbers.py b/math/AddBinaryNumbers/Python/AddBinaryNumbers.py new file mode 100644 index 0000000000..326b680999 --- /dev/null +++ b/math/AddBinaryNumbers/Python/AddBinaryNumbers.py @@ -0,0 +1,9 @@ +number1 = input("Enter the first number: ") +number2 = input("Enter the second number: ") + +result = (int(number1, 2) + int(number2, 2)) + +result = bin(result) + +print(result[2:]) + From d794556571dd7416ef479d377ad0d910f25d99bb Mon Sep 17 00:00:00 2001 From: nikhilhassija Date: Sat, 14 Oct 2017 09:02:08 +0530 Subject: [PATCH 053/355] Added math/numerical_integration in Python3 --- .../python/numerical_integration.py | 15 +++++++++++++++ math/numerical_integration/python/test.py | 8 ++++++++ 2 files changed, 23 insertions(+) create mode 100644 math/numerical_integration/python/numerical_integration.py create mode 100644 math/numerical_integration/python/test.py diff --git a/math/numerical_integration/python/numerical_integration.py b/math/numerical_integration/python/numerical_integration.py new file mode 100644 index 0000000000..15dc1c1073 --- /dev/null +++ b/math/numerical_integration/python/numerical_integration.py @@ -0,0 +1,15 @@ +def integrate(func, lower_limit, upper_limit, step): + integral = 0 + + half_step = step / 2 + + cur_val = lower_limit + + while cur_val < upper_limit: + cur_val += half_step + + integral += func(cur_val) * step + + cur_val += half_step + + return integral \ No newline at end of file diff --git a/math/numerical_integration/python/test.py b/math/numerical_integration/python/test.py new file mode 100644 index 0000000000..a8c4a71dbf --- /dev/null +++ b/math/numerical_integration/python/test.py @@ -0,0 +1,8 @@ +from numerical_integration import integrate + +from math import sin, log, exp + +if __name__ == "__main__": + print (integrate(sin, 0, 1, 0.001)) + print (integrate(log, 1, 2 ,0.001)) + print (integrate(exp, -1, 1, 0.001)) \ No newline at end of file From 5b65edcdcaed94b10c31cbc70fec03d3d598a984 Mon Sep 17 00:00:00 2001 From: Abe Ramseyer Date: Fri, 13 Oct 2017 23:36:14 -0500 Subject: [PATCH 054/355] created 2 hash table implementations and description --- data_structures/hash_table/Hash Tables.md | 34 ++++ .../hash_table/java/DoubleHashTable.java | 164 ++++++++++++++++++ .../hash_table/java/HashTableTests.java | 46 +++++ .../hash_table/java/QuadraticHashTable.java | 157 +++++++++++++++++ 4 files changed, 401 insertions(+) create mode 100644 data_structures/hash_table/Hash Tables.md create mode 100644 data_structures/hash_table/java/DoubleHashTable.java create mode 100644 data_structures/hash_table/java/HashTableTests.java create mode 100644 data_structures/hash_table/java/QuadraticHashTable.java diff --git a/data_structures/hash_table/Hash Tables.md b/data_structures/hash_table/Hash Tables.md new file mode 100644 index 0000000000..5dc60fb923 --- /dev/null +++ b/data_structures/hash_table/Hash Tables.md @@ -0,0 +1,34 @@ +# Hash Table +Not to be confused with a Hash Map. A hash table stores all values as their own key. + +A hash table is a data structure that allows a user to store values and later retrieve them, just like an array. +The key difference is that a hash table will have O(1), or constant, lookup time on average. What this means is that the speed at which we can check whether a value exists within a table is not affected by how large the table grows. Compare this to a linked list that would require checking every element in order to see if a given value exists. That process's time to complete is proportional to how big a linked list grows. + +To achieve a hash table, a few important concepts come into play + - hashing + - collisions + - rehashing + +# Hashing +The concept of hashing is simple. In order to achieve a constant lookup time, a hash table has a hash function that calculates the position that a element should be stored in. The generic hash function for a table of size n is simply + +>index = toInsert % n + +As you can see, this will simply place a number into a table based on its remainder when divided by the table size, which will always result in a value that is an index in the table (with the assumption that we are working with positive integers). + + +# Collisions +What happens if two numbers give the same result from a hash function? This is called a collision, and resolving collisions is one of the areas of study in hash tables. There are multiple ways to resolve collisions, popular ones are simply simply adding 1 to the result until an open slot is found (called linear probing), hashing the number again using result of the number of collisions^2 (quadratic probing), and using a second hash function in conjunction with the first (double hashing). + +#Rehashing +Hash tables are only optimized when they can avoid collisions(or at least resolve them quickly) and rehashing. In order to keep this property true, we want a couple main properties to exist for our hash table: + - its size is a prime number + - its never more than half full + +If either of these properties become false, rehashing the table is a good idea to keep it efficient. Rehashing is the process of creating a new table that is bigger (usually at least twice the size of the previous table) and re-adding all the previous values to it. So, the process goes something like +1. create temp array to hold the table +2. find the next largest prime number that is at least twice the size of our previous table +3. create a new table of that size +4. re-add all the elements from the temporary table + +Specifically, step 4 is a slow process (linear time, but slow for something we may do often), and that is why we want to avoid rehashing. In order to be able to track when a table should rehash, a load variable is used to track how full the table is, and a MAX_LOAD is defined (usually 0.5) to indicate when a table should rehash. Every time a value is added to the table, the load is increased and the need for rehashing is evaluated. \ No newline at end of file diff --git a/data_structures/hash_table/java/DoubleHashTable.java b/data_structures/hash_table/java/DoubleHashTable.java new file mode 100644 index 0000000000..9d686f5f8a --- /dev/null +++ b/data_structures/hash_table/java/DoubleHashTable.java @@ -0,0 +1,164 @@ +import java.util.Arrays; + +/** + * Basic doubly-hashed table implementation + * 0 is used to indicate an empty slot + * Adjust hash functions hash1() and hash2() as desired, as well as + * when to rehash using MAX_LOAD + * I recommend not changing hash1()'s equation because it improves the likelihood of finding open slots. + * In general, try to create equations that will resolve to a wide variety of numbers + * + * Math.abs() is used throughout to ensure any negative numbers passed through hash functions + * resolve to a positive value + * + * @author Abe Ramseyer + */ +public class DoubleHashTable { + private int[] table; // the table to store all the values in + private int size; // the current size of the table + private int load; // how full the table is + private int rehashCount; // how many times the table has rehashed while adding elements + private final double MAX_LOAD = 0.5; // maximum load ratio until table rehashes + + public DoubleHashTable(int size) { + this.size = size; + rehashCount = 0; + load = 0; + table = new int[size]; + } + + public void insert(int num) { + if (num == 0) return; // 0 is our indication that a cell is empty, so disallow it in this table (could be avoided if using a List for the table) + int collisions = 0; + if(table[Math.abs(hash1(num))] == 0) { + table[Math.abs(hash1(num))] = num; + } + else { + do {collisions++; } + while(table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] != 0); // find the correct position, resolving collisions via a second hash function + table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] = num; // INSERT + } + load++; + + if((double) load / size >= MAX_LOAD) rehash(); + } + + /* + * change at your own risk, this is the most optimized hash function in this scenario + */ + private int hash1(int x) { + return x % size; + } + + /* + * feel free to experiment + */ + private int hash2(int x) { + return 7 - x % 7; + } + + /** + * finds a number in the hash table + * @param num + * @return if the number was found or not + */ // this could be re-written to return the index at which the value was found (-1 for not found). It would + public boolean find(int num) { // remove a lot of duplicate code that I have between here and the delete method + if (num == 0) return false; + int collisions = 0; + if(table[Math.abs(hash1(num))] == num) { // the number is where it should be + return true; + } + if(table[Math.abs(hash1(num))] == 0) { // found 0 in the first place that number would be + return false; + } + else { + do {collisions++; } + while(table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] != 0 && + table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] != num); // search table until we find 0 or the number + if(table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] == num) + return true; + else + return false; + } + } + + /** + * deletes a number from the hash table + * @param num + * @return whether the number was successfully deleted or not + */ + public boolean delete(int num) { + if (num == 0) return false; + int collisions = 0; + if(table[Math.abs(hash1(num))] == num) { // the number is where it should be + table[Math.abs(hash1(num))] = 0; // reset to 0, "freeing" the space + load--; + return true; + } + if(table[Math.abs(hash1(num))] == 0) { // found 0 in the first place that number would be + return false; + } + else { + do {collisions++; } + while(table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] != 0 && + table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] != num); // search table until we find 0 or the number + if(table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] == num) { + table[Math.abs(hash1(hash1(num)+collisions*hash2(num)))] = num; + load--; + return true; + } + else + return false; + } + } + + /* + * creates a new table of a size that is a prime number and + * at least twice as big as the previous table, then re-insert everything + */ + private void rehash() { + int[] temp = table; + size = nextPrime(size*2); + table = new int[size]; + load = 0; + for(int num : temp) { + if(num != 0) insert(num); + } + rehashCount++; + } + + /* + * gives the next prime number after initial value. There's probably a more efficient + * way to do this, but this is fairly straightforward to understand + * and not the focus of this data structure + */ + private int nextPrime(int start) { + for(int i = start+1; true ;i++) { + boolean isPrime = true; + for(int j = 2; j < i/2; j++) { // if this number is prime, the inner if + if (i % j == 0) { // statement will never fire and the method will return + isPrime = false; + break; + } + } + if (isPrime) return i; + } + } + + public int getRehashCount() { + return rehashCount; + } + + public int getSize() { + return size; + } + + public int getLoad() { + return load; + } + + public String toString() { + return Arrays.toString(table); + } + +} diff --git a/data_structures/hash_table/java/HashTableTests.java b/data_structures/hash_table/java/HashTableTests.java new file mode 100644 index 0000000000..70d9a93a88 --- /dev/null +++ b/data_structures/hash_table/java/HashTableTests.java @@ -0,0 +1,46 @@ +import java.util.Random; + +/** + * tests the quadratic and double hash tables + * @author Abe Ramseyer + */ +public class HashTableTests { + public static void main(String args[]) { + + Random gen = new Random(); + DoubleHashTable hashed = new DoubleHashTable(11); + QuadraticHashTable hashed2 = new QuadraticHashTable(11); + + // insert random values into first table, modify 20 to change amount + int num=1; + for(int i = 0; i < 20; i++) { + num = gen.nextInt(); + hashed.insert(num); + } + System.out.println("---Doubly Hashed Table Tests---\n" + hashed); + System.out.printf("rehashed: " + hashed.getRehashCount() + + "\nload: " + hashed.getLoad() + "/" + hashed.getSize() + ": %.2f%n", ((double) hashed.getLoad()/hashed.getSize())); + System.out.println("checking for " + (num+1) + " in the table: " + hashed.find(num+1)); // intentionally look for a value that is probably not in the table + System.out.println("deleting " + (num+1) + " from table: " + hashed.delete(num+1) + + "\nnew load: " + hashed.getLoad()); + System.out.println(hashed); + + System.out.println("\n"); + + // insert random values into second table, modify 20 to change amount + for(int i = 0; i < 20; i++) { + num = gen.nextInt(); + hashed2.insert(num); + } + + System.out.println("---Quadraticly Hashed Table Tests---\n" + hashed2); + System.out.printf("rehashed: " + hashed2.getRehashCount() + + "\nload: " + hashed2.getLoad() + "/" + hashed2.getSize() + ": %.2f%n", ((double) hashed2.getLoad()/hashed2.getSize())); + System.out.println("checking for " + (num+1) + " in the table: " + hashed2.find(num)); // this value will definitely be in the table + System.out.println("deleting " + num + " from table: " + hashed2.delete(num) + + "\nnew load: " + hashed2.getLoad()); + System.out.println(hashed2); + + } +} + diff --git a/data_structures/hash_table/java/QuadraticHashTable.java b/data_structures/hash_table/java/QuadraticHashTable.java new file mode 100644 index 0000000000..8ea5900393 --- /dev/null +++ b/data_structures/hash_table/java/QuadraticHashTable.java @@ -0,0 +1,157 @@ +import java.util.Arrays; + +/** + * Basic quadratic hash table implementation + * 0 is used to indicate an empty slot + * + * Math.abs() is used throughout to ensure any negative numbers passed through hash functions + * resolve to a positive value + * + * @author Abe Ramseyer + */ +public class QuadraticHashTable { + private int[] table; + private int size; + private int load; + private int rehashCount; + private final double MAX_LOAD = 0.5; + + public QuadraticHashTable(int size) { + this.size = size; + rehashCount = 0; + load = 0; + table = new int[size]; + } + + /** + * inserts a number into the hash table + * @param num + */ + public void insert(int num) { + if (num == 0) return; // 0 is our indication that a cell is empty, so disallow it in this table (could be avoided if using a List for the table) + int collisions = 0; + if(table[Math.abs(hash1(num))] == 0) { + table[Math.abs(hash1(num))] = num; + } + else { + do {collisions++; } + while(table[Math.abs(hash1(hash1(num)+collisions*collisions))] != 0); // find the correct position, resolving collisions quadratically + table[Math.abs(hash1(hash1(num)+collisions*collisions))] = num; // INSERT + } + load++; + + + if((double) load / size >= MAX_LOAD) rehash(); + } + + /** + * finds a number in the hash table + * @param num + * @return if the number was found or not + */ + public boolean find(int num) { + if (num == 0) return false; + int collisions = 0; + if(table[Math.abs(hash1(num))] == num) { // the number is where it should be + return true; + } + if(table[Math.abs(hash1(num))] == 0) { // found 0 in the first place that number would be + return false; + } + else { + do {collisions++; } + while(table[Math.abs(hash1(hash1(num)+collisions*collisions))] != 0 && + table[Math.abs(hash1(hash1(num)+collisions*collisions))] != num); // search table until we find 0 or the number + if(table[Math.abs(hash1(hash1(num)+collisions*collisions))] == num) + return true; + else + return false; + } + } + + /** + * deletes a number from the hash table + * @param num + * @return whether the number was successfully deleted or not + */ + public boolean delete(int num) { + if (num == 0) return false; + int collisions = 0; + if(table[Math.abs(hash1(num))] == num) { // the number is where it should be + table[Math.abs(hash1(num))] = 0; // reset to 0, "freeing" the space + load--; + return true; + } + if(table[Math.abs(hash1(num))] == 0) { // found 0 in the first place that number would be + return false; + } + else { + do {collisions++; } + while(table[Math.abs(hash1(hash1(num)+collisions*collisions))] != 0 && + table[Math.abs(hash1(hash1(num)+collisions*collisions))] != num); // search table until we find 0 or the number + if(table[Math.abs(hash1(hash1(num)+collisions*collisions))] == num) { + table[Math.abs(hash1(hash1(num)+collisions*collisions))] = 0; + load--; + return true; + } + else + return false; + } + } + + /* + * change at your own risk, this is the most optimized hash function in this scenario + */ + private int hash1(int x) { + return x % size; + } + + /* + * creates a new table of a size that is a prime number and + * at least twice as big as the previous table, then re-insert everything + */ + private void rehash() { + int[] temp = table; + size = nextPrime(size*2-1); + table = new int[size]; + load = 0; + for(int num : temp) { + if(num != 0) insert(num); + } + rehashCount++; + } + + /* + * Calculates the next prime number after initial value. There's probably a more efficient + * way to calculate this, but this is fairly straightforward to understand + * and not the focus of this data structure + */ + private int nextPrime(int start) { + for(int i = start+1; true ;i++) { + boolean isPrime = true; + for(int j = 2; j < i/2; j++) { // if this number is prime, the inner if + if (i % j == 0) { // statement will never fire and the method will return + isPrime = false; + break; + } + } + if (isPrime) return i; + } + } + + public int getRehashCount() { + return rehashCount; + } + + public int getSize() { + return size; + } + + public int getLoad() { + return load; + } + + public String toString() { + return Arrays.toString(table); + } +} From 4c26b95ae4bae5b16d2979475c0d689ccbf883cd Mon Sep 17 00:00:00 2001 From: Abe Ramseyer Date: Fri, 13 Oct 2017 23:37:16 -0500 Subject: [PATCH 055/355] created perfect number generator and description file --- math/perfect_number/Perfect Numbers.md | 7 ++ math/perfect_number/java/PerfectNumbers.java | 80 ++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 math/perfect_number/Perfect Numbers.md create mode 100644 math/perfect_number/java/PerfectNumbers.java diff --git a/math/perfect_number/Perfect Numbers.md b/math/perfect_number/Perfect Numbers.md new file mode 100644 index 0000000000..d6c0bf3ab6 --- /dev/null +++ b/math/perfect_number/Perfect Numbers.md @@ -0,0 +1,7 @@ +# Perfect Numbers +Taken from Wikipedia: +>In number theory, a perfect number is a positive integer that is equal to the sum of its proper positive divisors, that is, the sum of its positive divisors excluding the number itself (also known as its aliquot sum). + +It is fairly trivial to implement an algorithm that will check whether any given number is perfect. Simply find all its divisors, store them in a list, add them up, and check if they're equal to the original number. +To make this more interesting, the Euclid–Euler theorem states that every even perfect number can be formed using *q(q+1)/2* where *q* is a prime number formed from *2^(p-1)*, for all prime *p*. Using this theorem can allow us to generate perfect numbers faster. + diff --git a/math/perfect_number/java/PerfectNumbers.java b/math/perfect_number/java/PerfectNumbers.java new file mode 100644 index 0000000000..46a9176b2e --- /dev/null +++ b/math/perfect_number/java/PerfectNumbers.java @@ -0,0 +1,80 @@ +import java.math.BigInteger; +import java.util.Random; + +/** + * Generates even perfect numbers using the Euclid-Euler Theorem. Uses an implementation of the MillerRabin primality test + * in attempt to speed up checking, but it never got past the 7th number after I let it heat up my CPU for a while. + * Change the constant to generate perfect numbers based on the given number of primes. + * + * Primality test implementation is not my own, credit to Manish Bhojasia. Taken from http://www.sanfoundry.com/java-program-miller-rabin-primality-test-algorithm/ on Oct 13, 2017 + * + * @author Abe Ramseyer + */ +public class PerfectNumbers { + public static void main(String[] args) { + + final int PRIMES_TO_CHECK = 10000; + + for(int prime = 2; prime < PRIMES_TO_CHECK; prime = nextPrime(prime)) { // loops through all prime numbers in order up to threshold + long q = (long) (Math.pow(2, prime) - 1); + if(isPrime(q, 40)) + System.out.println(q*(q+1) / 2); + + } + System.out.println("finished"); + } + + static boolean isPrime(long n, int iteration) + { + if (n == 0 || n == 1) + return false; + if (n == 2) + return true; + if (n % 2 == 0) + return false; + + long s = n - 1; + while (s % 2 == 0) + s /= 2; + + Random rand = new Random(); + for (int i = 0; i < iteration; i++) + { + long r = Math.abs(rand.nextLong()); + long a = r % (n - 1) + 1, temp = s; + long mod = modPow(a, temp, n); + while (temp != n - 1 && mod != 1 && mod != n - 1) + { + mod = mulMod(mod, mod, n); + temp *= 2; + } + if (mod != n - 1 && temp % 2 == 0) + return false; + } + return true; + } + + /* Function to calculate (a ^ b) % c */ + static long modPow(long a, long b, long c) + { + long res = 1; + for (int i = 0; i < b; i++) + { + res *= a; + res %= c; + } + return res % c; + } + + /* Function to calculate (a * b) % c */ + static long mulMod(long a, long b, long mod) + { + return BigInteger.valueOf(a).multiply(BigInteger.valueOf(b)).mod(BigInteger.valueOf(mod)).longValue(); + } + + static int nextPrime(int start) { + for(int i = start+1; true ;i++) { + if(isPrime(i, 40)) return i; + } + } +} From ec22411e43ba0f0f9b14a1cbf46326165da5a4b9 Mon Sep 17 00:00:00 2001 From: Jay Shah Date: Sat, 14 Oct 2017 11:12:23 +0530 Subject: [PATCH 056/355] Vigenere cipher in Go --- cryptography/vigenere_cipher/Go/vigenere.go | 71 +++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 cryptography/vigenere_cipher/Go/vigenere.go diff --git a/cryptography/vigenere_cipher/Go/vigenere.go b/cryptography/vigenere_cipher/Go/vigenere.go new file mode 100644 index 0000000000..1e8013609a --- /dev/null +++ b/cryptography/vigenere_cipher/Go/vigenere.go @@ -0,0 +1,71 @@ +package main + +import ( + "fmt" +) + +func Encrypt(text string, key string) string { + if err := checkKey(key); err != nil { + fmt.Println("Error: ", err.Error()) + return "Err" + } + j := 0 + n := len(text) + res := "" + for i := 0; i < n; i++ { + r := text[i] + if r >= 'a' && r <= 'z' { + res += string((r+key[j]-2*'a')%26 + 'a') + } else if r >= 'A' && r <= 'Z' { + res += string((r+key[j]-2*'A')%26 + 'A') + } else { + res += string(r) + } + + j = (j + 1) % len(key) + } + return res +} + +func Decrypt(text string, key string) string { + if err := checkKey(key); err != nil { + fmt.Println("Error: ", err.Error()) + return "Err" + } + res := "" + j := 0 + n := len(text) + for i := 0; i < n; i++ { + r := text[i] + if r >= 'a' && r <= 'z' { + res += string((r-key[j]+26)%26 + 'a') + } else if r >= 'A' && r <= 'Z' { + res += string((r-key[j]+26)%26 + 'A') + } else { + res += string(r) + } + + j = (j + 1) % len(key) + } + return res +} + +func checkKey(key string) error { + if len(key) == 0 { + return fmt.Errorf("Key length is 0") + } + for _, r := range key { + if !(r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z') { + return fmt.Errorf("Invalid Key") + } + } + return nil +} + +func main() { + plainText := "helloworld" + key := "keyword" + encrypted := Encrypt(plainText, key) + fmt.Println("Encrypted text: ", encrypted) + fmt.Println("Plain text: ", Decrypt(encrypted, key)) +} From 269ebe08c740b85e1a8b26091ee1431e19ebf816 Mon Sep 17 00:00:00 2001 From: Jay Shah Date: Sat, 14 Oct 2017 11:17:55 +0530 Subject: [PATCH 057/355] Playfair cipher in Go --- .../playfair_cipher/Go/playfairCipher.go | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 cryptography/playfair_cipher/Go/playfairCipher.go diff --git a/cryptography/playfair_cipher/Go/playfairCipher.go b/cryptography/playfair_cipher/Go/playfairCipher.go new file mode 100644 index 0000000000..5eb42930d4 --- /dev/null +++ b/cryptography/playfair_cipher/Go/playfairCipher.go @@ -0,0 +1,173 @@ +package main + +import ( + "fmt" + "strings" +) + +var matrix [5][5]string + +func Encrypt(str string, key string) string { + res := "" + text := cleanText(str) + text, n := textLen(text) + matrix = generatMatrix(key) + printTable(matrix) + for i := 0; i < n-1; i += 2 { + r1, c1 := findChar(text[i]) + r2, c2 := findChar(text[i+1]) + //fmt.Printf("R1,C1\tR2,C2\n%d,%d\t%d,%d\n", r1, c1, r2, c2) + r := "" + if r1 == r2 { + r = matrix[r1][(c1+1)%5] + matrix[r2][(c2+1)%5] + } else if c1 == c2 { + r = matrix[(r1+1)%5][c1] + matrix[(r2+1)%5][c2] + } else { + r = matrix[r1][c2] + matrix[r2][c1] + } + res += r + } + return res +} + +func Decrypt(str string, key string) string { + res := "" + n := len(str) + text := strings.ToUpper(str) + matrix = generatMatrix(key) + printTable(matrix) + for i := 0; i < n-1; i += 2 { + r1, c1 := findChar(text[i]) + r2, c2 := findChar(text[i+1]) + //fmt.Printf("R1,C1\tR2,C2\n%d,%d\t%d,%d\n", r1, c1, r2, c2) + r := "" + if r1 == r2 { + c11, c22 := c1-1, c2-1 + if c11 < 0 { + c11 = 5 + c11 + } + if c22 < 0 { + c22 = 5 + c22 + } + r = matrix[r1][(c11)%5] + matrix[r2][(c22)%5] + } else if c1 == c2 { + r11, r22 := r1-1, r2-1 + if r11 < 0 { + r11 = 5 + (r11) + } + if r22 < 0 { + r22 = 5 + (r22) + } + r = matrix[(r11)%5][c1] + matrix[(r22)%5][c2] + } else { + r = matrix[r1][c2] + matrix[r2][c1] + } + res += r + } + return res +} + +func generatMatrix(key string) [5][5]string { + //fmt.Println("Key: ", key) + var ( + used [26]bool + matrix [5][5]string + ) + used[9] = true // J used + alphabets := strings.ToUpper(key) + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + i, j := 0, 0 + for k := range alphabets { + c := alphabets[k] + //log.Printf("c %v ", c) + if !(c >= 'A' && c <= 'Z') { + continue + } + d := c - 65 + //log.Printf("d %v ", d) + if !used[d] { + //log.Println("cc ", c) + matrix[i][j] = string(c) + //fmt.Println("added ", string(c)) + used[d] = true + if (j + 1) == 5 { + if (i + 1) == 5 { + break + } else { + i++ + } + j = 0 + } else { + j++ + } + + } + } + return matrix +} + +func cleanText(text string) string { + cleanTxt := "" + n := len(text) + txt := strings.ToUpper(text) + txt = strings.Replace(txt, "J", "I", -1) + prevCh := "\u0000" + for i := 0; i < n; i++ { + nextCh := string(txt[i]) + if !(nextCh >= "A" && nextCh <= "Z") { + continue + } + if nextCh == "J" { + cleanTxt += "I" + } + if nextCh == prevCh { + cleanTxt += "X" + nextCh + } else { + cleanTxt += nextCh + } + prevCh = nextCh + } + return cleanTxt +} + +func textLen(text string) (string, int) { + n := len(text) + if n%2 == 0 { + return text, n + } + if string(text[n-1]) != "X" { + text += "X" + } else { + text += "Z" + } + return text, len(text) +} + +func findChar(b byte) (int, int) { + s := string(b) + for i := 0; i < 5; i++ { + for j := 0; j < 5; j++ { + if strings.Compare(matrix[i][j], s) == 0 { + return i, j + } + } + } + return -1, -1 +} + +func printTable(t [5][5]string) { + fmt.Println("Matrix => ") + for i := 0; i < 5; i++ { + for j := 0; j < 5; j++ { + fmt.Printf("%s ", t[i][j]) + } + fmt.Println() + } +} + +func main() { + plainText := "helloworld" + key := "keyword" + encrypted := Encrypt(plainText, key) + fmt.Println("Encrypted text: ", encrypted) + fmt.Println("Plain text: ", Decrypt(encrypted, key)) +} From 4875904d3363a5f5b99a743c7047c2c9e06bfbde Mon Sep 17 00:00:00 2001 From: sgrG24 <31286502+sgrG24@users.noreply.github.com> Date: Sat, 14 Oct 2017 11:57:57 +0530 Subject: [PATCH 058/355] create a rail fence cipher --- cryptography/Rail fence cipher | 1 + 1 file changed, 1 insertion(+) create mode 100644 cryptography/Rail fence cipher diff --git a/cryptography/Rail fence cipher b/cryptography/Rail fence cipher new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/cryptography/Rail fence cipher @@ -0,0 +1 @@ + From 4a1868febbdbc5de387f8912aa686db2c6c29a3c Mon Sep 17 00:00:00 2001 From: sgrG24 <31286502+sgrG24@users.noreply.github.com> Date: Sat, 14 Oct 2017 12:15:01 +0530 Subject: [PATCH 059/355] Delete Rail fence cipher --- cryptography/Rail fence cipher | 1 - 1 file changed, 1 deletion(-) delete mode 100644 cryptography/Rail fence cipher diff --git a/cryptography/Rail fence cipher b/cryptography/Rail fence cipher deleted file mode 100644 index 8b13789179..0000000000 --- a/cryptography/Rail fence cipher +++ /dev/null @@ -1 +0,0 @@ - From 6e26645d4b0655d8636784684952a9a8338c7aa4 Mon Sep 17 00:00:00 2001 From: sgrG24 <31286502+sgrG24@users.noreply.github.com> Date: Sat, 14 Oct 2017 12:19:32 +0530 Subject: [PATCH 060/355] Rail Fence Cipher. Implement in c++. --- .../Rail Fence Cipher/Rail_Fence Cipher.cpp | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp diff --git a/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp b/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp new file mode 100644 index 0000000000..c3a537c35d --- /dev/null +++ b/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp @@ -0,0 +1,122 @@ +// C++ program for Rail Fence Cipher +#include +using namespace std; + +// Encryption---------------------- +string encrypt(string object, int key) +{ + // create the matrix to plain text + // key = rows , length(object) = columns + char rail[key][(object.length())]; + + // filling the rail matrix + for (int i=0; i < key; i++) + for (int j = 0; j < object.length(); j++) + rail[i][j] = '\n'; + + // to find the direction + bool dir = false; + int row = 0, col = 0; + + for (int i=0; i < object.length(); i++) + { + // check the direction of flow + // reverse the direction if we've just + // filled the top or bottom rail + if (row == 0 || row == key-1) + dir = !dir; + + // fill the corresponding alphabet + rail[row][col++] = object[i]; + + // find the next row using direction flag + dir?row++ : row--; + } + + //Construct the cipher using the rail matrix + string result; + for (int i=0; i < key; i++) + for (int j=0; j < object.length(); j++) + if (rail[i][j]!='\n') + result.push_back(rail[i][j]); + + return result; +} + +// Decryption------------------------------- +string decrypt(string cipher, int key) +{ + // create the matrix to plain text + // key = rows , length(cipher) = columns + char rail[key][cipher.length()]; + + // filling the rail matrix to distinguish filled + // spaces from blank ones + for (int i=0; i < key; i++) + for (int j=0; j < cipher.length(); j++) + rail[i][j] = '\n'; + + // to find the direction + bool dir; + + int row = 0, col = 0; + + // mark the places with '*' + for (int i=0; i < cipher.length(); i++) + { + // check the direction of flow + if (row == 0) + dir = true; + if (row == key-1) + dir = false; + + // place the marker + rail[row][col++] = '*'; + + // find the next row using direction flag + dir?row++ : row--; + } + + //Construct the fill the rail matrix + int index = 0; + for (int i=0; i Date: Sat, 14 Oct 2017 12:48:09 +0530 Subject: [PATCH 061/355] Update Rail_Fence Cipher.cpp --- .../Rail Fence Cipher/Rail_Fence Cipher.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp b/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp index c3a537c35d..51c6c78b0b 100644 --- a/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp +++ b/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp @@ -110,13 +110,13 @@ string decrypt(string cipher, int key) //driver program(main function) int main() { - cout << encrypt("sagar gupta", 3) << endl; - cout << encrypt("GeeksforGeeks ", 3) << endl; - cout << encrypt("defend the east wall", 3) << endl; - - cout << decrypt("srpaa utagg",3) << endl; - cout << decrypt("atc toctaka ne",2) << endl; - cout << decrypt("dnhaweedtees alf tl",3) << endl; + cout << encrypt("Rail fence", 3) << endl; + cout << encrypt("Cryptography", 3) << endl; + cout << encrypt("Github", 3) << endl; + cout<<"DEcrypted Code"< Date: Sat, 14 Oct 2017 11:45:26 +0300 Subject: [PATCH 062/355] added exp-simpson.c --- math/numerical_integration/c/exp-simpsons.c | 38 +++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 math/numerical_integration/c/exp-simpsons.c diff --git a/math/numerical_integration/c/exp-simpsons.c b/math/numerical_integration/c/exp-simpsons.c new file mode 100644 index 0000000000..683f4bab97 --- /dev/null +++ b/math/numerical_integration/c/exp-simpsons.c @@ -0,0 +1,38 @@ + +#include +#include + +void main() +{ +int n; +float a = 0, b = 4; +float simps(float a, float b, int n); +printf("Enter the value of n\n"); +scanf("%d", &n); +printf("Integral value of f(x) by Simpson's rule:%f\n", simps(a, b, n)); +} + +float f(float x) +{ + return exp(x); +} + +float simps(float a, float b, int n) +{ + float x, y[21], h, sum; + int i; + h = (b - a) / n; + x = a; + for(i = 0; i <= n; i++){ + y[i] = f(x); + x = x + h; + } + sum = y[0] + y[n]; + for(i = 1; i <= n - 1; i += 2) + sum += 4 * y[i] + 2 * y[i + 1]; + sum -= 2 * y[n]; + sum = sum * h / 3.0; + return sum; +} + + From 0a947a0df5d4e7729940407939871b1c35f4b7a9 Mon Sep 17 00:00:00 2001 From: sgrG24 <31286502+sgrG24@users.noreply.github.com> Date: Sat, 14 Oct 2017 14:29:04 +0530 Subject: [PATCH 063/355] Atbash cipher. At-bash Cipher implementation in c++ language. --- .../Atbash Cipher/Atbash_Cipher.cpp.cpp | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 cryptography/Atbash Cipher/Atbash_Cipher.cpp.cpp diff --git a/cryptography/Atbash Cipher/Atbash_Cipher.cpp.cpp b/cryptography/Atbash Cipher/Atbash_Cipher.cpp.cpp new file mode 100644 index 0000000000..23a269d6cf --- /dev/null +++ b/cryptography/Atbash Cipher/Atbash_Cipher.cpp.cpp @@ -0,0 +1,47 @@ +// C++ implementation of Atbash Cipher +#include +using namespace std; + +// Creating a array of upper case alphabets +char upper_case[]={'Z', 'Y', 'X', 'W', 'V', 'U', + 'T', 'S', 'R', 'Q', 'P', 'O', + 'N', 'M', 'L', 'K', 'J', 'I', + 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A'}; + +// Creating a array of lower case alphabets + char lower_case[]={'z', 'y', 'x', 'w', 'v', 'u', + 't', 's', 'r', 'q', 'p', 'o', + 'n', 'm', 'l', 'k', 'j', 'i', + 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'}; + +// Encryption and Decryption function +void atbash(string message) +{ + int len = message.size(); // Calculating lenght of the string + string cipher; + int ascii_char; + for(int i=0;i='A' && ascii_char<='Z') + cipher = cipher + upper_case[ascii_char-65]; // If character is in upper case(minus 65 from its ASCII value to get reversed character) + else + cipher = cipher + lower_case[ascii_char-97]; // If character is in upper case(minus 97 from its ASCII value to get reversed character) + + } + cout<<"Atbash Cipher - "< Date: Sat, 14 Oct 2017 15:11:28 +0530 Subject: [PATCH 064/355] Added QuickSort in c and updated directory structure for java quicksort --- sort/quick_sort/c/quicksort.c | 54 ++++++++++++++++++++++ sort/quick_sort/{ => java}/quick_sort.java | 0 2 files changed, 54 insertions(+) create mode 100644 sort/quick_sort/c/quicksort.c rename sort/quick_sort/{ => java}/quick_sort.java (100%) diff --git a/sort/quick_sort/c/quicksort.c b/sort/quick_sort/c/quicksort.c new file mode 100644 index 0000000000..32f6a92d8e --- /dev/null +++ b/sort/quick_sort/c/quicksort.c @@ -0,0 +1,54 @@ +#include +#include +void swap(int *x,int *y) +{ + int temp=*x; + *x=*y; + *y=temp; +} +int parition(int arr[],int l,int h) +{ + int pivot=arr[h]; + int i=l-1; + int j; + for(j=l;j<=h-1;j++) + { + if(arr[j]<=pivot) + { + i++; + swap(&arr[j],&arr[i]); + } + } + swap(&arr[i+1],&arr[h]); + return (i+1); +} +void quicksort(int arr[],int l,int h) +{ + if(l Date: Sat, 14 Oct 2017 13:05:22 +0300 Subject: [PATCH 065/355] Added php implementation of the fibonacci sequence --- math/fibonacci/php/fibonacci.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 math/fibonacci/php/fibonacci.php diff --git a/math/fibonacci/php/fibonacci.php b/math/fibonacci/php/fibonacci.php new file mode 100644 index 0000000000..ed49ddfd8d --- /dev/null +++ b/math/fibonacci/php/fibonacci.php @@ -0,0 +1,16 @@ + From a6eca69f7ea159250bc00dd0528ef05610a6d63c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CRadhika?= <“radhikadua1997@gmail.com”> Date: Sat, 14 Oct 2017 15:58:14 +0530 Subject: [PATCH 066/355] Modify README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 406794cf42..bce90a1a70 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ Clean examples implementations of data structures and algorithms written in diff e.g > buble_sort/python/buble_sort.py - * If there is implementation of the same algorithm in your language add you username in front of the file name + * If there is implementation of the same algorithm in your language add your username in front of the file name * Please include description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps to people that are learning new algorithm. * Graphical example would be verry helpful too. * Don't forget to include tests. From d02c240bf85bf0bc0ab5ac6b77e7dcd2bf9c6ec7 Mon Sep 17 00:00:00 2001 From: bamsarts Date: Sat, 14 Oct 2017 17:39:30 +0700 Subject: [PATCH 067/355] add BFS search algorithm in java --- search/breadth_first_search/java/BFS.java | 53 +++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 search/breadth_first_search/java/BFS.java diff --git a/search/breadth_first_search/java/BFS.java b/search/breadth_first_search/java/BFS.java new file mode 100644 index 0000000000..3215a2480f --- /dev/null +++ b/search/breadth_first_search/java/BFS.java @@ -0,0 +1,53 @@ +/* + * Time-Complexity:- O(V+E) + * + */ + + +import java.util.*; + +public class BFS { + + static ArrayList> graph; + static Queue queue; + public static void traverse(int source) + { + queue = new LinkedList<>(); + queue.add(source); + boolean[] visited = new boolean[graph.size()]; + visited[source]=true; + while(!queue.isEmpty()) + { + int q = queue.poll(); + System.out.println(q); + ArrayList list = graph.get(q); + for(int i=0;i(); + Scanner sc = new Scanner(System.in); + int vertices = sc.nextInt(); + int edges = sc.nextInt(); + for(int i=0;i()); + for(int i=0;i Date: Sat, 14 Oct 2017 17:48:47 +0700 Subject: [PATCH 068/355] add kadane algorithm in c++ --- dp/kadane-_algorithm/cpp/kadane.cpp | 15 +++++++ search/breadth_first_search/java/BFS.java | 53 ----------------------- 2 files changed, 15 insertions(+), 53 deletions(-) create mode 100644 dp/kadane-_algorithm/cpp/kadane.cpp delete mode 100644 search/breadth_first_search/java/BFS.java diff --git a/dp/kadane-_algorithm/cpp/kadane.cpp b/dp/kadane-_algorithm/cpp/kadane.cpp new file mode 100644 index 0000000000..e06607d031 --- /dev/null +++ b/dp/kadane-_algorithm/cpp/kadane.cpp @@ -0,0 +1,15 @@ +#include + +using namespace std; + +int main(){ + vector v={-2,-1,-5,3,7,-2,5,11,-10,-20,11}; + int n=v.size(); + int mini=*min_element(v.begin(),v.end()); + int maxval=mini,curval=mini; + for(int i=0;i Date: Sat, 14 Oct 2017 17:50:13 +0700 Subject: [PATCH 069/355] added euclids_gcd for node.js --- math/euclids_gcd/node.js/euclids_gcd.js | 6 ++++++ math/euclids_gcd/node.js/test.js | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 math/euclids_gcd/node.js/euclids_gcd.js create mode 100644 math/euclids_gcd/node.js/test.js diff --git a/math/euclids_gcd/node.js/euclids_gcd.js b/math/euclids_gcd/node.js/euclids_gcd.js new file mode 100644 index 0000000000..d503385634 --- /dev/null +++ b/math/euclids_gcd/node.js/euclids_gcd.js @@ -0,0 +1,6 @@ +const euclids_gcd = (a, b) => { + if (a === 0) return b; + return euclids_gcd(b % a, a); +}; + +module.exports = euclids_gcd ; \ No newline at end of file diff --git a/math/euclids_gcd/node.js/test.js b/math/euclids_gcd/node.js/test.js new file mode 100644 index 0000000000..09cde804f3 --- /dev/null +++ b/math/euclids_gcd/node.js/test.js @@ -0,0 +1,5 @@ +const euclids_gcd = require("./euclids_gcd") + +console.log(euclids_gcd(1,10)); +console.log(euclids_gcd(6,24)); +console.log(euclids_gcd(7,133)); \ No newline at end of file From 02299ba46100a8f118af22bde58cb340749e233f Mon Sep 17 00:00:00 2001 From: Aman Bansal Date: Sat, 14 Oct 2017 17:56:14 +0530 Subject: [PATCH 070/355] Added ruby implementation of the euclid's gcd --- math/euclids_gcd/ruby/euclids_gcd.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 math/euclids_gcd/ruby/euclids_gcd.rb diff --git a/math/euclids_gcd/ruby/euclids_gcd.rb b/math/euclids_gcd/ruby/euclids_gcd.rb new file mode 100644 index 0000000000..99e0847218 --- /dev/null +++ b/math/euclids_gcd/ruby/euclids_gcd.rb @@ -0,0 +1,26 @@ +# Function implementing Euclid's GCD Algorithm +def euclids_gcd (a = 1, b = 1) +######################################################################################################################### + #The Euclidean Algorithm for finding GCD(A,B) is as follows: + # If A = 0 then GCD(A,B)=B, since the GCD(0,B)=B, and we can stop. + # If B = 0 then GCD(A,B)=A, since the GCD(A,0)=A, and we can stop. + # Write A in quotient remainder form (A = B⋅Q + R) + # Find GCD(B,R) using the Euclidean Algorithm since GCD(A,B) = GCD(B,R) +######################################################################################################################### + divisor = b + dividend = a + while (divisor != 0) + remainder = dividend % divisor + dividend = divisor + divisor = remainder + end + + gcd = dividend + return gcd +end + +# Take 2 numbers from the user as input and output the GCD +print("Enter 2 Numbers: ") +a, b = gets.split.map(&:to_i) +gcd = euclids_gcd(a, b) +print("Greatest Common Divisor of " + a.to_s + " and " + b.to_s + " is " + gcd.to_s + "\n") From d1fbf5fde3a623a00f8cdcafa0ab359813589943 Mon Sep 17 00:00:00 2001 From: Ashish Agarwal Date: Sat, 14 Oct 2017 18:09:49 +0530 Subject: [PATCH 071/355] check for balanced parenthesis using stack --- data_structures/Stack/C++/.DS_Store | Bin 0 -> 6148 bytes .../Stack/C++/balanced parenthesis.c++ | 62 ++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 data_structures/Stack/C++/.DS_Store create mode 100644 data_structures/Stack/C++/balanced parenthesis.c++ diff --git a/data_structures/Stack/C++/.DS_Store b/data_structures/Stack/C++/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..af68596058b96ae4d642949dc6545736d646565c GIT binary patch literal 6148 zcmeHKO-}+b5Pd}s7%v=50&v6k`8m)9(4h*p4p}saycexWD_Yt_7joRdqmNrW z0bcn`@v$@hvl4$?h@Y@$SxZlaJR5#ThBemZ?{IgOJiW#|x;AxezawkT_f^Tqrin3N z3>X7@!T|Sdk!b49+P zI1MFgsEbz&r{T2w=$Ayy6*U|#UOrsx*~J@*3%xVH5AJY@qLs#gF;HgUK$~6J|1Wpn z|I0zvG6sx+y<)(%N9kzDA;rD5HaOX9J@tVqB7V8zHiVV171LL?;vO{!?OrOxBx0^e Q3&josfd(s#fj?#72LiECqW}N^ literal 0 HcmV?d00001 diff --git a/data_structures/Stack/C++/balanced parenthesis.c++ b/data_structures/Stack/C++/balanced parenthesis.c++ new file mode 100644 index 0000000000..64e2a468cb --- /dev/null +++ b/data_structures/Stack/C++/balanced parenthesis.c++ @@ -0,0 +1,62 @@ +#include +#include +#include +using namespace std; +bool check(char x, char y) +{ + if ((x=='(' && y==')') || (x=='{' && y=='}') || (x=='[' && y==']') || (x=='<' && y=='>')) + { + return true; + } + else + { + return false; + } +} + +bool checkbalancedparenthesis(string s) +{ + stack st; + int top=-1; + int l=s.length(); + for(int i=0;i>test; + while(test-->0) + { + string s; + cin>>s; + if(checkbalancedparenthesis(s)==true) + cout<<"BALANCED"< Date: Sat, 14 Oct 2017 16:09:24 +0300 Subject: [PATCH 072/355] Corrected README.md typos Minor typo and grammar corrections --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bce90a1a70..d9c95a4713 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # Data Structures and Algorithms -Clean examples implementations of data structures and algorithms written in different languages. +Clean example implementations of data structures and algorithms written in different languages. ## List of implementations @@ -93,11 +93,11 @@ Clean examples implementations of data structures and algorithms written in diff e.g > buble_sort/python/buble_sort.py - * If there is implementation of the same algorithm in your language add your username in front of the file name - * Please include description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps to people that are learning new algorithm. - * Graphical example would be verry helpful too. + * If there is an implementation of the same algorithm in your language, add your username in front of the file name + * Please include a description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps people that are learning new algorithm. + * Graphical examples would be very helpful too. * Don't forget to include tests. - * Don't remove previous implementation of algorithms. Just add new file with your own implementation. + * Don't remove previous implementations of algorithms. Just add a new file with your own implementation. ## Resources From 18541ac7b1fc93b06cc13a1870e7eff45d9be8bc Mon Sep 17 00:00:00 2001 From: Him98 Date: Sat, 14 Oct 2017 18:49:43 +0530 Subject: [PATCH 073/355] Added MergeSort in C++ --- sort/merge_sort/c++/mergesort.cpp | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sort/merge_sort/c++/mergesort.cpp diff --git a/sort/merge_sort/c++/mergesort.cpp b/sort/merge_sort/c++/mergesort.cpp new file mode 100644 index 0000000000..ab1b724c7f --- /dev/null +++ b/sort/merge_sort/c++/mergesort.cpp @@ -0,0 +1,58 @@ +#include +using namespace std; +int arr[1000000],a[1000000],b[1000000]; +void merge(int l,int m,int h) +{ + int len1=(m-l+1),len2=(h-m); + int i=0,j=0,k=l; + for(i=0;ib[j]) + arr[k]=b[j++]; + k++; + } + while(i>1; + msort(l,mid); + msort(mid+1,h); + merge(l,mid,h); + } +} +int main() +{ + int n,i,j; + i=0; + n=0; + cout<<"Enter how many numbers you want to sort : "; + cin>>n; + cout<<"Enter numbers"<>arr[i]; + msort(0,n-1); + cout<<"Sorted numbers are : "; + for(i=0;i Date: Sat, 14 Oct 2017 15:23:59 +0200 Subject: [PATCH 074/355] Added ternary search and implementation in c++ --- search/ternary_search/README.md | 12 +++++++ search/ternary_search/c++/ternary_search.cpp | 37 ++++++++++++++++++++ search/ternary_search/c++/tests.txt | 11 ++++++ 3 files changed, 60 insertions(+) create mode 100644 search/ternary_search/README.md create mode 100644 search/ternary_search/c++/ternary_search.cpp create mode 100644 search/ternary_search/c++/tests.txt diff --git a/search/ternary_search/README.md b/search/ternary_search/README.md new file mode 100644 index 0000000000..23dffee860 --- /dev/null +++ b/search/ternary_search/README.md @@ -0,0 +1,12 @@ +### Ternary Search +A ternary search algorithm is a technique in computer science for finding the minimum or maximum of a unimodal function. A ternary search determines either that the minimum or maximum cannot be in the first third of the domain or that it cannot be in the last third of the domain, then repeats on the remaining third. A ternary search is an example of a divide and conquer algorithm. +#### Run time analysis +T(n) = T(2n/3) + Θ(1) = Θ(log3n) +#### Formulation of the problem + +Let an unimodal function *f(x)* is given on interval *[l:r]*. Unimodality means one of two options: +- *f(x)* is a strictly increasing function firstly, then reaches a maximum (at one point or a whole segment), then strictly decreases. +- *f(x)* decreases firstly, reaches a minimum and than increases. + +Required to ***find the maximum/minimum*** of the function *f(x)* on the interval *[l:r]* + diff --git a/search/ternary_search/c++/ternary_search.cpp b/search/ternary_search/c++/ternary_search.cpp new file mode 100644 index 0000000000..a57bb43172 --- /dev/null +++ b/search/ternary_search/c++/ternary_search.cpp @@ -0,0 +1,37 @@ +#include +using namespace std; + +/* + * returns the index of the maximum element in ar + */ +int ternary_search(int ar[], int n) { + int start = 0, end = n - 1; + while (start < end) { + int mid1 = start + (end - start) / 3; + int mid2 = end - (end - start) / 3; + if (ar[mid1] <= ar[mid2]) { + start = mid1 + 1; + } else { + end = mid2 - 1; + } + } + return start; +} + +int main() { + freopen("tests.txt", "r", stdin); + int num_tests; + cin >> num_tests; + + for (int t = 0; t < num_tests; t++){ + int n; + cin >> n; + int ar[n]; + for (int i = 0; i < n; i++){ + cin >> ar[i]; + } + cout << "Test#" << t+1 << ": " << ar[ternary_search(ar, n)] << endl; + } + return 0; +} + diff --git a/search/ternary_search/c++/tests.txt b/search/ternary_search/c++/tests.txt new file mode 100644 index 0000000000..48493e81d4 --- /dev/null +++ b/search/ternary_search/c++/tests.txt @@ -0,0 +1,11 @@ +5 +9 +1 3 4 5 7 6 4 3 0 +4 +5 10 100 1 +4 +5 10 100 100 +4 +10 2 0 -1 +1 +11 From ff01758f0b3ef57ea524c8efcc8a83ce687d1178 Mon Sep 17 00:00:00 2001 From: Mathieu Vidalies <5948608+Furinkazan33@users.noreply.github.com> Date: Sat, 14 Oct 2017 15:54:37 +0200 Subject: [PATCH 075/355] Create fibonacci.js --- math/fibonacci/JavaScript/fibonacci.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 math/fibonacci/JavaScript/fibonacci.js diff --git a/math/fibonacci/JavaScript/fibonacci.js b/math/fibonacci/JavaScript/fibonacci.js new file mode 100644 index 0000000000..7b9ff2e4a4 --- /dev/null +++ b/math/fibonacci/JavaScript/fibonacci.js @@ -0,0 +1,4 @@ + +const fibonacci = n => + n <= 1 ? 1 : fibonacci(n - 1) + fibonacci(n - 2) + From 84e917633be40c3047f3e7cc233fc2c18857502d Mon Sep 17 00:00:00 2001 From: Jay Shah Date: Sat, 14 Oct 2017 19:29:16 +0530 Subject: [PATCH 076/355] Railfence cipher in Go --- .../Rail Fence Cipher/Go/railfence.go | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 cryptography/Rail Fence Cipher/Go/railfence.go diff --git a/cryptography/Rail Fence Cipher/Go/railfence.go b/cryptography/Rail Fence Cipher/Go/railfence.go new file mode 100644 index 0000000000..60c99257cf --- /dev/null +++ b/cryptography/Rail Fence Cipher/Go/railfence.go @@ -0,0 +1,120 @@ +package main + +import "fmt" + +func Encrypt(str string, depth int) string { + w := len(str) + grid := makeGrid(depth, w) + dir, i := 1, 0 + for j := 0; j < w; j++ { + grid[i][j] = string(str[j]) + i += dir * 1 + if i == depth-1 || i == 0 { + dir *= -1 + } + } + printTable(grid) + return readGrid(grid) +} + +func readGrid(g [][]string) string { + s := "" + n := len(g) + for i := 0; i < n; i++ { + m := len(g[i]) + for j := 0; j < m; j++ { + s += g[i][j] + } + } + return s +} + +func makeGrid(n int, w int) [][]string { + grid := make([][]string, n) + for i := 0; i < n; i++ { + grid[i] = make([]string, w) + } + return grid +} + +func printTable(t [][]string) { + fmt.Println("Matrix => ") + n := len(t) + for i := 0; i < n; i++ { + m := len(t[i]) + for j := 0; j < m; j++ { + fmt.Printf("%s |", t[i][j]) + } + fmt.Println() + } +} + +func Decrypt(str string, depth int) string { + s := "" + l := len(str) + cycle := (depth * 2) - 2 + extra := l % cycle + rows := make([]int, depth) + for i := 0; i < depth; i++ { + rows[i] = (l / cycle) * 2 + if i == 0 || i == depth-1 { + rows[i] = (l / cycle) + } + } + i := 0 + for extra != 0 { + rows[i]++ + extra-- + i = (i + 1) % depth + } + rowVals := make([][]string, depth) + for i, j, k := 0, 0, 0; i < depth; i++ { + rowVals[i] = make([]string, rows[i]) + k = 0 + for k < rows[i] { + rowVals[i][k] = string(str[j]) + k++ + j++ + } + } + counts := make([]int, depth) + for i := range counts { + counts[i] = 0 + } + dir := 1 + for i, j := 0, 0; i < l; i++ { + s += rowVals[j][counts[j]] + if counts[j] < rows[j] { + counts[j]++ + } + if j+1 == depth { + dir = -1 + } + if j == 0 { + dir = 1 + } + j = j + (1 * dir) + + } + return s +} + +func checkDepth(d int) error { + if d < 2 { + return fmt.Errorf("%s", "Depth is too low, use 2 or higher") + } + return nil +} + +func main() { + plainText := "helloworld" + depth2 := 2 + depth3 := 3 + encrypted2 := Encrypt(plainText, depth2) + fmt.Println("Encrypted text (depth 2): ", encrypted2) + fmt.Println("Decrypted text (depth 2): ", Decrypt(encrypted2, depth2)) + fmt.Println() + encrypted3 := Encrypt(plainText, depth3) + fmt.Println("Encrypted text (depth 3): ", encrypted3) + fmt.Println("Decrypted text (depth 3): ", Decrypt(encrypted3, depth3)) +} From 282b9bf5285488b5c87c9d9d53c9de619be1b28d Mon Sep 17 00:00:00 2001 From: vapolonio Date: Sat, 14 Oct 2017 11:49:55 -0300 Subject: [PATCH 077/355] added array stack in js --- .../Stack/javascript/ArrayStack.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 data_structures/Stack/javascript/ArrayStack.js diff --git a/data_structures/Stack/javascript/ArrayStack.js b/data_structures/Stack/javascript/ArrayStack.js new file mode 100644 index 0000000000..0088203b20 --- /dev/null +++ b/data_structures/Stack/javascript/ArrayStack.js @@ -0,0 +1,23 @@ +function Stack() { + let items = []; + + this.pop = function() { + return items.pop(); + }; + + this.push = function(element) { + items.push(element); + }; + + this.peek = function() { + return items[items.length-1]; + }; + + this.isEmpty = function() { + return items.length == 0; + }; + + this.clear = function() { + items = []; + }; +} \ No newline at end of file From d98d3070f823b502ce28a78e80eef73060f7f4c1 Mon Sep 17 00:00:00 2001 From: Maria Michailidou Date: Sat, 14 Oct 2017 17:50:37 +0300 Subject: [PATCH 078/355] Create c++sum --- math/sum_of_digits/c++sum | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 math/sum_of_digits/c++sum diff --git a/math/sum_of_digits/c++sum b/math/sum_of_digits/c++sum new file mode 100644 index 0000000000..09ca46bf3e --- /dev/null +++ b/math/sum_of_digits/c++sum @@ -0,0 +1,16 @@ +#include iostream +using namespace std; +int main () +{ +int j; +float g,sum; +sum=0; +j=0; +cout<<"Give number of numbers you want to add"<>g; +sum=sum+g; +} +cout<<"The sum of these digits are: "< Date: Sat, 14 Oct 2017 17:58:17 +0300 Subject: [PATCH 079/355] Javascript: Euclidean GCD --- math/euclids_gcd/javascript/euclids_gcd.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 math/euclids_gcd/javascript/euclids_gcd.js diff --git a/math/euclids_gcd/javascript/euclids_gcd.js b/math/euclids_gcd/javascript/euclids_gcd.js new file mode 100644 index 0000000000..e2ff455ae2 --- /dev/null +++ b/math/euclids_gcd/javascript/euclids_gcd.js @@ -0,0 +1,12 @@ +function euclidsGcd(a, b) { + if (!a) { + return b; + } + + return euclidsGcd(b % a, a); +} + +// test +[[ 1, 10, 1 ], [ 2, 4, 2 ], [ 2, 9, 1 ], [ 37, 91, 1 ], [ 5, 10, 5 ], + [ 6, 9, 3 ]] + .forEach(row => { console.assert(euclidsGcd(row[0], row[1]), row[2]); }); From 0812ccdddacab8e7c6dfb3a917c096629a5e85e3 Mon Sep 17 00:00:00 2001 From: goksgie Date: Sat, 14 Oct 2017 18:09:03 +0300 Subject: [PATCH 080/355] binary tree in python is added --- .../binarySearch_tree/Python/binary-tree.py | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 data_structures/binarySearch_tree/Python/binary-tree.py diff --git a/data_structures/binarySearch_tree/Python/binary-tree.py b/data_structures/binarySearch_tree/Python/binary-tree.py new file mode 100644 index 0000000000..69034c7b50 --- /dev/null +++ b/data_structures/binarySearch_tree/Python/binary-tree.py @@ -0,0 +1,102 @@ +class Node: + def __init__(self, key, left=None, right=None, parent=None): + self.key = key + self.right = right + self.left = left + + def hasLeftChild(self): + return self.left + + def hasRightChild(self): + return self.right + + def isLeaf(self): + return not (self.right or self.left) + + def isRoot(self): + return not self.parent + + def __str__(self): + return self.key + + +class Tree: + def __init__(self): + self.root = None + self.size = 0 + + def _addNode(self, current, value): + if value < current.key: + if current.left != None: + self._addNode(current.left, value) + else: + current.left = Node(value, parent=current) + if value > current.key: + if current.right != None: + self._addNode(current.right, value) + else: + current.right = Node(value, parent=current) + + def addNode(self, value): + if self.root == None: + self.root = Node(value) + else: + self._addNode(self.root, value) + self.size += 1 + + def _search(self, current, value): + if current == None: + print("searched value is not in tree") + return None + if current.key == value: + print("value found") + return current + elif current.key < value: + return self._search(current.right, value) + elif current.key > value: + return self._search(current.left, value) + + def search(self, value): + return self._search(self.root, value) + + def getMin(self, current): + if current == None: + return None + if current.left == None: + return current + else: + return self.getMin(current.left) + + def _deleteNode(self, current, value): + if current == None: + return None + if current.key < value: + current.right = self._deleteNode(current.right, value) + elif current.key > value: + current.left = self._deleteNode(current.left, value) + else: + if current.left == None: + tmp = current.right + del current + return tmp + if current.right == None: + tmp = current.left + del current + return tmp + replacedNode = self.getMin(current.right) + current.key = replacedNode.key + current.right = self._deleteNode(current.right, replacedNode.key) + return current + + def deleteNode(self, value): + self._deleteNode(self.root, value) + + def _prtTree(self, current): + if current == None: + return + print(current.key) + self._prtTree(current.left) + self._prtTree(current.right) + + def prtTree(self): + self._prtTree(self.root) From 1399d714639dc7040f7ca11a9b3867ddf4c42fe7 Mon Sep 17 00:00:00 2001 From: deadem Date: Sat, 14 Oct 2017 18:11:33 +0300 Subject: [PATCH 081/355] Javascript: linear search --- search/linear_search/javascript/linear_search.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 search/linear_search/javascript/linear_search.js diff --git a/search/linear_search/javascript/linear_search.js b/search/linear_search/javascript/linear_search.js new file mode 100644 index 0000000000..64749ed80e --- /dev/null +++ b/search/linear_search/javascript/linear_search.js @@ -0,0 +1,13 @@ +function linearSearch(array, value) { + return array.indexOf(value); +} + +// test +[ + [ [1, 2, 3, 4], 2, 1], + [ [1, 2, 3, 4], 4, 3], + [ [1, 2, 3, 4], 5, -1], + [ [1, 3, 4, 5, 6], 2, -1 ] +].forEach(test => { + console.assert(linearSearch(test[0], test[1]) == test[2]); +}); From 73a0c709db752741409856d5c480fa0765019d31 Mon Sep 17 00:00:00 2001 From: Lucas Eduardo Schlogl Date: Sat, 14 Oct 2017 12:14:36 -0300 Subject: [PATCH 082/355] Add implementation of Knapsack in java --- dp/knapsack_problem/java/Knapsack.java | 56 ++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 dp/knapsack_problem/java/Knapsack.java diff --git a/dp/knapsack_problem/java/Knapsack.java b/dp/knapsack_problem/java/Knapsack.java new file mode 100644 index 0000000000..450026d414 --- /dev/null +++ b/dp/knapsack_problem/java/Knapsack.java @@ -0,0 +1,56 @@ +public class Knapsack { + + public static void main(String[] args) { + // Initialize the algorithm + new Knapsack().begin(); + } + + void begin() { + int values[] = { 20, 5, 10, 40, 15, 25 }; + int weights[] = { 1, 2, 3, 8, 7, 4 }; + + int capacity = 10; + int n = values.length; + + System.out.println(knapSack(values, weights, n, capacity)); + } + + /** 0/1 Knapsack method + *@param values - Values stored in array + *@param weights - Weights stored in array + *@param n - number of distinct items + *@param capacity - Knapsack capacity + *@return max value + */ + + int knapSack(int values[], int weights[], int n, int capacity) { + + // create a new matrix Items are row and weight are column + int K[][] = new int[n + 1][capacity + 1]; + + //initialize tha values of bag items and capacity + for (int i = 0; i < n; i++) { + K[i][0] = 0; + } + + for (int w = 0; w < capacity; w++) { + K[0][w] = 0; + } + + for (int i = 1; i <= n; i++) { + for (int w = 1; w <= capacity; w++) { + if (weights[i - 1] <= w) { + //Find maximum value get by excluding or including the item + K[i][w] = Math.max( + values[i - 1] + K[i - 1][w - weights[i - 1]], //including the item + K[i - 1][w]); // excluding the item + } else { + //If current item weight is more than the running weight, just keep going without the current item + K[i][w] = K[i - 1][w]; + } + } + } + //return the maximum value + return K[n][capacity]; + } +} From 8b9fdebb9ceab69b37558acf59ea3134efa25a65 Mon Sep 17 00:00:00 2001 From: Lucas Eduardo Schlogl Date: Sat, 14 Oct 2017 12:16:00 -0300 Subject: [PATCH 083/355] update indentation --- dp/knapsack_problem/java/Knapsack.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dp/knapsack_problem/java/Knapsack.java b/dp/knapsack_problem/java/Knapsack.java index 450026d414..eda8b74596 100644 --- a/dp/knapsack_problem/java/Knapsack.java +++ b/dp/knapsack_problem/java/Knapsack.java @@ -42,8 +42,9 @@ int knapSack(int values[], int weights[], int n, int capacity) { if (weights[i - 1] <= w) { //Find maximum value get by excluding or including the item K[i][w] = Math.max( - values[i - 1] + K[i - 1][w - weights[i - 1]], //including the item - K[i - 1][w]); // excluding the item + values[i - 1] + K[i - 1][w - weights[i - 1]], //including the item + K[i - 1][w] // excluding the item + ); } else { //If current item weight is more than the running weight, just keep going without the current item K[i][w] = K[i - 1][w]; From 07195b8c77317ac4c182d8ec49d1415dd57ddfb1 Mon Sep 17 00:00:00 2001 From: Lucas Eduardo Schlogl Date: Sat, 14 Oct 2017 12:17:00 -0300 Subject: [PATCH 084/355] update indentation --- dp/knapsack_problem/java/Knapsack.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dp/knapsack_problem/java/Knapsack.java b/dp/knapsack_problem/java/Knapsack.java index eda8b74596..f081ae7aab 100644 --- a/dp/knapsack_problem/java/Knapsack.java +++ b/dp/knapsack_problem/java/Knapsack.java @@ -42,9 +42,9 @@ int knapSack(int values[], int weights[], int n, int capacity) { if (weights[i - 1] <= w) { //Find maximum value get by excluding or including the item K[i][w] = Math.max( - values[i - 1] + K[i - 1][w - weights[i - 1]], //including the item - K[i - 1][w] // excluding the item - ); + values[i - 1] + K[i - 1][w - weights[i - 1]], //including the item + K[i - 1][w] // excluding the item + ); } else { //If current item weight is more than the running weight, just keep going without the current item K[i][w] = K[i - 1][w]; From 213e283cabd21c8dc0458e23e396bd4e557367f3 Mon Sep 17 00:00:00 2001 From: deadem Date: Sat, 14 Oct 2017 18:21:56 +0300 Subject: [PATCH 085/355] JavaScript: sum of digits --- math/sum_of_digits/javascript/sum_of_digits.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 math/sum_of_digits/javascript/sum_of_digits.js diff --git a/math/sum_of_digits/javascript/sum_of_digits.js b/math/sum_of_digits/javascript/sum_of_digits.js new file mode 100644 index 0000000000..96ca7c6b0f --- /dev/null +++ b/math/sum_of_digits/javascript/sum_of_digits.js @@ -0,0 +1,13 @@ +const sumOfDigits = number => String(number).split('').reduce((sum, value) => sum + +value, 0); + +// test +[ + [ 12345, 15 ], + [ '111', 3 ], + [ 111, 3 ], + [ 521, 8 ], + [ '111111111123', 15 ], + [ 817489, 37 ] +].forEach(test => { + console.assert(sumOfDigits(test[0]) == test[1]); +}) From bff3d753ea8f94a8d64ecf7a325c286b307c187c Mon Sep 17 00:00:00 2001 From: deadem Date: Sat, 14 Oct 2017 18:50:00 +0300 Subject: [PATCH 086/355] Javascript: caesar cipher --- .../caesar_cipher/javascript/caesar_cipher.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 cryptography/caesar_cipher/javascript/caesar_cipher.js diff --git a/cryptography/caesar_cipher/javascript/caesar_cipher.js b/cryptography/caesar_cipher/javascript/caesar_cipher.js new file mode 100644 index 0000000000..0558401e6f --- /dev/null +++ b/cryptography/caesar_cipher/javascript/caesar_cipher.js @@ -0,0 +1,18 @@ +const ceaser = (text, shift) => text.replace(/([a-z])|([A-Z])/g, (_, lo, hi) => { + let letter = lo ? 'a'.charCodeAt(0) : 'A'.charCodeAt(0); + return String.fromCharCode(letter + (26 + (lo || hi).charCodeAt(0) - letter + shift % 26) % 26); +}); + + +// test +[ + [ 'Hello', 3, 'Khoor'], + [ 'The quick brown fox jumps over the lazy dog.', 0, 'The quick brown fox jumps over the lazy dog.'], + [ 'The quick brown fox jumps over the lazy dog.', 26, 'The quick brown fox jumps over the lazy dog.'], + [ 'test', 3, 'whvw' ], + [ 'whvw', -3, 'test' ], + [ 'the quick brown fox jumps over the lazy dog', 10, 'dro aesmu lbygx pyh tewzc yfob dro vkji nyq' ], + [ 'dro aesmu lbygx pyh tewzc yfob dro vkji nyq', -10, 'the quick brown fox jumps over the lazy dog' ], +].forEach(test => { + console.assert(ceaser(test[0], test[1]) == test[2]); +}) From 4ac44269e2c084e9398a68aa83a0f843215e3e00 Mon Sep 17 00:00:00 2001 From: Jinsoo Han Date: Sun, 15 Oct 2017 01:13:29 +0900 Subject: [PATCH 087/355] implementation bubble sort in scala #133 --- sort/bubble_sort/scala/BubbleSort.scala | 12 ++++++++++++ sort/bubble_sort/scala/BubbleSortTest.scala | 13 +++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 sort/bubble_sort/scala/BubbleSort.scala create mode 100644 sort/bubble_sort/scala/BubbleSortTest.scala diff --git a/sort/bubble_sort/scala/BubbleSort.scala b/sort/bubble_sort/scala/BubbleSort.scala new file mode 100644 index 0000000000..513df82da9 --- /dev/null +++ b/sort/bubble_sort/scala/BubbleSort.scala @@ -0,0 +1,12 @@ +object BubbleSort { + def sort(list: Array[Int]): Array[Int] = { + for (i <- 0 until list.length - 1; j <- 0 until list.length - 1 - i){ + if (list(j) > list(j + 1)){ + var temp = list(j) + list(j) = list(j + 1) + list(j + 1) = temp + } + } + list + } +} \ No newline at end of file diff --git a/sort/bubble_sort/scala/BubbleSortTest.scala b/sort/bubble_sort/scala/BubbleSortTest.scala new file mode 100644 index 0000000000..9a6d161cdf --- /dev/null +++ b/sort/bubble_sort/scala/BubbleSortTest.scala @@ -0,0 +1,13 @@ +import BubbleSort._ + +object BubbleSortTest { + def main(args: Array[String]) { + val list = Array(5,6,99,1,14,46,19,2) + val result = BubbleSort.sort(list) + + for (i <- result){ + print(i + " ") + } + + } +} \ No newline at end of file From 5866f99e74f6c1824b3e1e3424c671011c111070 Mon Sep 17 00:00:00 2001 From: Jinsoo Han Date: Sun, 15 Oct 2017 01:47:38 +0900 Subject: [PATCH 088/355] implementation of queue in php --- data_structures/Queue/php/queue.php | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 data_structures/Queue/php/queue.php diff --git a/data_structures/Queue/php/queue.php b/data_structures/Queue/php/queue.php new file mode 100644 index 0000000000..3e1e0e7806 --- /dev/null +++ b/data_structures/Queue/php/queue.php @@ -0,0 +1,38 @@ +limit = $limit; + $this->queue = array(); + } + + public function is_empty(){ + return $this->get_size() == 0; + } + + public function is_full(){ + return $this->get_size() >= $this->limit; + } + + public function enqueue($item){ + if ($this->is_full()){ + throw new Exception("Queue is already full"); + } + array_push($this->queue, $item); + } + + public function dequeue(){ + if ($this->is_empty()){ + throw new Exception("Queue is empty"); + } + return array_shift($this->queue); + + } + + public function get_size(){ + return count($this->queue); + } +} \ No newline at end of file From 63169a2d18f150f22f8a5c197502e52a9e87af84 Mon Sep 17 00:00:00 2001 From: Maria Michailidou Date: Sat, 14 Oct 2017 20:24:10 +0300 Subject: [PATCH 089/355] Rename c++sum to c++ --- math/sum_of_digits/{c++sum => c++} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename math/sum_of_digits/{c++sum => c++} (100%) diff --git a/math/sum_of_digits/c++sum b/math/sum_of_digits/c++ similarity index 100% rename from math/sum_of_digits/c++sum rename to math/sum_of_digits/c++ From eb664d2dfade8a643b66ac0fb3d67e8ed9eda792 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:06:25 +0200 Subject: [PATCH 090/355] Fix atbash cipher dir, add readme --- cryptography/Atbash Cipher/README.md | 5 +++++ .../{Atbash_Cipher.cpp.cpp => c++/Atbash_Cipher.cpp} | 0 2 files changed, 5 insertions(+) create mode 100644 cryptography/Atbash Cipher/README.md rename cryptography/Atbash Cipher/{Atbash_Cipher.cpp.cpp => c++/Atbash_Cipher.cpp} (100%) diff --git a/cryptography/Atbash Cipher/README.md b/cryptography/Atbash Cipher/README.md new file mode 100644 index 0000000000..4f16da048d --- /dev/null +++ b/cryptography/Atbash Cipher/README.md @@ -0,0 +1,5 @@ +# Atbash cipher +The Atbash cipher is a substitution cipher with a specific key where the letters of the alphabet are reversed. I.e. all 'A's are replaced with 'Z's, all 'B's are replaced with 'Y's, and so on. It was originally used for the Hebrew alphabet, but can be used for any alphabet. + +#### A graphical example of Atbash cipher +![](http://1.bp.blogspot.com/-C_-yAJgJp90/Tar1uu0bk1I/AAAAAAAAAKU/HBeG_6MeEIM/s1600/atoz.jpg) diff --git a/cryptography/Atbash Cipher/Atbash_Cipher.cpp.cpp b/cryptography/Atbash Cipher/c++/Atbash_Cipher.cpp similarity index 100% rename from cryptography/Atbash Cipher/Atbash_Cipher.cpp.cpp rename to cryptography/Atbash Cipher/c++/Atbash_Cipher.cpp From f80b4df12d9ab658e79c96788be3c5ad85086b07 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:10:22 +0200 Subject: [PATCH 091/355] Fix Rail Fence cipher dir, add README --- cryptography/Rail Fence Cipher/README.md | 5 +++++ .../Rail Fence Cipher/{ => c++}/Rail_Fence Cipher.cpp | 0 2 files changed, 5 insertions(+) create mode 100644 cryptography/Rail Fence Cipher/README.md rename cryptography/Rail Fence Cipher/{ => c++}/Rail_Fence Cipher.cpp (100%) diff --git a/cryptography/Rail Fence Cipher/README.md b/cryptography/Rail Fence Cipher/README.md new file mode 100644 index 0000000000..a7e1d753c2 --- /dev/null +++ b/cryptography/Rail Fence Cipher/README.md @@ -0,0 +1,5 @@ +# Rail Fence Cipher +The railfence cipher is an easy to apply transposition cipher that jumbles up the order of the letters of a message in a quick convenient way. It also has the security of a key to make it a little bit harder to break. +The Rail Fence cipher works by writing your message on alternate lines across the page, and then reading off each line in turn. For example, the plaintext "defend the east wall" is written as shown below, with all spaces removed. + +![](http://crypto.interactive-maths.com/uploads/1/1/3/4/11345755/3139303.jpg?410) \ No newline at end of file diff --git a/cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp b/cryptography/Rail Fence Cipher/c++/Rail_Fence Cipher.cpp similarity index 100% rename from cryptography/Rail Fence Cipher/Rail_Fence Cipher.cpp rename to cryptography/Rail Fence Cipher/c++/Rail_Fence Cipher.cpp From 30d4d68e4bfee04ca0619c043005b911aa6faefb Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:12:03 +0200 Subject: [PATCH 092/355] Update README.md --- cryptography/chinese_cipher/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cryptography/chinese_cipher/README.md b/cryptography/chinese_cipher/README.md index cb77a44dbe..c3d7026af9 100644 --- a/cryptography/chinese_cipher/README.md +++ b/cryptography/chinese_cipher/README.md @@ -1,3 +1,4 @@ +# Chinese cipher from: https://en.wikipedia.org/wiki/Classical_cipher#Transposition_ciphers In the Chinese cipher's method of transposing, the letters of the message are written from right to left, down and up columns to scramble the letters. Then, starting in the first row, the letters are taken in order to get the new ciphertext. For example, if the message needed to be enciphered was THE DOG RAN FAR, the Chinese cipher would look like this: From 8ce0cf0290c1814e4ab31649928c8ede99d8e14f Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:15:44 +0200 Subject: [PATCH 093/355] Add README for hill cipher --- cryptography/hillcipher/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cryptography/hillcipher/README.md diff --git a/cryptography/hillcipher/README.md b/cryptography/hillcipher/README.md new file mode 100644 index 0000000000..56c765e3b2 --- /dev/null +++ b/cryptography/hillcipher/README.md @@ -0,0 +1,4 @@ +# Hill cipher +In classical cryptography, the Hill cipher is a polygraphic substitution cipher based on linear algebra. Invented by Lester S. Hill in 1929, it was the first polygraphic cipher in which it was practical (though barely) to operate on more than three symbols at once. The following discussion assumes an elementary knowledge of matrices. +Each letter is represented by a number modulo 26. Often the simple scheme A = 0, B = 1, ..., Z = 25 is used, but this is not an essential feature of the cipher. To encrypt a message, each block of n letters (considered as an n-component vector) is multiplied by an invertible n × n matrix, against modulus 26. To decrypt the message, each block is multiplied by the inverse of the matrix used for encryption. +The matrix used for encryption is the cipher key, and it should be chosen randomly from the set of invertible n × n matrices (modulo 26). The cipher can, of course, be adapted to an alphabet with any number of letters; all arithmetic just needs to be done modulo the number of letters instead of modulo 26. From b803d2d29f03ce6714907858bd4cb1c898397267 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:17:46 +0200 Subject: [PATCH 094/355] Update README.md --- cryptography/vernam_cipher/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cryptography/vernam_cipher/README.md b/cryptography/vernam_cipher/README.md index f432c307c7..d616a06691 100644 --- a/cryptography/vernam_cipher/README.md +++ b/cryptography/vernam_cipher/README.md @@ -1,3 +1,6 @@ ### Vernam cipher -The Vernam Cipher is based on the principle that each plaintext character from a message is 'mixed' with one character from a key stream. If a truely random key stream is used, the result will be a truely 'random' ciphertext which bears no relation to the original plaintext. \ No newline at end of file +The Vernam Cipher is based on the principle that each plaintext character from a message is 'mixed' with one character from a key stream. If a truely random key stream is used, the result will be a truely 'random' ciphertext which bears no relation to the original plaintext. + +#### A graphical example of vernam cipher +![](https://image.slidesharecdn.com/crypto101-111204144031-phpapp02/95/cryptography-101-11-728.jpg?cb=1323013923) From 9d0bface5047c8331174c20bbb88e7d3e35c9f37 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:20:07 +0200 Subject: [PATCH 095/355] Rename Hash Tables.md to README.md --- data_structures/hash_table/{Hash Tables.md => README.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename data_structures/hash_table/{Hash Tables.md => README.md} (98%) diff --git a/data_structures/hash_table/Hash Tables.md b/data_structures/hash_table/README.md similarity index 98% rename from data_structures/hash_table/Hash Tables.md rename to data_structures/hash_table/README.md index 5dc60fb923..889437c2af 100644 --- a/data_structures/hash_table/Hash Tables.md +++ b/data_structures/hash_table/README.md @@ -31,4 +31,4 @@ If either of these properties become false, rehashing the table is a good idea t 3. create a new table of that size 4. re-add all the elements from the temporary table -Specifically, step 4 is a slow process (linear time, but slow for something we may do often), and that is why we want to avoid rehashing. In order to be able to track when a table should rehash, a load variable is used to track how full the table is, and a MAX_LOAD is defined (usually 0.5) to indicate when a table should rehash. Every time a value is added to the table, the load is increased and the need for rehashing is evaluated. \ No newline at end of file +Specifically, step 4 is a slow process (linear time, but slow for something we may do often), and that is why we want to avoid rehashing. In order to be able to track when a table should rehash, a load variable is used to track how full the table is, and a MAX_LOAD is defined (usually 0.5) to indicate when a table should rehash. Every time a value is added to the table, the load is increased and the need for rehashing is evaluated. From df657bd5962ee8731ac9a78bb1335db834d90bd6 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:23:53 +0200 Subject: [PATCH 096/355] Fix rabin karp docs --- string_search/rabin_karp/{golang => }/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename string_search/rabin_karp/{golang => }/README.md (100%) diff --git a/string_search/rabin_karp/golang/README.md b/string_search/rabin_karp/README.md similarity index 100% rename from string_search/rabin_karp/golang/README.md rename to string_search/rabin_karp/README.md From e3d567c20b9a239422b9a30b827bc1d5505bf987 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:24:04 +0200 Subject: [PATCH 097/355] Fix knuth morris docs --- string_search/knuth_morris_pratt/{golang => }/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename string_search/knuth_morris_pratt/{golang => }/README.md (100%) diff --git a/string_search/knuth_morris_pratt/golang/README.md b/string_search/knuth_morris_pratt/README.md similarity index 100% rename from string_search/knuth_morris_pratt/golang/README.md rename to string_search/knuth_morris_pratt/README.md From 90109a0ecfe8c1f96061c3e4d7f115d9817ab528 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:26:46 +0200 Subject: [PATCH 098/355] Delete .DS_Store --- math/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 math/.DS_Store diff --git a/math/.DS_Store b/math/.DS_Store deleted file mode 100644 index cc0b0687e3e785571cef4a276fe0add2b6d8ee4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T0$TCWx4WV2^w8) zvp+4BR*za_24=t6-I@LQHtc2qfHnJ31Hb_Q3sqvt#$t}heyKB3GA$KErp6G^gBSux z!oiF;H7p_n^6YHr;+eG}hpF?+?!!cc*!v#dCvle7>mRICt}HFDShj81YxbpoD+YcZ zSPlQM&b`YM%oxzo}aUjw>h|^AQ%KhRjP9rgBihdepYMkRBzr|QJ z(Unsj4qbPr#$C5Ds`268UcJV*-QCg1wl=pK`$yMzk59wr(aWpmm*J#8j-$*5B%UnXnaD$$~LL>H|Fdd4hLzzi2m=4EwZu~rhg+?6? z%p@Po%*;%N!qn_IK3DF*JdIQm1H`~r2FkkX$oK#7`~3fF5Y>nQV&Gpfz$z`j)x<5C zw{>Q7@~!2l*QipYU!idlf`)pE(N{jjRa7O|&ZU9q87wqn3kv-RC>p3B27Z-+PaLLU AumAu6 From 4c83edb40c6c5eb120a8623ba1f31b4fea69ee80 Mon Sep 17 00:00:00 2001 From: Zoran Pandovski Date: Sat, 14 Oct 2017 20:27:29 +0200 Subject: [PATCH 099/355] Rename Perfect Numbers.md to README.md --- math/perfect_number/{Perfect Numbers.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename math/perfect_number/{Perfect Numbers.md => README.md} (100%) diff --git a/math/perfect_number/Perfect Numbers.md b/math/perfect_number/README.md similarity index 100% rename from math/perfect_number/Perfect Numbers.md rename to math/perfect_number/README.md From 43304b4e988b10fa36d54c46189564b8c565a700 Mon Sep 17 00:00:00 2001 From: MohamedMashaal Date: Sat, 14 Oct 2017 20:33:09 +0200 Subject: [PATCH 100/355] Adding SegmentTree in java --- .../segment_tree/Java/SegmentTree.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 data_structures/segment_tree/Java/SegmentTree.java diff --git a/data_structures/segment_tree/Java/SegmentTree.java b/data_structures/segment_tree/Java/SegmentTree.java new file mode 100644 index 0000000000..518e77ccc1 --- /dev/null +++ b/data_structures/segment_tree/Java/SegmentTree.java @@ -0,0 +1,52 @@ +public class SegmentTree { + private int [] st; + private Integer [] A ; + private int n ; + + public SegmentTree(Integer [] A) { + this.A = A ; + n = A.length; + st = new int [4*n]; + build(1,0,n-1); + } + + public int rmq(int i , int j) { + return rmq(1,0,n-1,i,j); + } + + private int left(int p) { + return p << 1 ; + } + private int right(int p) { + return (p << 1)+1 ; + } + private void build(int p, int L, int R) { + if(L == R) + st[p] = L ; + else { + build(left(p) ,L , (L+R)/2); + build(right(p) ,(L+R)/2 +1 , R); + int p1 = st[left(p)] , p2 = st[right(p)]; + st[p] = (A[p1] <= A[p2]) ? p1 : p2 ; + } + } + + private int rmq(int p , int L , int R , int i , int j ) { + if(i > R || j < L) return -1 ; + if(L >= i && R <= j) return st[p]; + + int p1 = rmq(left(p) , L , (L+R)/2 ,i , j); + int p2 = rmq(right(p) , (L+R)/2 + 1 , R , i , j); + + if (p1 == -1) return p2 ; + if (p2 == -1) return p1 ; + return (A[p1] <= A[p2]) ? p1 : p2 ; + } + + public static void main(String [] args) { + Integer [] A = {18,17,13,19,15,11,20}; + SegmentTree tree = new SegmentTree(A); + System.out.println(tree.rmq(1, 3)); + System.out.println(tree.rmq(4, 6)); + } +} \ No newline at end of file From 15a5c168cfeda7d940b7a5e0ddf143f5b2803412 Mon Sep 17 00:00:00 2001 From: LodiAleardo Date: Sat, 14 Oct 2017 21:26:10 +0200 Subject: [PATCH 101/355] Update mergesort.c --- sort/merge_sort/c/mergesort.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sort/merge_sort/c/mergesort.c b/sort/merge_sort/c/mergesort.c index 9e40bf3748..5859206274 100644 --- a/sort/merge_sort/c/mergesort.c +++ b/sort/merge_sort/c/mergesort.c @@ -77,12 +77,15 @@ void printArray(int A[], int size) int main() { + //Create array int arr[] = {12, 11, 13, 5, 6, 7}; int arr_size = sizeof(arr)/sizeof(arr[0]); + //Print stats and the array printf("Given array is \n"); printArray(arr, arr_size); + //Start merging array mergeSort(arr, 0, arr_size - 1); printf("\nSorted array is \n"); From 3fb34d20df7513a38ad00a891e7b28c137325e62 Mon Sep 17 00:00:00 2001 From: Abinash Date: Sun, 15 Oct 2017 01:00:36 +0530 Subject: [PATCH 102/355] added bucket_sort in python --- sort/python_bucket_sort/python/bucketsort.py | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 sort/python_bucket_sort/python/bucketsort.py diff --git a/sort/python_bucket_sort/python/bucketsort.py b/sort/python_bucket_sort/python/bucketsort.py new file mode 100644 index 0000000000..97e943f691 --- /dev/null +++ b/sort/python_bucket_sort/python/bucketsort.py @@ -0,0 +1,31 @@ +def sort(ar,f): + for j in range (1,f): + k = j-1 + key = ar[j] + while k >= 0 and key < ar[k]: + ar[k+1] = ar[k] + k -= 1 + ar[k+1] = key + return ar + +def bucketsort(n1,n2,b,n,bucket): + for i in range (len(n)): + j = int((n[i]-n1)/R) + bucket[j].append(n[i]) + for i in range (b): + f = len(bucket[i]) + bucket[i] = sort(bucket[i],f) + ar = [] + for i in range (b): + ar.extend(bucket[i]) + return ar + +n1,n2,b = input().strip().split(' ') +n1,n2,b = [int(n1) , int(n2) , int(b)] +n = list(map(int, input().strip().split(' '))) +R = (n2-n1)/b +bucket = [[] for i in range (b)] +result = bucketsort(n1,n2,b,n,bucket) +print (result) + + From 98a043a4b0154bc2587566e1beadb92622f845e4 Mon Sep 17 00:00:00 2001 From: Kriti Garg Date: Sun, 15 Oct 2017 01:01:54 +0530 Subject: [PATCH 103/355] Added mergesort implementation --- sort/merge_sort/c++/mergesort2.cpp | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 sort/merge_sort/c++/mergesort2.cpp diff --git a/sort/merge_sort/c++/mergesort2.cpp b/sort/merge_sort/c++/mergesort2.cpp new file mode 100644 index 0000000000..79f8d26904 --- /dev/null +++ b/sort/merge_sort/c++/mergesort2.cpp @@ -0,0 +1,65 @@ +/* Kunal Garg + IIIT Hyderabad */ +#include +#include +#include +#include +#include +int arr[1111111]; +int temp[1111111]; +int n; +using namespace std; + +void merge(int l,int m,int r) +{ + int mid = m+1; + int k=1; + int safe = l; + while(l<=m && mid<=r) + { + if(arr[l] <= arr[mid]) + temp[k++] = arr[l++]; + else + temp[k++] = arr[mid++]; + } + while(l<=m) + temp[k++] = arr[l++]; + while(mid <=r) + temp[k++] = arr[mid++]; + for(int i=1;i>1; + merge_sort(l,m); + merge_sort(m+1,r); + merge(l,m,r); + return; + } + return; +} + +int main() +{ + + int pos=1; + int x; + int m; + cin >> m; + for(int i=1;i<=m;i++) + cin >> arr[i]; + merge_sort(1,m); + for(int i=1;i<=m;i++) + printf("%d ",arr[i]); + printf("\n"); +} + + + + + From 1f1598ebc21f01a69f1f95b265207ada70e9e75b Mon Sep 17 00:00:00 2001 From: Kriti Garg Date: Sun, 15 Oct 2017 01:11:09 +0530 Subject: [PATCH 104/355] Added activity selection prob https://github.com/ZoranPandovski/al-go-rithms/issues/271 --- greedy/activity_selection_problem/README.md | 12 ++++ .../c++/activity.cpp | 64 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 greedy/activity_selection_problem/README.md create mode 100644 greedy/activity_selection_problem/c++/activity.cpp diff --git a/greedy/activity_selection_problem/README.md b/greedy/activity_selection_problem/README.md new file mode 100644 index 0000000000..38110d886f --- /dev/null +++ b/greedy/activity_selection_problem/README.md @@ -0,0 +1,12 @@ +### Problem +A list of N activities is given ( each having its own start time (Si) and finish time (Fi) ). Two activities with start times Si, Sj and +finish times Fi, Fj respectively are said to be non conflicting if Si > Fj or Sj > Fi. Find the maximum number of activities which we can +schedule so that there are no conflicting activities among those scheduled. + +### Solution +The greedy choice is to always pick the next activity whose finish time is least among the remaining activities and the start time is more than or equal to the finish time of previously selected activity. We can sort the activities according to their finishing time so that we always consider the next activity as minimum finishing time activity. + +1) Sort the activities according to their finishing time +2) Select the first activity from the sorted array and print it. +3) For remaining activities in the sorted array. + --If the start time of this activity is greater than or equal to the finish time of previously selected activity then select this activity and print it. diff --git a/greedy/activity_selection_problem/c++/activity.cpp b/greedy/activity_selection_problem/c++/activity.cpp new file mode 100644 index 0000000000..b4e9d4e801 --- /dev/null +++ b/greedy/activity_selection_problem/c++/activity.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +#define lli long long int +#define mp make_pair +#define f first +#define s second +#define sc(n) scanf("%d",&n); +#define scl(n) scanf("%lld",&n); +#define pr(n) printf("%d",n); +#define prl(n) printf("%lld",n); +#define nl printf("\n"); +#define all(c) (c).begin(), (c).end() +#define sz(a) int((a).size()) +#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++) +void optimizeIO() +{ + ios_base:: sync_with_stdio(false); + cin.tie(NULL); +} +bool sortinasc(const pair &a, const pair &b) +{ + return (a.s < b.s); +} + +vector >arr; +int main() +{ + int n; + cin >> n; + int t=n; + while(t--) + { + int u,v; + cin >> u >> v; + arr.push_back(mp(u,v)); + } + + sort(arr.begin(),arr.end(),sortinasc); +// tr(arr,it) +// cout << it->first << " " << it->second << endl; + int cnt = 1; + int j=0; + for(int i=1;i= arr[j].s) + { + cnt ++; + j = i; + } + + cout << cnt; + nl; +} From efc0fd05243bb88dfe25117901dd6a5a804ea442 Mon Sep 17 00:00:00 2001 From: Kushagra Nagori Date: Sun, 15 Oct 2017 01:12:07 +0530 Subject: [PATCH 105/355] adding java implementation of counting_sort --- sort/counting_sort/java/countingSort.java | 61 +++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 sort/counting_sort/java/countingSort.java diff --git a/sort/counting_sort/java/countingSort.java b/sort/counting_sort/java/countingSort.java new file mode 100644 index 0000000000..ec268487a1 --- /dev/null +++ b/sort/counting_sort/java/countingSort.java @@ -0,0 +1,61 @@ +import java.util.*; + +public class CountingSort{ + + public static int[] sort(int[] array) { + + // array to be sorted in, this array is necessary + // when we sort object datatypes, if we don't, + // we can sort directly into the input array + int[] aux = new int[array.length]; + + // find the smallest and the largest value + int min = array[0]; + int max = array[0]; + for (int i = 1; i < array.length; i++) { + if (array[i] < min) { + min = array[i]; + } else if (array[i] > max) { + max = array[i]; + } + } + + // init array of frequencies + int[] counts = new int[max - min + 1]; + + // init the frequencies + for (int i = 0; i < array.length; i++) { + counts[array[i] - min]++; + } + + // recalculate the array - create the array of occurences + counts[0]--; + for (int i = 1; i < counts.length; i++) { + counts[i] = counts[i] + counts[i-1]; + } + + /* + Sort the array right to the left + 1) Look up in the array of occurences the last occurence of the given value + 2) Place it into the sorted array + 3) Decrement the index of the last occurence of the given value + 4) Continue with the previous value of the input array (goto set1), + terminate if all values were already sorted + */ + for (int i = array.length - 1; i >= 0; i--) { + aux[counts[array[i] - min]--] = array[i]; + } + + return aux; + } + + public static void main(String[] args) { + + int [] unsorted = {5,3,0,2,4,1,0,5,2,3,1,4}; + System.out.println("Before: " + Arrays.toString(unsorted)); + + int [] sorted = sort(unsorted); + System.out.println("After: " + Arrays.toString(sorted)); + + } +} From e9273315b3b8550ecc225672175a71f68c9ea787 Mon Sep 17 00:00:00 2001 From: Kushagra Nagori Date: Sun, 15 Oct 2017 01:22:56 +0530 Subject: [PATCH 106/355] adding java implementation --- greedy/prim's_algorithm/java/prim.java | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 greedy/prim's_algorithm/java/prim.java diff --git a/greedy/prim's_algorithm/java/prim.java b/greedy/prim's_algorithm/java/prim.java new file mode 100644 index 0000000000..dafb815149 --- /dev/null +++ b/greedy/prim's_algorithm/java/prim.java @@ -0,0 +1,41 @@ + public class Prim { + + // Prim-Jarník's algorithm to find MST rooted at s + public static int [] prim (WeightedGraph G, int s) { + final int [] dist = new int [G.size()]; // shortest known distance to MST + final int [] pred = new int [G.size()]; // preceeding node in tree + final boolean [] visited = new boolean [G.size()]; // all false initially + + for (int i=0; i d) { + dist[v] = d; + pred[v] = next; + } + } + } + return pred; // (ignore pred[s]==0!) + } + + private static int minVertex (int [] dist, boolean [] v) { + int x = Integer.MAX_VALUE; + int y = -1; // graph not connected, or no unvisited vertices + for (int i=0; i Date: Sun, 15 Oct 2017 01:44:57 +0530 Subject: [PATCH 107/355] kruskal java --- greedy/kruskal's_algorithm/java/kruskal.java | 366 +++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 greedy/kruskal's_algorithm/java/kruskal.java diff --git a/greedy/kruskal's_algorithm/java/kruskal.java b/greedy/kruskal's_algorithm/java/kruskal.java new file mode 100644 index 0000000000..cfa09425d1 --- /dev/null +++ b/greedy/kruskal's_algorithm/java/kruskal.java @@ -0,0 +1,366 @@ +import java.util.*; + +@SuppressWarnings("unchecked") + +/* + * This program runs an empirical test of Kruskal's minimum spanning + * tree algorithm, making use of an efficient disjoint-set data + * structure. + * + * The program generates two random, complete graphs G_1 = (V_1, E_1) and + * G_2 = (V_2, E_2) each consisting of n vertices and n-choose-2 edges. + * G_1 is a graph whose edges E_1 are of random weight in the range [0, 1]. + * G_2 is a graph whose vertices V_2 are labeled with random coordinates in + * the unit square, and E_2 consists of edges whose weights are the + * Euclidean distances between any two vertices in V_2. + * + * The program generates these graphs and runs Kruskal's minimum spanning + * tree algorithm on them, printing the total weight of the tree for each + * test. + * + * The program should be invoked from the command line with two integers: + * the seed that should be used for the random number generator, and the + * number of vertices in the randomly generated graphs. + */ +public class Kruskal { + public static void main(String[] args) { + /* Take program arguments */ + int seed, n; + + try { + seed = Integer.parseInt(args[0]); + n = Integer.parseInt(args[1]); + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println("Usage: java Kruskal "); + return; + } + + int ne = (n * (n - 1)) / 2; // Number of edges in a complete graph + + /* Run the tests for size n */ + float test1 = randomEdgeWeightTest(seed, n, ne); + float test2 = randomVertexDistanceTest(seed, n, ne); + + System.out.printf("Test results for size %d:\n", n); + System.out.printf("\trandom edge weight test: %f\n", test1); + System.out.printf("\trandom vertex distance test: %f\n", test2); + } + + + /* + * Generates edges of a complete graph where each edge has a random + * weight in [0, 1] and returns the total weight of its minimum spanning + * tree using Kruskal's algorithm. + */ + public static float randomEdgeWeightTest(int seed, int n, int ne) { + /* Initialize random number generator */ + Random r = new Random(seed); + + /* Create a list of vertices */ + ArrayList vertices = new ArrayList(n); + + /* Create a list of edges */ + ArrayList edges = new ArrayList(ne); + + for (int i = 0; i < n; i++) + vertices.add(new Vertex(0, 0)); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (i == j) continue; + edges.add(new Edge(vertices.get(i), vertices.get(j), r.nextFloat())); + } + } + + /* Create the disjoint-set data structure */ + DisjointSet d = new DisjointSet(vertices); + + /* Create a list of edges */ + ArrayList tree = new ArrayList(); + + /* Java's modified version of mergesort guarantees nlog(n) time here */ + Collections.sort(edges); + + /* Kruskal's algorithm */ + for (Edge e : edges) { + Vertex u = e.getU(); + Vertex v = e.getV(); + if (d.find(u.getNode()) != d.find(v.getNode())) { + /* Vertices v and u are not in the same component */ + tree.add(e); + + /* Union them in the tree */ + d.union(u.getNode(), v.getNode()); + } + } + + /* Return the sum of the weights of all edges in the tree */ + return Edge.sum(tree); + } + + + /* + * Generates vertices containing random coordinates inside the unit + * square and calculates the weights of each edge (u, v) as the Euclidean + * distance between the vertices u and v, and returns the total weight of the + * graph's minimum spanning tree using Kruskal's algorithm. + */ + public static float randomVertexDistanceTest(int seed, int n, int ne) { + /* Initialize random number generator */ + Random r = new Random(seed); + + /* Create a list of vertices */ + ArrayList vertices = new ArrayList(n); + + /* Create a list of edges */ + ArrayList edges = new ArrayList(ne); + + /* Generate vertices with random x and y coordinates */ + for (int i = 0; i < n; i++) + vertices.add(new Vertex(r.nextFloat(), r.nextFloat())); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (i == j) continue; + Vertex a = vertices.get(i); + Vertex b = vertices.get(j); + + /* + * Use a simplified distance formula to calculate the distance + * between vertices a and b + */ + Edge e = new Edge(a, b, Vertex.simpleDistance(a, b)); + edges.add(e); + } + } + + /* Create the disjoint-set data structure */ + DisjointSet d = new DisjointSet(vertices); + + /* Create a list of edges */ + ArrayList tree = new ArrayList(); + + /* Java's modified version of mergesort guarantees nlog(n) time here */ + Collections.sort(edges); + + /* Kruskal's algorithm */ + for (Edge e : edges) { + Vertex u = e.getU(); + Vertex v = e.getV(); + if (d.find(u.getNode()) != d.find(v.getNode())) { + /* Vertices v and u are not in the same component */ + tree.add(e); + + /* Union them in the tree */ + d.union(u.getNode(), v.getNode()); + } + } + + + /* + * Before summing, complete the final vertex distance calculation; we + * achieve a slight speed-up here because there will be strictly less + * than nC2 edges in the minimum spanning tree. + */ + float sum = 0; + + for (Edge e : tree) { + sum += Math.sqrt(e.getWeight()); + } + + /* Now return the sum */ + return sum; + } +} + + +/* + * Class representing a single vertex, holding a pointer to a node in + * the disjoint-set data structure. Also contains facilities for calculating + * simple and Euclidean distances. + */ +class Vertex { + private float x; + private float y; + private Node n; + + public Vertex(float x, float y) { + this.x = x; + this.y = y; + } + + public void setNode(Node n) { this.n = n; } + public Node getNode() { return this.n; } + + public static float simpleDistance(Vertex a, Vertex b) { + return (float) (Math.pow((b.y - a.y), 2) + Math.pow((b.x - a.x), 2)); + } + + public static float euclideanDistance(Vertex a, Vertex b) { + return (float) Math.sqrt(Vertex.simpleDistance(a, b)); + } +} + + +/* + * Class representing a single edge, holding pointers to the vertices + * it connects. Also includes facilities for calculating sums of edge + * weights. + */ +class Edge implements Comparable { + private float weight; + private Vertex u, v; + + public Edge(Vertex u, Vertex v) { + this.u = u; + this.v = v; + } + + public Edge(Vertex u, Vertex v, float w) { + this(u, v); + this.weight = w; + } + + public float getWeight() { return this.weight; } + public void setWeight(float w) { this.weight = w; } + public Vertex getU() { return this.u; } + public Vertex getV() { return this.v; } + + public int compareTo(Object o) { + Edge other = (Edge) o; + + if (this.getWeight() < other.getWeight()) + return -1; + else if (this.getWeight() > other.getWeight()) + return 1; + else + return 0; + } + + public static float sum(List edges) { + float sum = 0; + + for (Edge e : edges) { + sum += e.getWeight(); + } + + return sum; + } +} + + +/* + * Implementation of a node, to be used with the DisjointSet tree + * structure. + */ +class Node { + int rank; // the approximate count of nodes below this node + int index; // a unique index for each node in the tree + Node parent; + + public Node(int r, int i, Node p) { + this.rank = r; + this.index = i; + this.parent = p; + } +} + + +/* + * A simple implementation of the disjoint-set data structure. + * Elements of disjoint sets are represented in a tree, in + * which each node references its parent. + * A "union by rank" strategy is used to optimize the combination + * of two trees, making sure to always attach a smaller tree to the + * root of the larger tree. + */ +class DisjointSet { + private int nodeCount = 0; + private int setCount = 0; + + ArrayList rootNodes; + + /* + * Returns the index of the set that n is currently in. + * The index of the root node of each set uniquely identifies the set. + * This is used to determine whether two elements are in the + * same set. + */ + public int find(Node n) { + Node current = n; + + /* Ride the pointer up to the root node */ + while (current.parent != null) + current = current.parent; + + Node root = current; + + /* + * Ride the pointer up to the root node again, but make each node below + * a direct child of the root. This alters the tree such that future + * calls will reach the root more quickly. + */ + current = n; + while (current != root) { + Node temp = current.parent; + current.parent = root; + current = temp; + } + + return root.index; + } + + + /* + * Combines the sets containing nodes i and j. + */ + public void union(Node i, Node j) { + int indexI = find(i); + int indexJ = find(j); + + /* Are these nodes already part of the same set? */ + if (indexI == indexJ) return; + + /* Get the root nodes of each set (this will run in constant time) */ + Node a = this.rootNodes.get(indexI); + Node b = this.rootNodes.get(indexJ); + + /* Attach the smaller tree to the root of the larger tree */ + if (a.rank < b.rank) { + a.parent = b; + } else if (a.rank > b.rank) { + b.parent = a; + } else { + b.parent = a; + a.rank++; + } + + this.setCount--; + } + + + /* + * Takes a list of n vertices and creates n disjoint singleton sets. + */ + public void makeSets(List vertices) { + for (Vertex v : vertices) + makeSet(v); + } + + + /* + * Creates a singleton set containing one vertex. + */ + public void makeSet(Vertex vertex) { + Node n = new Node(0, rootNodes.size(), null); + vertex.setNode(n); + this.rootNodes.add(n); + this.setCount++; + this.nodeCount++; + } + + + public DisjointSet(List vertices) { + this.rootNodes = new ArrayList(vertices.size()); + makeSets(vertices); +} From e411952a1da6df57f6df1b49407a4d38684ef360 Mon Sep 17 00:00:00 2001 From: kushagra Date: Sat, 14 Oct 2017 20:24:32 +0000 Subject: [PATCH 108/355] Rename kruskal.java to kruskals_algorithm.java --- .../java/{kruskal.java => kruskals_algorithm.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename greedy/kruskal's_algorithm/java/{kruskal.java => kruskals_algorithm.java} (100%) diff --git a/greedy/kruskal's_algorithm/java/kruskal.java b/greedy/kruskal's_algorithm/java/kruskals_algorithm.java similarity index 100% rename from greedy/kruskal's_algorithm/java/kruskal.java rename to greedy/kruskal's_algorithm/java/kruskals_algorithm.java From 88e36723468a4a106dd15c153af5c7ce01867392 Mon Sep 17 00:00:00 2001 From: kushagra Date: Sat, 14 Oct 2017 20:27:18 +0000 Subject: [PATCH 109/355] Rename prim.java to prims_algorithm.java --- greedy/prim's_algorithm/java/{prim.java => prims_algorithm.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename greedy/prim's_algorithm/java/{prim.java => prims_algorithm.java} (100%) diff --git a/greedy/prim's_algorithm/java/prim.java b/greedy/prim's_algorithm/java/prims_algorithm.java similarity index 100% rename from greedy/prim's_algorithm/java/prim.java rename to greedy/prim's_algorithm/java/prims_algorithm.java From e29603fc5b448b600ad31c3156038da9751837bc Mon Sep 17 00:00:00 2001 From: kushagra Date: Sat, 14 Oct 2017 20:30:16 +0000 Subject: [PATCH 110/355] Rename countingSort.java to Counting_sort.java --- sort/counting_sort/java/{countingSort.java => Counting_sort.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sort/counting_sort/java/{countingSort.java => Counting_sort.java} (100%) diff --git a/sort/counting_sort/java/countingSort.java b/sort/counting_sort/java/Counting_sort.java similarity index 100% rename from sort/counting_sort/java/countingSort.java rename to sort/counting_sort/java/Counting_sort.java From 2ebd5bfdcbb94de44f21f9d41291bc87c166f589 Mon Sep 17 00:00:00 2001 From: kushagra Date: Sat, 14 Oct 2017 20:31:35 +0000 Subject: [PATCH 111/355] Rename countingSort.java to Counting_sort.java --- sort/counting_sort/java/{countingSort.java => Counting_sort.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sort/counting_sort/java/{countingSort.java => Counting_sort.java} (100%) diff --git a/sort/counting_sort/java/countingSort.java b/sort/counting_sort/java/Counting_sort.java similarity index 100% rename from sort/counting_sort/java/countingSort.java rename to sort/counting_sort/java/Counting_sort.java From 2f7c1e36756a78d81dbf3933ac73b37aab28ab89 Mon Sep 17 00:00:00 2001 From: Berry Seme Date: Sat, 14 Oct 2017 13:38:18 -0700 Subject: [PATCH 112/355] insertion sort in ruby --- sort/insertion_sort/ruby/insertion_sort.rb | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 sort/insertion_sort/ruby/insertion_sort.rb diff --git a/sort/insertion_sort/ruby/insertion_sort.rb b/sort/insertion_sort/ruby/insertion_sort.rb new file mode 100644 index 0000000000..89c9e0c43d --- /dev/null +++ b/sort/insertion_sort/ruby/insertion_sort.rb @@ -0,0 +1,23 @@ + +def insertion_sort(array) + final = [array[0]] + array.delete_at(0) + # main code + for i in array + final_index = 0 + while final_index < final.length + if i <= final[final_index] + final.insert(final_index,i) + break + elsif final_index == final.length-1 + final.insert(final_index+1,i) + break + end + final_index+=1 + end + end + # output + final +end +array = [1, 5, 3, 4, 6, 3, 7, 2] +puts insertion_sort(array) From a9abc4b4a0791d5a52bb8e665efaf6a6e3587967 Mon Sep 17 00:00:00 2001 From: Berry Seme Date: Sat, 14 Oct 2017 13:46:05 -0700 Subject: [PATCH 113/355] merge sort in ruby --- sort/merge_sort/ruby/merge_sort.rb | 47 ++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 sort/merge_sort/ruby/merge_sort.rb diff --git a/sort/merge_sort/ruby/merge_sort.rb b/sort/merge_sort/ruby/merge_sort.rb new file mode 100644 index 0000000000..dc655bb5f5 --- /dev/null +++ b/sort/merge_sort/ruby/merge_sort.rb @@ -0,0 +1,47 @@ +def merge_sort(array) + if array.count <= 1 + # Array of length 1 or less is always sorted + return array + end + + # Apply "Divide & Conquer" strategy + + # 1. Divide + mid = array.count / 2 + part_a = merge_sort array.slice(0, mid) + part_b = merge_sort array.slice(mid, array.count - mid) + + # 2. Conquer + array = [] + offset_a = 0 + offset_b = 0 + while offset_a < part_a.count && offset_b < part_b.count + a = part_a[offset_a] + b = part_b[offset_b] + + # Take the smallest of the two, and push it on our array + if a <= b + array << a + offset_a += 1 + else + array << b + offset_b += 1 + end + end + + # There is at least one element left in either part_a or part_b (not both) + while offset_a < part_a.count + array << part_a[offset_a] + offset_a += 1 + end + + while offset_b < part_b.count + array << part_b[offset_b] + offset_b += 1 + end + + return array +end + +array = [1, 5, 3, 4, 6, 3, 7, 2] +puts merge_sort(array) From 5ca26038143838566c4952b1770ead9659f613ed Mon Sep 17 00:00:00 2001 From: S Shashank Date: Sun, 15 Oct 2017 02:21:22 +0530 Subject: [PATCH 114/355] Added activity selection problem to greedy algorithms --- greedy/activity_selection/README.md | 36 ++++++++++++++++++++++++++ greedy/activity_selection/activity.cpp | 30 +++++++++++++++++++++ greedy/activity_selection/test_1.txt | 4 +++ greedy/activity_selection/test_2.txt | 7 +++++ 4 files changed, 77 insertions(+) create mode 100644 greedy/activity_selection/README.md create mode 100644 greedy/activity_selection/activity.cpp create mode 100644 greedy/activity_selection/test_1.txt create mode 100644 greedy/activity_selection/test_2.txt diff --git a/greedy/activity_selection/README.md b/greedy/activity_selection/README.md new file mode 100644 index 0000000000..31dab10c6c --- /dev/null +++ b/greedy/activity_selection/README.md @@ -0,0 +1,36 @@ +# Activity Selection Problem + +## Problem Statement: + +A list of N activities is given ( each having its own start time (Si) and finish time (Fi) ). Two activities with start times Si, Sj and +finish times Fi, Fj respectively are said to be non conflicting if Si > Fj or Sj > Fi. Find the maximum number of activities which we can +schedule so that there are no conflicting activities among those scheduled. + +## Constraints: +``` +1 <= N <= 100000 +1 <= Si <= Fi <= 1e9 +``` +## Input: +First line contains integer N, the number of activities. +Next N lines each contain two integers Si and Fi (start and finish time of activity i) + +## Output: +Output one single integer (maximum number of activities which you can schedule) + +## Example: +### Input : +``` +3 +2 3 +4 4 +1 5 +``` +### Output: +``` +2 +``` + +## Explanation +Let the give set of activities be ```S = {1, 2, 3, ..n}``` and activities be sorted by finish time. The greedy choice is to always pick activity 1. How come the activity 1 always provides one of the optimal solutions. We can prove it by showing that if there is another solution B with first activity other than 1, then there is also a solution A of same size with activity 1 as first activity. Let the first activity selected by B be k, then there always exist ```A = {B – {k}} U {1}```.(Note that the activities in B are independent and k has smallest finishing time among all. Since k is not 1, ```finish(k) >= finish(1))``` + diff --git a/greedy/activity_selection/activity.cpp b/greedy/activity_selection/activity.cpp new file mode 100644 index 0000000000..e978bce853 --- /dev/null +++ b/greedy/activity_selection/activity.cpp @@ -0,0 +1,30 @@ +#include +#define fastIO ios_base::sync_with_stdio(0); cin.tie(NULL); +#define mp make_pair +#define pb push_back +#define inf_ll 2000000000000000000LL +#define inf 1000000000 +#define eps 1e-8 +#define mod 1000000007 +#define ff first +#define ss second +#define N 3456789 +using namespace std; +typedef long long int ll; +typedef pair PII; +PII ar[N]; + +int main () { + ll n, i, res = 1, j = 0; + cin >> n; + for (i = 0; i < n; i++) cin >> ar[i].ss >> ar[i].ff; + sort(ar, ar + n); // Sort according to the finish times + for (i = 1; i < n; i++) { + if (ar[i].ss >= ar[j].ff) { // If an activity does not conflict add it to res + res++; + j = i; + } + } + cout << res << "\n"; + return 0; +} \ No newline at end of file diff --git a/greedy/activity_selection/test_1.txt b/greedy/activity_selection/test_1.txt new file mode 100644 index 0000000000..641aa4e01f --- /dev/null +++ b/greedy/activity_selection/test_1.txt @@ -0,0 +1,4 @@ +3 +2 3 +4 4 +1 5 \ No newline at end of file diff --git a/greedy/activity_selection/test_2.txt b/greedy/activity_selection/test_2.txt new file mode 100644 index 0000000000..1f6745c3cd --- /dev/null +++ b/greedy/activity_selection/test_2.txt @@ -0,0 +1,7 @@ +6 +1 2 +3 4 +0 6 +5 7 +8 9 +5 9 \ No newline at end of file From c5b78ebfd8fe47a8273ce42eaa66ef0db820d5f0 Mon Sep 17 00:00:00 2001 From: S Shashank Date: Sun, 15 Oct 2017 02:23:31 +0530 Subject: [PATCH 115/355] Updated README.md --- README.md | 271 +++++++++++++++++++++++++++--------------------------- 1 file changed, 136 insertions(+), 135 deletions(-) diff --git a/README.md b/README.md index d9c95a4713..51db5b0d6d 100644 --- a/README.md +++ b/README.md @@ -1,135 +1,136 @@ -[![Join the chat at https://gitter.im/al-go-rithms](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/al-go-rithms?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![License](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg)](https://opensource.org/licenses/MIT) - -# Data Structures and Algorithms - -Clean example implementations of data structures and algorithms written in different languages. - -## List of implementations - -* [Search](search) - * [binary search](search/binary_search) - * [linear search](search/linear_search) - * [jump search](search/jump_search) -* [Sort](sort) - * [bubble sort](sort/bubble_sort) - * [insertion sort](sort/insertion_sort) - * [quick sort](sort/quick_sort) - * [merge sort](sort/merge_sort) - * [heap sort](sort/heap_sort) - * [selection sort](sort/selection_sort) - * [counting sort](sort/counting_sort) - * [radix sort](sort/radix_sort) - * [shell sort](sort/shell_sort) -* [Math](math) - * [russian peasant](math/russian_peasant) - * [towers of hanoi](math/towers_of_hanoi) - * [armstrong number](math/armstrong_number) - * [euclid's gcd](math/euclids_gcd) - * [prime seive](math/prime_seive) - * [strong number](math/strong_number) - * [factorial](math/factorial) - * [fibonacci sequence](math/fibonacci) - * [sum of digits](math/sum_of_digits) - * [fast exponentiation](math/fast_exponentiation) - * [add binary numbers](math/AddBinaryNumbers) - * [interval bisection](math/interval_bisection) - * [lucas series](math/lucas_series) - * [numerical integration](math/numerical_integration) - * [pernicious number](math/pernicious_number) -* [Cryptography](cryptography) - * [caesar cipher](cryptography/caesar_cipher) - * [substitution cipher](cryptography/substitution_cipher) - * [vernam cipher](cryptography/vernam_cipher) - * [vigenere cipher](cryptography/vigenere_cipher) - * [playfair cipher](cryptography/playfair_cipher) - * [chinese cipher](cryptography/chinese_cipher) - * [codewheel](cryptography/codewheel) - * [end to end](cryptography/end_to_end) -* [Greedy](greedy) - * [dijkstra’s algorithm](greedy/dijkstra’s_algorithm) - * [kruskal's algorithm](greedy/kruskal's_algorithm) - * [prim's algorithm](greedy/prim's_algorithm) - * [job sequencing problem](greedy/Job_sequencing_problem) -* [Graphs](graphsearch) - * [breadth-first-search](graphsearch/breadth-first-search) - * [depth-first-search](graphsearch/depth-first-search) - * [topological sorting](graphsearch/topological_sorting) - * [a-star search](graphsearch/a-star-search) - * [dijkstra](graphsearch/dijkstra) -* [String search](string_search) - * [knuth morris pratt](string_search/knuth_morris_pratt) - * [rabin karp](string_search/rabin_karp) - * [quick search](string_search/quick_search) -* [Cluster analysis](cluster_analysis) - * [k-means](cluster_analysis/k-means) -* [Dynamic Programming](dp) - * [kadane algorithm](dp/kadane-_algorithm) - * [knapsack algorithm](dp/knapsack_problem) - * [levenshtein distance](dp/levenshtein_distance) - * [minimum cost path](dp/min_cost_path) - * [matrix chain multiplication](dp/matrix_chain_multiplication) - * [floyd Warshall algorithm](dp/floyd_warshall_algorithm) - * [coin change](dp/coin_change) - * [longest common subsequence](dp/longest_common_subsequence) -* [Data structures](data_structures) - * [linked list](data_structures/linked_list) - * [avl tree](data_structures/avl_tree) - * [heap](data_structures/heap) - * [b tree](data_structures/b_tree) - * [dictionary](data_structures/dictionary) - * [queue](data_structures/Queue) - * [stack](data_structures/Stack) -* [Backtracking](backtracking) - * [sudoku](backtracking/sudoku) - * [knights tour](backtracking/knightsTour) - * [n queens](backtracking/n-queens) - -## Contribution - * Contributions are always welcome. Language doesn't matter. Just make sure you're implementing an algorithm. - * PRs are welcome. To begin developing, follow the structure: - - > algorithm_name/language-name/file_name.extension - e.g - > buble_sort/python/buble_sort.py - - * If there is an implementation of the same algorithm in your language, add your username in front of the file name - * Please include a description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps people that are learning new algorithm. - * Graphical examples would be very helpful too. - * Don't forget to include tests. - * Don't remove previous implementations of algorithms. Just add a new file with your own implementation. - -## Resources - - Curated list of resources dealing with algorithms. - - * Books - * [Introduction to algorithms](https://www.amazon.com/Introduction-Algorithms-Second-Edition-Thomas/dp/0262032937) - * [Algorithms and Data structures](https://www.amazon.com/Algorithms-Structures-Prentice-Hall-Automatic-Computation/dp/0130224189) - * [Data Structures and Algorithms](https://www.amazon.com/Data-Structures-Algorithms-Alfred-Aho/dp/0201000237/ref=pd_sim_14_3?_encoding=UTF8&pd_rd_i=0201000237&pd_rd_r=XQVWWBZYKCYN7V573D1B&pd_rd_w=jmpvR&pd_rd_wg=FCwc5&psc=1&refRID=XQVWWBZYKCYN7V573D1B) - * [The Algorithm Design Manual](https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) - * [Algorithm Design](https://www.amazon.com/Algorithm-Design-Jon-Kleinberg/dp/0321295358) - * [Grokking Algorithms](https://www.amazon.com/Grokking-Algorithms-illustrated-programmers-curious/dp/1617292230/ref=zg_bs_3870_3?_encoding=UTF8&psc=1&refRID=CBQSARF3C86P7FMQ4DEV) - * Sites - * [Algorithms - Tutorials point](https://www.tutorialspoint.com/data_structures_algorithms/index.htm) - * [Algorithms - Princetone edu](http://algs4.cs.princeton.edu/home/) - * [Data structures and algorithms - Hackr](https://hackr.io/tutorials/learn-data-structures-algorithms) - * [Data science - Topcoder](https://www.topcoder.com/community/data-science/data-science-tutorials/) - * Online classes (Free) - * [Introduction to algorithms Part 1 - Coursera](https://www.coursera.org/learn/introduction-to-algorithms) - * [Algorithms - Khanacademy](https://www.khanacademy.org/computing/computer-science/algorithms) - * [Algorithms specialization 4 courses - Coursera](https://www.coursera.org/specializations/algorithms) - * [Computability, Complexity & Algorithms - Udacity](https://www.udacity.com/course/computability-complexity-algorithms--ud061) - * [Intro to algorithms - Udacity](https://www.udacity.com/course/intro-to-algorithms--cs215) - * [Algorithms - Edx](https://www.edx.org/course/algorithms-iitbombayx-cs213-3x-0) - * [Algorithms and data structures - Edx](https://www.edx.org/course/algorithms-data-structures-microsoft-dev285x) - * [Algorithm Design and Analysis - Edx](https://courses.edx.org/courses/course-v1:PennX+SD3x+2T2017/course/) - * Coding Practice Sites - * [HackerRank](https://www.hackerrank.com/) - * [HackerEarth](https://www.hackerearth.com/) - * [SPOJ](http://www.spoj.com/) - * [TopCoder](https://www.topcoder.com/) - * [CodeChef](https://www.codechef.com/) - * [Codeforces](http://codeforces.com/) - * [Project Euler](https://projecteuler.net/) - * [LeetCode](https://leetcode.com/) +[![Join the chat at https://gitter.im/al-go-rithms](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/al-go-rithms?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![License](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg)](https://opensource.org/licenses/MIT) + +# Data Structures and Algorithms + +Clean example implementations of data structures and algorithms written in different languages. + +## List of implementations + +* [Search](search) + * [binary search](search/binary_search) + * [linear search](search/linear_search) + * [jump search](search/jump_search) +* [Sort](sort) + * [bubble sort](sort/bubble_sort) + * [insertion sort](sort/insertion_sort) + * [quick sort](sort/quick_sort) + * [merge sort](sort/merge_sort) + * [heap sort](sort/heap_sort) + * [selection sort](sort/selection_sort) + * [counting sort](sort/counting_sort) + * [radix sort](sort/radix_sort) + * [shell sort](sort/shell_sort) +* [Math](math) + * [russian peasant](math/russian_peasant) + * [towers of hanoi](math/towers_of_hanoi) + * [armstrong number](math/armstrong_number) + * [euclid's gcd](math/euclids_gcd) + * [prime seive](math/prime_seive) + * [strong number](math/strong_number) + * [factorial](math/factorial) + * [fibonacci sequence](math/fibonacci) + * [sum of digits](math/sum_of_digits) + * [fast exponentiation](math/fast_exponentiation) + * [add binary numbers](math/AddBinaryNumbers) + * [interval bisection](math/interval_bisection) + * [lucas series](math/lucas_series) + * [numerical integration](math/numerical_integration) + * [pernicious number](math/pernicious_number) +* [Cryptography](cryptography) + * [caesar cipher](cryptography/caesar_cipher) + * [substitution cipher](cryptography/substitution_cipher) + * [vernam cipher](cryptography/vernam_cipher) + * [vigenere cipher](cryptography/vigenere_cipher) + * [playfair cipher](cryptography/playfair_cipher) + * [chinese cipher](cryptography/chinese_cipher) + * [codewheel](cryptography/codewheel) + * [end to end](cryptography/end_to_end) +* [Greedy](greedy) + * [dijkstra’s algorithm](greedy/dijkstra’s_algorithm) + * [kruskal's algorithm](greedy/kruskal's_algorithm) + * [prim's algorithm](greedy/prim's_algorithm) + * [job sequencing problem](greedy/Job_sequencing_problem) + * [activity selection problem](greedy/activity_selection) +* [Graphs](graphsearch) + * [breadth-first-search](graphsearch/breadth-first-search) + * [depth-first-search](graphsearch/depth-first-search) + * [topological sorting](graphsearch/topological_sorting) + * [a-star search](graphsearch/a-star-search) + * [dijkstra](graphsearch/dijkstra) +* [String search](string_search) + * [knuth morris pratt](string_search/knuth_morris_pratt) + * [rabin karp](string_search/rabin_karp) + * [quick search](string_search/quick_search) +* [Cluster analysis](cluster_analysis) + * [k-means](cluster_analysis/k-means) +* [Dynamic Programming](dp) + * [kadane algorithm](dp/kadane-_algorithm) + * [knapsack algorithm](dp/knapsack_problem) + * [levenshtein distance](dp/levenshtein_distance) + * [minimum cost path](dp/min_cost_path) + * [matrix chain multiplication](dp/matrix_chain_multiplication) + * [floyd Warshall algorithm](dp/floyd_warshall_algorithm) + * [coin change](dp/coin_change) + * [longest common subsequence](dp/longest_common_subsequence) +* [Data structures](data_structures) + * [linked list](data_structures/linked_list) + * [avl tree](data_structures/avl_tree) + * [heap](data_structures/heap) + * [b tree](data_structures/b_tree) + * [dictionary](data_structures/dictionary) + * [queue](data_structures/Queue) + * [stack](data_structures/Stack) +* [Backtracking](backtracking) + * [sudoku](backtracking/sudoku) + * [knights tour](backtracking/knightsTour) + * [n queens](backtracking/n-queens) + +## Contribution + * Contributions are always welcome. Language doesn't matter. Just make sure you're implementing an algorithm. + * PRs are welcome. To begin developing, follow the structure: + + > algorithm_name/language-name/file_name.extension + > e.g + > buble_sort/python/buble_sort.py + + * If there is an implementation of the same algorithm in your language, add your username in front of the file name + * Please include a description for the algorithm that you are implementing. It doesn't matter if it's copied from somewhere as long as it helps people that are learning new algorithm. + * Graphical examples would be very helpful too. + * Don't forget to include tests. + * Don't remove previous implementations of algorithms. Just add a new file with your own implementation. + +## Resources + + Curated list of resources dealing with algorithms. + + * Books + * [Introduction to algorithms](https://www.amazon.com/Introduction-Algorithms-Second-Edition-Thomas/dp/0262032937) + * [Algorithms and Data structures](https://www.amazon.com/Algorithms-Structures-Prentice-Hall-Automatic-Computation/dp/0130224189) + * [Data Structures and Algorithms](https://www.amazon.com/Data-Structures-Algorithms-Alfred-Aho/dp/0201000237/ref=pd_sim_14_3?_encoding=UTF8&pd_rd_i=0201000237&pd_rd_r=XQVWWBZYKCYN7V573D1B&pd_rd_w=jmpvR&pd_rd_wg=FCwc5&psc=1&refRID=XQVWWBZYKCYN7V573D1B) + * [The Algorithm Design Manual](https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) + * [Algorithm Design](https://www.amazon.com/Algorithm-Design-Jon-Kleinberg/dp/0321295358) + * [Grokking Algorithms](https://www.amazon.com/Grokking-Algorithms-illustrated-programmers-curious/dp/1617292230/ref=zg_bs_3870_3?_encoding=UTF8&psc=1&refRID=CBQSARF3C86P7FMQ4DEV) + * Sites + * [Algorithms - Tutorials point](https://www.tutorialspoint.com/data_structures_algorithms/index.htm) + * [Algorithms - Princetone edu](http://algs4.cs.princeton.edu/home/) + * [Data structures and algorithms - Hackr](https://hackr.io/tutorials/learn-data-structures-algorithms) + * [Data science - Topcoder](https://www.topcoder.com/community/data-science/data-science-tutorials/) + * Online classes (Free) + * [Introduction to algorithms Part 1 - Coursera](https://www.coursera.org/learn/introduction-to-algorithms) + * [Algorithms - Khanacademy](https://www.khanacademy.org/computing/computer-science/algorithms) + * [Algorithms specialization 4 courses - Coursera](https://www.coursera.org/specializations/algorithms) + * [Computability, Complexity & Algorithms - Udacity](https://www.udacity.com/course/computability-complexity-algorithms--ud061) + * [Intro to algorithms - Udacity](https://www.udacity.com/course/intro-to-algorithms--cs215) + * [Algorithms - Edx](https://www.edx.org/course/algorithms-iitbombayx-cs213-3x-0) + * [Algorithms and data structures - Edx](https://www.edx.org/course/algorithms-data-structures-microsoft-dev285x) + * [Algorithm Design and Analysis - Edx](https://courses.edx.org/courses/course-v1:PennX+SD3x+2T2017/course/) + * Coding Practice Sites + * [HackerRank](https://www.hackerrank.com/) + * [HackerEarth](https://www.hackerearth.com/) + * [SPOJ](http://www.spoj.com/) + * [TopCoder](https://www.topcoder.com/) + * [CodeChef](https://www.codechef.com/) + * [Codeforces](http://codeforces.com/) + * [Project Euler](https://projecteuler.net/) + * [LeetCode](https://leetcode.com/) From ac7788f87c7e2989bc2e350b15f6b9c384da3121 Mon Sep 17 00:00:00 2001 From: Berry Seme Date: Sat, 14 Oct 2017 13:53:31 -0700 Subject: [PATCH 116/355] quick sort in ruby --- sort/quick_sort/ruby/quick_sort.rb | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 sort/quick_sort/ruby/quick_sort.rb diff --git a/sort/quick_sort/ruby/quick_sort.rb b/sort/quick_sort/ruby/quick_sort.rb new file mode 100644 index 0000000000..02a51a841f --- /dev/null +++ b/sort/quick_sort/ruby/quick_sort.rb @@ -0,0 +1,52 @@ +def quicksort(array, from=0, to=nil) + if to == nil + # Sort the whole array, by default + to = array.count - 1 + end + + if from >= to + # Done sorting + return + end + + # Take a pivot value, at the far left + pivot = array[from] + + # Min and Max pointers + min = from + max = to + + # Current free slot + free = min + + while min < max + if free == min # Evaluate array[max] + if array[max] <= pivot # Smaller than pivot, must move + array[free] = array[max] + min += 1 + free = max + else + max -= 1 + end + elsif free == max # Evaluate array[min] + if array[min] >= pivot # Bigger than pivot, must move + array[free] = array[min] + max -= 1 + free = min + else + min += 1 + end + else + raise "Inconsistent state" + end + end + + array[free] = pivot + + quicksort array, from, free - 1 + quicksort array, free + 1, to +end + +a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].shuffle +quicksort a +puts a From d0e588fefa6060b32c51f8b6a2fe1c2ed8eca5c8 Mon Sep 17 00:00:00 2001 From: Vincent Thiery Date: Sat, 14 Oct 2017 22:54:45 +0200 Subject: [PATCH 117/355] Add constexpr prime check --- math/is_prime/C++/is_prime.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 math/is_prime/C++/is_prime.cpp diff --git a/math/is_prime/C++/is_prime.cpp b/math/is_prime/C++/is_prime.cpp new file mode 100644 index 0000000000..819a4dd687 --- /dev/null +++ b/math/is_prime/C++/is_prime.cpp @@ -0,0 +1,26 @@ +#include + +constexpr bool isPrimeRecursive(const unsigned int number, const unsigned int ref) +{ + return (ref * ref > number) ? true : (number % ref == 0) ? false : isPrimeRecursive(number, ref + 1); +} + +constexpr bool isPrime(const unsigned int number) +{ + return (number < 2) ? false : isPrimeRecursive(number, 2); +} + +int main() +{ + assert(!isPrime(0)); + assert(!isPrime(1)); + assert(isPrime(2)); + assert(isPrime(3)); + assert(!isPrime(4)); + assert(isPrime(5)); + assert(!isPrime(6)); + assert(isPrime(7)); + assert(!isPrime(8)); + assert(!isPrime(9)); + assert(!isPrime(10)); +} \ No newline at end of file From 36fe26074d76fefab79c88b4713c04e85dc53aae Mon Sep 17 00:00:00 2001 From: Vincent Thiery Date: Sat, 14 Oct 2017 22:58:39 +0200 Subject: [PATCH 118/355] Update readme with primality check --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d9c95a4713..a86c73bec1 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Clean example implementations of data structures and algorithms written in diffe * [lucas series](math/lucas_series) * [numerical integration](math/numerical_integration) * [pernicious number](math/pernicious_number) + * [primality check](math/is_prime) * [Cryptography](cryptography) * [caesar cipher](cryptography/caesar_cipher) * [substitution cipher](cryptography/substitution_cipher) From be2ab1c7894a0bcc7f3a12b327401edcff5360a0 Mon Sep 17 00:00:00 2001 From: mattgd Date: Sat, 14 Oct 2017 17:07:39 -0400 Subject: [PATCH 119/355] Add improved testing for JavaScript Fibonacci implementation. --- math/fibonacci/JavaScript/fibonacci.js | 59 ++++++++++++++++++-------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/math/fibonacci/JavaScript/fibonacci.js b/math/fibonacci/JavaScript/fibonacci.js index 98fd2a560e..f2028dfbba 100644 --- a/math/fibonacci/JavaScript/fibonacci.js +++ b/math/fibonacci/JavaScript/fibonacci.js @@ -1,20 +1,45 @@ -/** - * Finds the series of n numbers in which each - * number is the sum of the two preceding numbers. - * @param {integer} n The number of iterations of Fibonacci - */ -function fibonacci(n) { - // Define base case - var fib = [1, 1]; - - // Iterate through using the sum of the last two values - for (i = 2; i < n; i++) { - fib.push(fib[i - 1] + fib[i - 2]); +(function() { + "use strict" + + /** + * Finds the series of n numbers in which each + * number is the sum of the two preceding numbers. + * @param {integer} n The number of iterations of Fibonacci + */ + function fibonacci(n) { + if (n == 1) { + return [ 1 ]; + } + + // Define base cases + var fib = [ 1, 1 ]; + + // Iterate through using the sum of the last two values + for (var i = 2; i < n; i++) { + fib.push(fib[ i - 1 ] + fib[ i - 2 ]); + } + + return fib; } - return fib; -} + // Tests + // n = 1 + var expected = [ 1 ].toString(); + var actual = fibonacci(1).toString(); + console.assert(actual === expected); + + // n = 2 + expected = [ 1, 1 ].toString(); + actual = fibonacci(2).toString(); + console.assert(actual === expected); + + // n = 5 + expected = [ 1, 1, 2, 3, 5 ].toString(); + actual = fibonacci(5).toString(); + console.assert(actual === expected); -for (i = 1; i < 10; i++) { - console.log(fibonacci(i)); -} \ No newline at end of file + // n = 8 + expected = [ 1, 1, 2, 3, 5, 8, 13, 21 ].toString(); + actual = fibonacci(8).toString(); + console.assert(actual === expected); +})(); \ No newline at end of file From 137164b0280fbff413dc683eacfe3a70bc13c529 Mon Sep 17 00:00:00 2001 From: MohamedMashaal Date: Sat, 14 Oct 2017 23:16:47 +0200 Subject: [PATCH 120/355] Adding countSort in Java --- sort/counting_sort/Java/CountSort.java | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 sort/counting_sort/Java/CountSort.java diff --git a/sort/counting_sort/Java/CountSort.java b/sort/counting_sort/Java/CountSort.java new file mode 100644 index 0000000000..238df06ea1 --- /dev/null +++ b/sort/counting_sort/Java/CountSort.java @@ -0,0 +1,34 @@ + +public class CountSort { + + private int getMax(int [] A) { + int max = A[0]; + for(int i = 0 ; i < A.length ; i ++) + if(max< A[i]) + max = A[i]; + return max; + } + + private void getFreq(int [] A , int [] freq) { + for(int i = 0 ; i < A.length ; i ++) + freq[A[i]] += 1 ; + } + + public void sort(int [] A) { + int [] freq = new int [getMax(A)+1]; + getFreq(A, freq); + for(int i = 0 , j = 0 ; i < A.length ; i ++) { + while(freq[j] == 0) + j++; + A[i] = j ; + freq[j] -= 1; + } + } + + public static void main (String [] args) { + int nosrt[] = {4,3,10,8,1,16,17,1,12,11,20}; + new CountSort().sort(nosrt); + for(int i = 0 ; i < nosrt.length ; i ++) + System.out.println(nosrt[i]); + } +} From 4216bac59cf238e409fee2f1a32a65429908b951 Mon Sep 17 00:00:00 2001 From: Kushagra Arora Date: Sun, 15 Oct 2017 02:49:55 +0530 Subject: [PATCH 121/355] added Longest Increasing Subsequence --- .../c++11/README.md | 11 ++++++ dp/longest_increasing_subsequence/c++11/lis | Bin 0 -> 34560 bytes .../c++11/lis.cpp | 37 ++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 dp/longest_increasing_subsequence/c++11/README.md create mode 100755 dp/longest_increasing_subsequence/c++11/lis create mode 100644 dp/longest_increasing_subsequence/c++11/lis.cpp diff --git a/dp/longest_increasing_subsequence/c++11/README.md b/dp/longest_increasing_subsequence/c++11/README.md new file mode 100644 index 0000000000..7aab5b7051 --- /dev/null +++ b/dp/longest_increasing_subsequence/c++11/README.md @@ -0,0 +1,11 @@ +## C++ Implementation + --- + +This implementation can be used with any numeric datatype - i.e. int, unsigned int, long long, float, double etc. + +To run the program, perform the following steps: +1. Create a vector of the required data type and pass it to LIS function. +2. (This will compile the code) On the terminal, type: + ` g++ -std=c++11 -o lis lis.cpp` +3. (This will run the code) On the terminal, type: + ` ./lis ` \ No newline at end of file diff --git a/dp/longest_increasing_subsequence/c++11/lis b/dp/longest_increasing_subsequence/c++11/lis new file mode 100755 index 0000000000000000000000000000000000000000..783b3cef8cf9d848bc0315939d00e16bd604ab99 GIT binary patch literal 34560 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 literal 0 HcmV?d00001 diff --git a/dp/longest_increasing_subsequence/c++11/lis.cpp b/dp/longest_increasing_subsequence/c++11/lis.cpp new file mode 100644 index 0000000000..31d5e674e7 --- /dev/null +++ b/dp/longest_increasing_subsequence/c++11/lis.cpp @@ -0,0 +1,37 @@ +#include +#include +#include + +using namespace std; + + +// this algorithm supports all numeric data types. +template +multiset LIS(vector const &arr) +{ + multiset lis; + + for(int i = 0; i < arr.size(); i++) + { + lis.insert(arr[i]); + auto it = lis.upper_bound(arr[i]); + if(it != lis.end()) + { + lis.erase(it); + } + } + + return lis; +} + +int main() +{ + vector A{2, 5, 3, 7, 11, 8, 10, 13, 6 }; + + multiset L = LIS(A); + + cout << L.size() << endl; + + return 0; + +} \ No newline at end of file From 7438b9f3e53c5a7fa66c211026f74aec6814b91b Mon Sep 17 00:00:00 2001 From: Kushagra Arora Date: Sun, 15 Oct 2017 03:02:54 +0530 Subject: [PATCH 122/355] added LIS Documentation --- dp/longest_increasing_subsequence/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 dp/longest_increasing_subsequence/README.md diff --git a/dp/longest_increasing_subsequence/README.md b/dp/longest_increasing_subsequence/README.md new file mode 100644 index 0000000000..390dcf7508 --- /dev/null +++ b/dp/longest_increasing_subsequence/README.md @@ -0,0 +1,8 @@ +## Longest Increasing Subsequence + +--- + +Let us understand each term one by one. +1. **Subsequence:** It is a collection of elements of a sequence such that they preserve the relative ordering. e.g {4, 7, 9}, {2, 1, 4}, {2, 9} are subsequences of the sequence {1, 2, 1, 4, 5, 7, 8, 9}. However, {5, 4, 7}, {9, 8}, {3} are not subsequences of it. +2. **Increasing Subsequence:** It is a subsequence such that all the elements are in a non-decreasing order. e.g {4, 7, 9}, {2, 9} are increasing subsequence of the sequence {4, 2, 3, 7, 9}. +3. **Longest Increasing Subsequence:** It is the longest length increasing subsequence. e.g {2, 3, 7, 9} is the longest increasing subsequence of {4, 2, 3, 7, 9}. \ No newline at end of file From 90d2d2753c2025f72f504ea59402054d278def31 Mon Sep 17 00:00:00 2001 From: Kushagra Arora Date: Sun, 15 Oct 2017 03:04:54 +0530 Subject: [PATCH 123/355] added longest increasing subsequence --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d9c95a4713..7c662a5ca3 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Clean example implementations of data structures and algorithms written in diffe * [floyd Warshall algorithm](dp/floyd_warshall_algorithm) * [coin change](dp/coin_change) * [longest common subsequence](dp/longest_common_subsequence) + * [longest increasing subsequence](dp/longest_increasing_subsequence) * [Data structures](data_structures) * [linked list](data_structures/linked_list) * [avl tree](data_structures/avl_tree) From 9ae1919ccc12e419ecaf29658e8df04771a91d0b Mon Sep 17 00:00:00 2001 From: DianaNecsulescu Date: Sun, 15 Oct 2017 00:58:18 +0300 Subject: [PATCH 124/355] Added insertion sort implementation in prolog. --- sort/insertion_sort/prolog/insertion_sort.pl | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 sort/insertion_sort/prolog/insertion_sort.pl diff --git a/sort/insertion_sort/prolog/insertion_sort.pl b/sort/insertion_sort/prolog/insertion_sort.pl new file mode 100644 index 0000000000..cd7a885ac2 --- /dev/null +++ b/sort/insertion_sort/prolog/insertion_sort.pl @@ -0,0 +1,6 @@ +insertToSorted(E, [], [E]). +insertToSorted(E1, [E2|Rest], [E1, E2|Rest]) :- E1 =< E2, !. +insertToSorted(E1, [E2|Rest], [E2|R]) :- \+ (E1 =< E2), insertToSorted(E1, Rest, R), !. + +insertSort([],[]). +insertSort([E|Rest], R) :- insertSort(Rest, RAux), insertToSorted(E, RAux, R), !. From b7731712fcf463d25a10eb12f9d811eb5774e397 Mon Sep 17 00:00:00 2001 From: DianaNecsulescu Date: Sun, 15 Oct 2017 01:24:06 +0300 Subject: [PATCH 125/355] Added insertion sort implementation in prolog. --- sort/insertion_sort/prolog/insertion_sort.pl | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 sort/insertion_sort/prolog/insertion_sort.pl diff --git a/sort/insertion_sort/prolog/insertion_sort.pl b/sort/insertion_sort/prolog/insertion_sort.pl new file mode 100644 index 0000000000..cd7a885ac2 --- /dev/null +++ b/sort/insertion_sort/prolog/insertion_sort.pl @@ -0,0 +1,6 @@ +insertToSorted(E, [], [E]). +insertToSorted(E1, [E2|Rest], [E1, E2|Rest]) :- E1 =< E2, !. +insertToSorted(E1, [E2|Rest], [E2|R]) :- \+ (E1 =< E2), insertToSorted(E1, Rest, R), !. + +insertSort([],[]). +insertSort([E|Rest], R) :- insertSort(Rest, RAux), insertToSorted(E, RAux, R), !. From 33fec4e5431a7e59c37a9e95863f39effdce4698 Mon Sep 17 00:00:00 2001 From: DianaNecsulescu Date: Sun, 15 Oct 2017 01:58:47 +0300 Subject: [PATCH 126/355] Added bubble sort implementation in haskell. --- sort/bubble_sort/haskell/bubble_sort.hs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 sort/bubble_sort/haskell/bubble_sort.hs diff --git a/sort/bubble_sort/haskell/bubble_sort.hs b/sort/bubble_sort/haskell/bubble_sort.hs new file mode 100644 index 0000000000..511226788e --- /dev/null +++ b/sort/bubble_sort/haskell/bubble_sort.hs @@ -0,0 +1,14 @@ +module Bubblesort where + + bubblesort::(Ord a)=>[a]->[a] + bubblesort l = bsort l 0 + + swap ::(Ord a)=>[a]->[a] + swap (x:y:xs) | x > y = y:swap(x:xs) + | otherwise = x:swap(y:xs) + swap [x] = [x] + swap [] = [] + + bsort::(Ord a)=>[a]->Int->[a] + bsort l i | i == (length l) = l + | otherwise = bsort (swap l) (i + 1) From afecf733ef4ae98502b88412dbf5e8604b41ee88 Mon Sep 17 00:00:00 2001 From: Vincent Thiery Date: Sun, 15 Oct 2017 00:58:56 +0200 Subject: [PATCH 127/355] Add moments for C++ --- README.md | 1 + math/moments/C++/moments.cpp | 87 ++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 math/moments/C++/moments.cpp diff --git a/README.md b/README.md index d9c95a4713..4a00fce8cc 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Clean example implementations of data structures and algorithms written in diffe * [lucas series](math/lucas_series) * [numerical integration](math/numerical_integration) * [pernicious number](math/pernicious_number) + * [moments](math/moments) * [Cryptography](cryptography) * [caesar cipher](cryptography/caesar_cipher) * [substitution cipher](cryptography/substitution_cipher) diff --git a/math/moments/C++/moments.cpp b/math/moments/C++/moments.cpp new file mode 100644 index 0000000000..3b71842c4a --- /dev/null +++ b/math/moments/C++/moments.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include + +// Returns the arithmetic average of data +inline double ArithmeticAverage(const std::vector& data) +{ + return std::accumulate(std::cbegin(data), std::cend(data), 0.0) / std::size(data); +} +// Returns the geometric average of data +inline double GeometricMean(const std::vector& data) +{ + const double product{ std::accumulate(std::cbegin(data), std::cend(data), 1.0, std::multiplies()) }; + return std::pow(product, 1.0 / std::size(data)); +} +// Returns the harmonic average of data +inline double HarmonicMean(const std::vector& data) +{ + const double sum{ + std::accumulate( + std::cbegin(data), + std::cend(data), + 0.0, + [](const double a, const double x){ return a + 1.0 / x; } + ) + }; + return std::size(data) / sum; +} +// Helper to reduce against mean with an exponent +inline double Reduce(const std::vector& data, const double mean, const int exponent) +{ + return std::accumulate( + std::cbegin(data), + std::cend(data), + 0.0, + [mean, exponent](const double a, const double x){ return a + std::pow(x - mean, exponent); } + ); +} +// Returns the unbiaised variance of data +inline double Variance(const std::vector& data, const double mean) +{ + // divides by n-1 to return unbiaised estimation + return Reduce(data, mean, 2) / (std::size(data) - 1); +} +// Returns the skewness of data +inline double Skewness(const std::vector& data, const double mean, const double variance) +{ + const size_t n{ std::size(data) }; + return n * Reduce(data, mean, 3) / std::pow(variance, 1.5) / (n - 1) / (n - 2); +} +// Returns the kurtosis of data +inline double Kurtosis(const std::vector& data, const double mean, const double variance) +{ + const size_t n{ std::size(data) }; + const size_t nm1{ (n - 1) }; + const size_t nm2nm3{ (n - 2) * (n - 3) }; + const double first{ n * (n + 1) * Reduce(data, mean, 4) / nm1 / nm2nm3 / std::pow(variance, 2) }; + const double second{ 3.0 * nm1 * nm1 / nm2nm3 }; + return first - second; +} +// Returns the median of data +inline double Median(const std::vector& data) +{ + size_t n{ std::size(data) / 2 }; + std::vector sortedData{ data }; + std::nth_element(std::begin(sortedData), std::begin(sortedData) + n, std::end(sortedData)); + return n % 2 == 0 ? sortedData[n] : 0.5 * (sortedData[n - 1] + sortedData[n]); +} + +int main() +{ + const double tol{ 1.0e-05 }; + const std::vector vec{ 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0 }; + + const double arithmeticMean{ ArithmeticAverage(vec) }; + assert(std::abs(arithmeticMean - 5.48889) < tol); + assert(std::abs(GeometricMean(vec) - 4.636355) < tol); + assert(std::abs(HarmonicMean(vec) - 3.652661) < tol); + assert(std::abs(Median(vec) - 5.599999) < tol); + + const double variance{ Variance(vec, arithmeticMean) }; + assert(std::abs(variance - 8.086111) < tol); + assert(std::abs(Skewness(vec, arithmeticMean, variance) - (-0.169877)) < tol); + assert(std::abs(Kurtosis(vec, arithmeticMean, variance) - (-1.37685)) < tol); +} \ No newline at end of file From 6cdfd4f3bd5024acbc0184f0e48aad849e215979 Mon Sep 17 00:00:00 2001 From: Abe Ramseyer Date: Sat, 14 Oct 2017 18:22:54 -0500 Subject: [PATCH 128/355] fixed errors in java hash table --- data_structures/hash_table/README.md | 2 +- data_structures/hash_table/java/HashTableTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data_structures/hash_table/README.md b/data_structures/hash_table/README.md index 889437c2af..a038bf596b 100644 --- a/data_structures/hash_table/README.md +++ b/data_structures/hash_table/README.md @@ -20,7 +20,7 @@ As you can see, this will simply place a number into a table based on its remain # Collisions What happens if two numbers give the same result from a hash function? This is called a collision, and resolving collisions is one of the areas of study in hash tables. There are multiple ways to resolve collisions, popular ones are simply simply adding 1 to the result until an open slot is found (called linear probing), hashing the number again using result of the number of collisions^2 (quadratic probing), and using a second hash function in conjunction with the first (double hashing). -#Rehashing +# Rehashing Hash tables are only optimized when they can avoid collisions(or at least resolve them quickly) and rehashing. In order to keep this property true, we want a couple main properties to exist for our hash table: - its size is a prime number - its never more than half full diff --git a/data_structures/hash_table/java/HashTableTests.java b/data_structures/hash_table/java/HashTableTests.java index 70d9a93a88..dfe4f6bd11 100644 --- a/data_structures/hash_table/java/HashTableTests.java +++ b/data_structures/hash_table/java/HashTableTests.java @@ -36,7 +36,7 @@ public static void main(String args[]) { System.out.println("---Quadraticly Hashed Table Tests---\n" + hashed2); System.out.printf("rehashed: " + hashed2.getRehashCount() + "\nload: " + hashed2.getLoad() + "/" + hashed2.getSize() + ": %.2f%n", ((double) hashed2.getLoad()/hashed2.getSize())); - System.out.println("checking for " + (num+1) + " in the table: " + hashed2.find(num)); // this value will definitely be in the table + System.out.println("checking for " + num + " in the table: " + hashed2.find(num)); // this value will definitely be in the table System.out.println("deleting " + num + " from table: " + hashed2.delete(num) + "\nnew load: " + hashed2.getLoad()); System.out.println(hashed2); From e4ba0edd1a1628479826d155ab792c0380fd9a7c Mon Sep 17 00:00:00 2001 From: DianaNecsulescu Date: Sun, 15 Oct 2017 02:24:24 +0300 Subject: [PATCH 129/355] Added liner search implementation in haskell. --- search/linear_search/haskell/linear_search.hs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 search/linear_search/haskell/linear_search.hs diff --git a/search/linear_search/haskell/linear_search.hs b/search/linear_search/haskell/linear_search.hs new file mode 100644 index 0000000000..7da770cd6b --- /dev/null +++ b/search/linear_search/haskell/linear_search.hs @@ -0,0 +1,9 @@ +module LinearSearch where + + linear_search::[Integer]->Integer->Integer + linear_search l x= search l x 0 + + search::[Integer]->Integer->Integer->Integer + search (x:xs) y n = if x == y then n + else search xs y (n + 1) + search [] y n = -1 From 66988f054204252ca2304d26fe07dc538cc1bda0 Mon Sep 17 00:00:00 2001 From: Vincent Thiery Date: Sun, 15 Oct 2017 01:26:08 +0200 Subject: [PATCH 130/355] Implement fast pow for C++ --- math/fast_pow/C++/fast_pow.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 math/fast_pow/C++/fast_pow.cpp diff --git a/math/fast_pow/C++/fast_pow.cpp b/math/fast_pow/C++/fast_pow.cpp new file mode 100644 index 0000000000..865068d678 --- /dev/null +++ b/math/fast_pow/C++/fast_pow.cpp @@ -0,0 +1,21 @@ +#include + +// Fast pow from https://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ +inline double fastPow(const double a, const double b) +{ + union + { + double d; + int x[2]; + } u = { a }; + + constexpr int shift{ 1072632447 }; + u.x[1] = static_cast(b * (u.x[1] - shift) + shift); + u.x[0] = 0; + return u.d; +} + +int main() +{ + std::cout << fastPow(16, 0.5) << std::endl; +} \ No newline at end of file From 8b8c6f13ae759dd4ea6cf0cc873452ceab4b222a Mon Sep 17 00:00:00 2001 From: Vincent Thiery Date: Sun, 15 Oct 2017 02:05:58 +0200 Subject: [PATCH 131/355] Add catalan number for C++ --- README.md | 1 + math/catalan/C++/catalan.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 math/catalan/C++/catalan.cpp diff --git a/README.md b/README.md index d9c95a4713..7b84bd17fe 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Clean example implementations of data structures and algorithms written in diffe * [lucas series](math/lucas_series) * [numerical integration](math/numerical_integration) * [pernicious number](math/pernicious_number) + * [catalan number](math/catalan) * [Cryptography](cryptography) * [caesar cipher](cryptography/caesar_cipher) * [substitution cipher](cryptography/substitution_cipher) diff --git a/math/catalan/C++/catalan.cpp b/math/catalan/C++/catalan.cpp new file mode 100644 index 0000000000..472f778f1f --- /dev/null +++ b/math/catalan/C++/catalan.cpp @@ -0,0 +1,24 @@ +#include + +unsigned int catalan(unsigned int n) +{ + if (n <= 1) + { + return 1; + } + + unsigned int res{ 0 }; + for (unsigned int i{ 0 }; i < n; ++i) + { + res += catalan(i) * catalan(n - i - 1); + } + return res; +} + +int main() +{ + for (unsigned int i{ 0 }; i < 10; ++i) + { + std::cout << catalan(i) << std::endl; + } +} \ No newline at end of file From a68fe18116b2d4d2a1617a8e9f5c4d46304615a2 Mon Sep 17 00:00:00 2001 From: TacticalSandwich Date: Sun, 15 Oct 2017 13:54:25 +1300 Subject: [PATCH 132/355] Added a README giving basic overview of stacks --- data_structures/Stack/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 data_structures/Stack/README.md diff --git a/data_structures/Stack/README.md b/data_structures/Stack/README.md new file mode 100644 index 0000000000..d53b0da406 --- /dev/null +++ b/data_structures/Stack/README.md @@ -0,0 +1,10 @@ +In computer science, a stack is an abstract data type that serves as a collection of elements, with two principal operations: + +- push, which adds an element to the collection, and +- pop, which removes the most recently added element that was not yet removed. + +The order in which elements come off a stack gives rise to its alternative name, LIFO (last in, first out). Additionally, a peek operation may give access to the top without modifying the stack. + +![](https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png) + +[Credits](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) From 3bb020b5fb85ce531d221f636fe82171a01bb9ef Mon Sep 17 00:00:00 2001 From: Abe Ramseyer Date: Sat, 14 Oct 2017 21:01:09 -0500 Subject: [PATCH 133/355] Added README files for avl and moved some other misplaced ones to correct locations --- .../{queue/cpp => Queue}/README.md | 0 data_structures/Stack/C++/.DS_Store | Bin 6148 -> 0 bytes .../{stack/cpp => Stack}/README.md | 0 data_structures/avl_tree/README.md | 26 ++++++++++++++++++ .../binarySearch_tree/{C++ => }/README.md | 0 .../binary_indexed_tree/{C++ => }/README.md | 0 data_structures/heap/README.md | 23 ++++++++++++++++ .../segment_tree/{C++ => }/README.md | 0 8 files changed, 49 insertions(+) rename data_structures/{queue/cpp => Queue}/README.md (100%) delete mode 100644 data_structures/Stack/C++/.DS_Store rename data_structures/{stack/cpp => Stack}/README.md (100%) create mode 100644 data_structures/avl_tree/README.md rename data_structures/binarySearch_tree/{C++ => }/README.md (100%) rename data_structures/binary_indexed_tree/{C++ => }/README.md (100%) create mode 100644 data_structures/heap/README.md rename data_structures/segment_tree/{C++ => }/README.md (100%) diff --git a/data_structures/queue/cpp/README.md b/data_structures/Queue/README.md similarity index 100% rename from data_structures/queue/cpp/README.md rename to data_structures/Queue/README.md diff --git a/data_structures/Stack/C++/.DS_Store b/data_structures/Stack/C++/.DS_Store deleted file mode 100644 index af68596058b96ae4d642949dc6545736d646565c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO-}+b5Pd}s7%v=50&v6k`8m)9(4h*p4p}saycexWD_Yt_7joRdqmNrW z0bcn`@v$@hvl4$?h@Y@$SxZlaJR5#ThBemZ?{IgOJiW#|x;AxezawkT_f^Tqrin3N z3>X7@!T|Sdk!b49+P zI1MFgsEbz&r{T2w=$Ayy6*U|#UOrsx*~J@*3%xVH5AJY@qLs#gF;HgUK$~6J|1Wpn z|I0zvG6sx+y<)(%N9kzDA;rD5HaOX9J@tVqB7V8zHiVV171LL?;vO{!?OrOxBx0^e Q3&josfd(s#fj?#72LiECqW}N^ diff --git a/data_structures/stack/cpp/README.md b/data_structures/Stack/README.md similarity index 100% rename from data_structures/stack/cpp/README.md rename to data_structures/Stack/README.md diff --git a/data_structures/avl_tree/README.md b/data_structures/avl_tree/README.md new file mode 100644 index 0000000000..dedae24f46 --- /dev/null +++ b/data_structures/avl_tree/README.md @@ -0,0 +1,26 @@ +# AVL Tree +An avl tree is a specific type of binary search tree that automatically balances itself (and all of its subtrees). At any given moment, any given subtree height will differ at most by 1. Maintaining a balanced tree is beneficial because it allows a user to search for a value within it in O(log(n)) time. +The main components to implementing a binary search tree are determining balance factors and implementing proper rotations. +# Balance Factors +A balance factor is simple. Every node has one, and it indicates the difference in height between its two subtrees. ![A balanced binary search tree](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/AVL-tree-wBalance_K.svg/262px-AVL-tree-wBalance_K.svg.png) + +Note that even though this tree appears unbalanced, it is still considered balanced because every balance factor is 1, 0, or -1. As with many tree data structures, certain functions of it can be easily accomplished recursively. Determining a node's balance factor is one such function. +# Rotations +Once we have our balance factors, we use them to determine when a tree needs to be adjusted. Balancing happens as nodes are inserted or deleted, so every time the tree is changed rotations may happen. There are 4 cases for rotations: +1. Left Left: a given node has the BF (balance factor) -2 and its left child has BF -1. To balance, rotate clockwise around the node. +2. Right Right: a given node has the BF +2 and its right child has BF +1. To balance, rotate counter-clockwise around the node. +3. Left Right: a given node has a BF of -2 and its left child BF is +1. To balance, rotate left around child, then right around parent. +3. Right Left: a given node has a BF of +2 and its right child BF is -1. To balance, rotate right around child, then left around parent. + +# Arrays +While it makes sense to define some simple struct or class to represent each node in the form + + class TreeNode { + int data; + TreeNode left; + TreeNode right; + } +where left and right are references to a node's children, it's worth mentioning that binary trees can be easily represented in arrays as pictured by the following: +![enter image description here](http://opendatastructures.org/versions/edition-0.1d/ods-java/img1166.png) + +any given node at index *i* has children at indices *2i+1* and *2i+2* (for a 0-indexed array). \ No newline at end of file diff --git a/data_structures/binarySearch_tree/C++/README.md b/data_structures/binarySearch_tree/README.md similarity index 100% rename from data_structures/binarySearch_tree/C++/README.md rename to data_structures/binarySearch_tree/README.md diff --git a/data_structures/binary_indexed_tree/C++/README.md b/data_structures/binary_indexed_tree/README.md similarity index 100% rename from data_structures/binary_indexed_tree/C++/README.md rename to data_structures/binary_indexed_tree/README.md diff --git a/data_structures/heap/README.md b/data_structures/heap/README.md new file mode 100644 index 0000000000..9f87e1a82e --- /dev/null +++ b/data_structures/heap/README.md @@ -0,0 +1,23 @@ +# Heap +One implementation of the Priority Queue ADT. A heap data structure looks similar to a binary tree (but an implementation doesn't have to be binary), and additionally satisfies one of the following rules: +1. any given node is greater than or equal to its parent node +2. any given node is less than or equal to its parent node + +Heaps are created as either a MaxHeap or MinHead, which determines which of the preceeding rules it implements. A MinHeap will satisfy the first rule, making the root node the smallest in the tree and the MaxHeap will satisfy the second rule, making the root the largest in the tree. Because the rules only care about parent/child relationships, nothing can be said when comparing nodes at the same level of a heap. +The main functions expected from a Heap implementation are deleteMax (or deleteMin, depending on the type), insert, and peek. DeleteMax returns and removes the value at the top of the heap, insert adds a value to the heap, and peek return the value at the top without removing it. +When using a heap, the logic of maintaining the order is hidden from the user, so its important to understand the concept of heapify. +# Heapfiy - Max Heap +Every time a value is inserted or deleted, the heap needs to rearrange itself to maintain its rule. Lets start with insertion: +1. Put the new value at the first available position (the bottom of the heap). +2. If this new value is smaller than its parent, swap positions with it. +3. Repeat until the new value is smaller than its parent node (or we reach the top of the heap). + +Deletion: +1. Remove the item from the top of the heap +2. Put the last item in the heap (farthest down the heap) at the top +3. While this node is greater than either of its children, swap its position with the largest of its children + +Both of these will result in maintaining a heap structure and complete in a reasonable O(log(n)) time when using a binary tree. +Also interesting to note is that by magic of math http://www.geeksforgeeks.org/time-complexity-of-building-a-heap/ , building a heap is accomplished in O(n) time. + +Further reading: https://en.wikipedia.org/wiki/Heap_(data_structure) \ No newline at end of file diff --git a/data_structures/segment_tree/C++/README.md b/data_structures/segment_tree/README.md similarity index 100% rename from data_structures/segment_tree/C++/README.md rename to data_structures/segment_tree/README.md From 5bc6816f73d173355dcb532abda9628c7fee1c15 Mon Sep 17 00:00:00 2001 From: b30bd351371c686298d32281b337e8e9 Date: Sat, 14 Oct 2017 21:02:35 -0500 Subject: [PATCH 134/355] Added Sudoku Backtracking in C Added C implementation of solving a 9x9 Sudoku puzzle in C --- backtracking/sudoku/c/sudoku.c | 177 +++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 backtracking/sudoku/c/sudoku.c diff --git a/backtracking/sudoku/c/sudoku.c b/backtracking/sudoku/c/sudoku.c new file mode 100644 index 0000000000..0f6e348862 --- /dev/null +++ b/backtracking/sudoku/c/sudoku.c @@ -0,0 +1,177 @@ +//Author: Simon W. + +#include +#include +#include + +#define board_max 9 +#define true 1 +#define false 0 + +int check_board(int sudoku_board[][board_max], int row, int col, int num); //board validation with paramters - active sudoku board, row index, col index, digit comparator +int solve_sudoku(int sudoku_board[][board_max], int row, int col); //just backtracking through the whole board to solve the board +int find_value(int duplicate_board_value, int solved_board_value); +void color_print(int s, int found); + +int main() +{ + //define indexing variables, board to be copied into to print colored values and puzzle board + int x, y, iterations = 0, copy_board[board_max][board_max], sudoku_puzzle[board_max][board_max] = { {0,0,0,0,8,0,1,0,0}, + {0,0,3,0,0,0,2,0,4}, + {4,0,0,2,0,0,0,0,7}, + {0,9,0,5,0,0,0,0,0}, + {5,0,0,8,0,3,0,7,1}, + {0,8,4,0,0,0,0,5,6}, + {0,0,7,3,0,0,0,1,0}, + {0,6,9,0,0,1,8,0,0}, + {0,0,0,0,4,0,0,0,0} }; + //COPY the board so we can check if the values in our solved table are from the original table + //this way we can change the color of the newly found values when printing + for (x = 1; x < board_max + 1; ++x) + { + for (y = 1; y < board_max + 1; ++y) { + copy_board[x - 1][y - 1] = sudoku_puzzle[x - 1][y - 1]; + } + } + + //PRINT the unsolved board + printf("======The UNSOLVED puzzle======\n"); + printf(" +++++++++++++++++++\n"); //simple method of formatting the table - 19 characters + for (x = 1; x < board_max+1; ++x) + { + printf(" "); + for (y = 1; y < board_max+1; ++y) { + if (sudoku_puzzle[x - 1][y - 1] == 0) { + printf("|"); + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | 4); //set the output color to red + printf("%d", sudoku_puzzle[x - 1][y - 1]); + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | 15); //set the output color back to white + } + else { + printf("|%d", sudoku_puzzle[x - 1][y - 1]); //print the number normally + } + } + printf("| \n"); + if (x % 3 == 0) { + printf(" +++++++++++++++++++\n"); //when you come to the end of a row, print + } + } + + //===Here we begin solving the puzzle=== + printf("\n======The SOLVED puzzle======\n"); + if (solve_sudoku(sudoku_puzzle, 0, 0)) //if we able to traverse the table - solve it + { + printf(" +++++++++++++++++++\n"); //simple method of formatting the table - 19 characters + for (x = 1; x < board_max+1; ++x) + { + printf(" "); + for (y = 1; y < board_max+1; ++y) { + printf("|"); + int check = find_value(copy_board[x - 1][y - 1], sudoku_puzzle[x - 1][y - 1]); //checking if the number exists in the original table + if (!check) { + color_print(sudoku_puzzle[x - 1][y - 1], false); //solve the puzzle and return the value to the console but color it GREEN + } + else { + color_print(sudoku_puzzle[x - 1][y - 1], true); //the value should be one of the original values in the given puzzle, return it to the console and print it WHITE + } + } + printf("| \n"); + if (x % 3 == 0) { + printf(" +++++++++++++++++++\n"); //when you come to the end of a row, print //more formatting lines for each nonet + } + } + } + else { + printf("\n\n****ERROR****\n\n"); + } + return 0; +} + +int solve_sudoku(int sudoku_board[][board_max], int row, int col) { + if (row < board_max && col < board_max) { //if we are able to index through valid locations + if (sudoku_board[row][col]) { //indexing - if there is a valid number at at an indice that is not 0 + if ((col + 1) < board_max) { //if the current column plus 1 is less than 9 - allows us to compare the adjacent column + return solve_sudoku(sudoku_board, row, col + 1); //try all the numbers that could be at this index recursively + } + else if ((row + 1) < board_max) { //same goes for rows + return solve_sudoku(sudoku_board, row + 1, 0); //same here + } + else { + return 1; //f1 + } + } //end if + else { //for values that are zero + for (int input = 1; input <= board_max; ++input) { //testing valid numbers, do not start at 0 + if (check_board(sudoku_board, row, col, input)) { //check if the number can be there validly + sudoku_board[row][col] = input; //input the number + if ((col + 1) < board_max) { + if (solve_sudoku(sudoku_board, row, col + 1)) { + return 1; //f2 + } + else { + sudoku_board[row][col] = 0; + } + } + else if ((row + 1) < board_max){ + if (solve_sudoku(sudoku_board, row + 1, 0)) { + return 1; //f3 + } + else { + sudoku_board[row][col] = 0; + } + } + else { + return 1; //f4 + } //end if + } //end if + } //end for + } //end else + return 0; + } //end if + else { + return 1; + } +} + +int check_board(int sudoku_board[][board_max], int row, int col, int num) { + int row_index_start = (row / 3) * 3; //curent starting row index - important to note integer trucation + int col_index_start = (col / 3) * 3; //current starting column index + + //going through the entire table, by row and by column + for (int i = 0; i < board_max; ++i){//indexing, start at 0 + if (sudoku_board[row_index_start + (i % 3)][col_index_start + (i / 3)] == num) { //check the values in the current nonet (3x3 box) + return 0; + } + if (sudoku_board[row][i] == num) {//clheck all of the indices in the current row + return 0; + } + if (sudoku_board[i][col] == num) { //check all of the indices in the current column + return 0; + } + } + return 1; +} + +int find_value(int duplicate_board_value, int solved_board_value) { + + if (duplicate_board_value == solved_board_value) { + return 1; //if the value in the original board matches + } + else { + return 0; + } +} + +void color_print(int s, int found) +{ + if (found == true) + { + printf("%d", s); //print like normal + } + else if (found == false) + { + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | 2); //set the output color to green + printf("%d", s); //print + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | 15); //change it back to white + } +} \ No newline at end of file From c369b0c1ef9f6addd88061137ad0f41e90fe8d24 Mon Sep 17 00:00:00 2001 From: Abe Ramseyer Date: Sat, 14 Oct 2017 21:01:09 -0500 Subject: [PATCH 135/355] Added README files for avl and moved some other misplaced ones to correct locations --- .../{queue/cpp => Queue}/README.md | 0 data_structures/Stack/C++/.DS_Store | Bin 6148 -> 0 bytes .../{stack/cpp => Stack}/README.md | 0 data_structures/avl_tree/README.md | 26 ++++++++++++++++++ .../binarySearch_tree/{C++ => }/README.md | 0 .../binary_indexed_tree/{C++ => }/README.md | 0 data_structures/heap/README.md | 24 ++++++++++++++++ .../segment_tree/{C++ => }/README.md | 0 8 files changed, 50 insertions(+) rename data_structures/{queue/cpp => Queue}/README.md (100%) delete mode 100644 data_structures/Stack/C++/.DS_Store rename data_structures/{stack/cpp => Stack}/README.md (100%) create mode 100644 data_structures/avl_tree/README.md rename data_structures/binarySearch_tree/{C++ => }/README.md (100%) rename data_structures/binary_indexed_tree/{C++ => }/README.md (100%) create mode 100644 data_structures/heap/README.md rename data_structures/segment_tree/{C++ => }/README.md (100%) diff --git a/data_structures/queue/cpp/README.md b/data_structures/Queue/README.md similarity index 100% rename from data_structures/queue/cpp/README.md rename to data_structures/Queue/README.md diff --git a/data_structures/Stack/C++/.DS_Store b/data_structures/Stack/C++/.DS_Store deleted file mode 100644 index af68596058b96ae4d642949dc6545736d646565c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO-}+b5Pd}s7%v=50&v6k`8m)9(4h*p4p}saycexWD_Yt_7joRdqmNrW z0bcn`@v$@hvl4$?h@Y@$SxZlaJR5#ThBemZ?{IgOJiW#|x;AxezawkT_f^Tqrin3N z3>X7@!T|Sdk!b49+P zI1MFgsEbz&r{T2w=$Ayy6*U|#UOrsx*~J@*3%xVH5AJY@qLs#gF;HgUK$~6J|1Wpn z|I0zvG6sx+y<)(%N9kzDA;rD5HaOX9J@tVqB7V8zHiVV171LL?;vO{!?OrOxBx0^e Q3&josfd(s#fj?#72LiECqW}N^ diff --git a/data_structures/stack/cpp/README.md b/data_structures/Stack/README.md similarity index 100% rename from data_structures/stack/cpp/README.md rename to data_structures/Stack/README.md diff --git a/data_structures/avl_tree/README.md b/data_structures/avl_tree/README.md new file mode 100644 index 0000000000..dedae24f46 --- /dev/null +++ b/data_structures/avl_tree/README.md @@ -0,0 +1,26 @@ +# AVL Tree +An avl tree is a specific type of binary search tree that automatically balances itself (and all of its subtrees). At any given moment, any given subtree height will differ at most by 1. Maintaining a balanced tree is beneficial because it allows a user to search for a value within it in O(log(n)) time. +The main components to implementing a binary search tree are determining balance factors and implementing proper rotations. +# Balance Factors +A balance factor is simple. Every node has one, and it indicates the difference in height between its two subtrees. ![A balanced binary search tree](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/AVL-tree-wBalance_K.svg/262px-AVL-tree-wBalance_K.svg.png) + +Note that even though this tree appears unbalanced, it is still considered balanced because every balance factor is 1, 0, or -1. As with many tree data structures, certain functions of it can be easily accomplished recursively. Determining a node's balance factor is one such function. +# Rotations +Once we have our balance factors, we use them to determine when a tree needs to be adjusted. Balancing happens as nodes are inserted or deleted, so every time the tree is changed rotations may happen. There are 4 cases for rotations: +1. Left Left: a given node has the BF (balance factor) -2 and its left child has BF -1. To balance, rotate clockwise around the node. +2. Right Right: a given node has the BF +2 and its right child has BF +1. To balance, rotate counter-clockwise around the node. +3. Left Right: a given node has a BF of -2 and its left child BF is +1. To balance, rotate left around child, then right around parent. +3. Right Left: a given node has a BF of +2 and its right child BF is -1. To balance, rotate right around child, then left around parent. + +# Arrays +While it makes sense to define some simple struct or class to represent each node in the form + + class TreeNode { + int data; + TreeNode left; + TreeNode right; + } +where left and right are references to a node's children, it's worth mentioning that binary trees can be easily represented in arrays as pictured by the following: +![enter image description here](http://opendatastructures.org/versions/edition-0.1d/ods-java/img1166.png) + +any given node at index *i* has children at indices *2i+1* and *2i+2* (for a 0-indexed array). \ No newline at end of file diff --git a/data_structures/binarySearch_tree/C++/README.md b/data_structures/binarySearch_tree/README.md similarity index 100% rename from data_structures/binarySearch_tree/C++/README.md rename to data_structures/binarySearch_tree/README.md diff --git a/data_structures/binary_indexed_tree/C++/README.md b/data_structures/binary_indexed_tree/README.md similarity index 100% rename from data_structures/binary_indexed_tree/C++/README.md rename to data_structures/binary_indexed_tree/README.md diff --git a/data_structures/heap/README.md b/data_structures/heap/README.md new file mode 100644 index 0000000000..dfbd0cc0fc --- /dev/null +++ b/data_structures/heap/README.md @@ -0,0 +1,24 @@ +# Heap +One implementation of the Priority Queue ADT. A heap data structure looks similar to a binary tree (but an implementation doesn't have to be binary), and additionally satisfies one of the following rules: +1. any given node is greater than or equal to its parent node +2. any given node is less than or equal to its parent node + +Heaps are created as either a MaxHeap or MinHead, which determines which of the preceeding rules it implements. A MinHeap will satisfy the first rule, making the root node the smallest in the tree and the MaxHeap will satisfy the second rule, making the root the largest in the tree. Because the rules only care about parent/child relationships, nothing can be said when comparing nodes at the same level of a heap. +The main functions expected from a Heap implementation are deleteMax (or deleteMin, depending on the type), insert, and peek. DeleteMax returns and removes the value at the top of the heap, insert adds a value to the heap, and peek return the value at the top without removing it. +When using a heap, the logic of maintaining the order is hidden from the user, so its important to understand the concept of heapify. +# Heapfiy - Max Heap +Every time a value is inserted or deleted, the heap needs to rearrange itself to maintain its rule. Lets start with insertion: +1. Put the new value at the first available position (the bottom of the heap). +2. If this new value is smaller than its parent, swap positions with it. +3. Repeat until the new value is smaller than its parent node (or we reach the top of the heap). + +Deletion: +1. Remove the item from the top of the heap +2. Put the last item in the heap (farthest down the heap) at the top +3. While this node is greater than either of its children, swap its position with the largest of its children + +Both of these will result in maintaining a heap structure and complete in a reasonable O(log(n)) time when using a binary tree. +Also interesting to note is that by magic of math http://www.geeksforgeeks.org/time-complexity-of-building-a-heap/ , building a heap is accomplished in O(n) time. + +Similar to other binary trees, a heap can be represented using an array. See the avl tree README for reference. +Further reading: https://en.wikipedia.org/wiki/Heap_(data_structure) \ No newline at end of file diff --git a/data_structures/segment_tree/C++/README.md b/data_structures/segment_tree/README.md similarity index 100% rename from data_structures/segment_tree/C++/README.md rename to data_structures/segment_tree/README.md From e9f4e31e0e6f9074e9dd1277694082e48902993b Mon Sep 17 00:00:00 2001 From: Elias Valencia Date: Sat, 14 Oct 2017 22:50:46 -0500 Subject: [PATCH 136/355] Added red and black tree --- .../C++/RedAndBlackTree.pro | 14 + .../red_and_black_tree/C++/binary_tree.h | 330 ++++++++++++++++++ .../red_and_black_tree/C++/function_object.h | 19 + .../red_and_black_tree/C++/main.cpp | 32 ++ data_structures/red_and_black_tree/C++/node.h | 86 +++++ .../red_and_black_tree/C++/test_tree_binary.h | 69 ++++ 6 files changed, 550 insertions(+) create mode 100644 data_structures/red_and_black_tree/C++/RedAndBlackTree.pro create mode 100644 data_structures/red_and_black_tree/C++/binary_tree.h create mode 100644 data_structures/red_and_black_tree/C++/function_object.h create mode 100644 data_structures/red_and_black_tree/C++/main.cpp create mode 100644 data_structures/red_and_black_tree/C++/node.h create mode 100644 data_structures/red_and_black_tree/C++/test_tree_binary.h diff --git a/data_structures/red_and_black_tree/C++/RedAndBlackTree.pro b/data_structures/red_and_black_tree/C++/RedAndBlackTree.pro new file mode 100644 index 0000000000..d9b0df5c23 --- /dev/null +++ b/data_structures/red_and_black_tree/C++/RedAndBlackTree.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +CONFIG += console +CONFIG -= app_bundle +CONFIG -= qt +CONFIG += c++11 + +SOURCES += main.cpp + +HEADERS += \ + function_object.h \ + node.h \ + binary_tree.h \ + test_tree_binary.h + diff --git a/data_structures/red_and_black_tree/C++/binary_tree.h b/data_structures/red_and_black_tree/C++/binary_tree.h new file mode 100644 index 0000000000..38f90084bc --- /dev/null +++ b/data_structures/red_and_black_tree/C++/binary_tree.h @@ -0,0 +1,330 @@ +#ifndef BINARY_TREE_H +#define BINARY_TREE_H + +#include +#include "node.h" +#include "function_object.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +template +struct TraitLess{ + typedef T DataType; + typedef Less cmp_Type; +}; + +template +struct TraitGreatest{ + typedef T DataType; + typedef Greatest cmp_Type; +}; + +template +class RedBlackTree +{ +private: + typedef typename Tr::DataType T; + typedef typename Tr::cmp_Type C; + typedef Node node; + typedef pair< Node**, bool > pair_node_path; + C cmp_; +public: + Node* root_; + RedBlackTree(); + ~RedBlackTree(); + + bool find(T /*n*/, Node** &/*p_ */,vector< pair_node_path > &/*vectorNodes*/ ); + + bool insert(T /*n*/); + bool remove(T /*n*/); + void liberate_memory(Node* /*p*/); + void print_inorder(Node* /*p*/); + void inorder_to_string(Node* /*p*/, string &/*ret*/); + void print_tree_in_png(string /*filename_*/); + void change_colors(Node** &/*p*/); + Node** get_replace(Node**/*p*/); + string string_to_export_in_dot(); + + void balance_vector(vector< pair_node_path > &/*p_*/); + void rotation_simple(node **& /*p_*/, bool side); + + //RedBlack Functions + bool is_black(Node * /*p_*/); + void balance_add(stack< Node** > &/*stack_nodes_*/); +}; + +template +RedBlackTree::RedBlackTree() +{ + this->root_ = 0; +} + +template +void RedBlackTree::liberate_memory(Node *p){ + if(!p)return; + liberate_memory(p->b_leaf_[0]); + delete p; + liberate_memory(p->b_leaf_[1]); +} + +template +RedBlackTree::~RedBlackTree(){ + Node* p = this->root_; + this->liberate_memory(p); +} + +template +bool RedBlackTree::find(T n, Node** &p, vector< pair_node_path > &vectorNodes) +{ + vectorNodes.clear(); + p = &root_; + while (*p) { + if ((*p)->b_data_==n) { + return 1; + } + bool side = cmp_((*p)->b_data_,n); + pair_node_path pair_tmp; + pair_tmp.first = p; + pair_tmp.second = side; + p=&(*p)->b_leaf_[side]; + vectorNodes.push_back(pair_tmp); + } + return 0; +} + +template +Node** RedBlackTree::get_replace(Node** p_){ + srand(time(NULL) ); + bool change_ = rand()%2; + Node** temp_ = &(*p_)->b_leaf_[change_]; + while ( (*temp_)->b_leaf_[!change_] ) + temp_ = &(*temp_)->b_leaf_[!change_]; + return temp_; +} + +template +bool RedBlackTree::remove(T n){ + /* To remove elements from a tree + * we have 3 cases + * when the node does not have leaf (Case 0) + * when the node does not have 1 leaf (Case 1) + * and when the node have the 2 leafs (Case 2) + */ + Node** p; + Node** q; + if(!find(n,p)) return 0; + bool left = !!(*p)->b_leaf_[0]; + bool right = !!(*p)->b_leaf_[1]; + //Case 2 + if(left & right){ + q = get_replace(p); + (*p)->b_data_ = (*q)->b_data_; + p = q; + left = !!(*p)->b_leaf_[0]; + right = !!(*p)->b_leaf_[1]; + } + //Case 1 + if(left | right){ + Node* t = *p; + *p = (*p)->b_leaf_[right]; + delete t; + return 1; + } + else{ + //Otherwise Case 0 + delete *p; + *p = 0; + return 1; + } +} + + +template +bool RedBlackTree::insert(T n){ + vector< pair_node_path > path; + Node** p_; + if( find(n,p_,path) ) return 0; + //Node* q = new Node(n); + (*p_) = new Node(n); + pair_node_path pair_p; + pair_p.first = p_; + pair_p.second = 0; + + path.push_back(pair_p); + + int sizeVector = path.size(); + if(sizeVector < 3){ + if( !this->is_black( this->root_ ) ){ + this->root_->change_color(); + } + return 1; + } + this->balance_vector(path); + if( !this->is_black( this->root_ ) ){ + this->root_->change_color(); + } + return 1; +} + +template +void RedBlackTree::change_colors(Node** &p_){ + (*p_)->color_ = BLACK; + (*p_)->b_leaf_[0]->color_ = RED; + (*p_)->b_leaf_[1]->color_ = RED; +} + +template +void RedBlackTree::balance_vector(vector &path){ + int i = path.size()-2; + if((*path[i].first)->color_ == RED ){ + bool side = (path[i].second); + bool side2 = (path[i-1].second); + node **brother = &(*path[i-1].first)->b_leaf_[!side2]; + if( !!(*brother) && (*brother)->color_ == RED ){ + (*brother)->color_ = BLACK; + (*path[i-1].first)->color_ = RED; + (*path[i].first)->color_ = BLACK; + (*path[i+1].first)->color_ = RED; + } + else if(side == side2 /*&& ( (*brother)->color_ == BLACK && !!(*brother) )*/ ){ + this->rotation_simple(path[i-1].first,side); + this->change_colors(path[i-1].first); + } + else{ + + this->rotation_simple(path[i].first,side); + this->rotation_simple(path[i-1].first,side2); + this->change_colors(path[i-1].first); + } + } + if(i<2){ + return; + } + else{ + i -= 2; + for(;i>0;i-=2){ + if((*path[i].first)->color_ == RED && (*path[i+1].first)->color_ == RED){ + bool side = (path[i].second); + bool side2 = (path[i-1].second); + node **brother = &(*path[i-1].first)->b_leaf_[!side2]; + if( !!(*brother) && (*brother)->color_ == RED ){ + (*brother)->color_ = BLACK; + (*path[i-1].first)->color_ = RED; + (*path[i].first)->color_ = BLACK; + (*path[i+1].first)->color_ = RED; + } + else if(side == side2 /*&& ( (*brother)->color_ == BLACK && !!(*brother) )*/ ){ + this->rotation_simple(path[i-1].first,side); + this->change_colors(path[i-1].first); + } + else{ + this->rotation_simple(path[i].first,side); + this->rotation_simple(path[i-1].first,side2); + this->change_colors(path[i-1].first); + } + + } + } + } + return; +} + +//This function will make a rotation simple, the parameter +//pos will define the type of rotation, 0 is for left +//and 1 is for right +template +void RedBlackTree::rotation_simple(node** &p_, bool pos){ + node* N = *p_; + (*p_) = (*p_)->b_leaf_[pos]; + if( !!(*p_)->b_leaf_[!pos] ){ + N->b_leaf_[pos] = (*p_)->b_leaf_[!pos]; + } + else{ + N->b_leaf_[pos] = NULL; + } + (*p_)->b_leaf_[!pos] = N; + N = NULL; +} + +template +bool RedBlackTree::is_black(Node* p_){ + if( !p_ || p_->color_ == BLACK ){ + return true; + } + return false; +} + +template +void RedBlackTree::balance_add(stack **> &stack_nodes_){ + +} + +//End of AVL functions + +template +void RedBlackTree::print_inorder(Node* p){ + if(!p){ + return; + } + print_inorder(p->b_leaf_[0]); + cout << p->b_data_ << endl; + print_inorder(p->b_leaf_[1]); + +} + +template +void RedBlackTree::inorder_to_string(Node* p,string &ret){ + if(!p){ + return; + } + inorder_to_string(p->b_leaf_[0],ret); + if(p->getNodeInfo()!=""){ + ret += p->getNodeInfo(); + ret += '\n'; + } + inorder_to_string(p->b_leaf_[1],ret); + +} + +template +string RedBlackTree::string_to_export_in_dot(){ + string ret; + ret += "digraph treeBinary {"; + ret += '\n'; + ret += "node [color=grey, style=filled];"; + ret += '\n'; + string tmp; + inorder_to_string(this->root_,tmp); + ret += tmp; + ret += '\n'; + ret += "}"; + return ret; +} + +template +void RedBlackTree::print_tree_in_png(string filename_){ + string extDot= filename_+".dot"; + string extPNG = filename_+".dot"; + string genDot = "dot -Tpng "+filename_+".dot > "+filename_+".png"; + string seePNG = "gwenview "+filename_+".png"; + ofstream out(extDot.c_str()); + //in the function tree.string_to_export_in_dot is the magic + out << this->string_to_export_in_dot(); + out.close(); + //its time to generate the png + system(genDot.c_str()); + //this is optional, if you dont like, only remove + system(seePNG.c_str()); + +} + + + +#endif // BINARY_TREE_H diff --git a/data_structures/red_and_black_tree/C++/function_object.h b/data_structures/red_and_black_tree/C++/function_object.h new file mode 100644 index 0000000000..3f78ddf9bd --- /dev/null +++ b/data_structures/red_and_black_tree/C++/function_object.h @@ -0,0 +1,19 @@ +#ifndef FUNCTION_OBJECT_H +#define FUNCTION_OBJECT_H + +template +struct Greatest{ + inline bool operator()(T a,T b){ + return a +struct Less{ + inline bool operator()(T a,T b){ + return a>b; + } +}; + + +#endif // FUNCTION_OBJECT_H diff --git a/data_structures/red_and_black_tree/C++/main.cpp b/data_structures/red_and_black_tree/C++/main.cpp new file mode 100644 index 0000000000..77c348ca12 --- /dev/null +++ b/data_structures/red_and_black_tree/C++/main.cpp @@ -0,0 +1,32 @@ +#include +#include "binary_tree.h" +//#include "test_tree_binary.h" +#include +#include +#include +#include +#include + +using namespace std; + +int main() +{ + srand(time(NULL)); + RedBlackTree< TraitGreatest > tree; + for(int i=1;i<200;i++){ + int a = rand()%128; + tree.insert(a); + cout << a << endl; + } + +// tree.insert(10); +// tree.insert(85); +// tree.insert(15); +// tree.insert(70); +// tree.insert(20); + + + //tree.print_inorder(tree.root_); + tree.print_tree_in_png("agasg"); + return 0; +} diff --git a/data_structures/red_and_black_tree/C++/node.h b/data_structures/red_and_black_tree/C++/node.h new file mode 100644 index 0000000000..fe68a34b55 --- /dev/null +++ b/data_structures/red_and_black_tree/C++/node.h @@ -0,0 +1,86 @@ +#ifndef NODE_H +#define NODE_H + +#include +#include +#include + +using namespace std; + + +enum Colors{RED,BLACK}; + +//macro to cast for a string +#define SSTR( x ) dynamic_cast< std::ostringstream & >( \ + ( std::ostringstream() << std::dec << x ) ).str() + +template +class Node{ + public: + Node(T data_){ + this->color_ = RED; + this->b_data_ = data_; + this->b_leaf_[0] = NULL; + this->b_leaf_[1] = NULL; + this->labelColors[0] = "red"; + this->labelColors[1] = "grey"; + } + Node(){ + this->color_ = RED; + this->b_leaf_[0] = NULL; + this->b_leaf_[1] = NULL; + } + string labelColors[2]; + T b_data_; + Node*b_leaf_[2]; + int black_height_; + Colors color_; + + string getNodeInfo(){ + string ret; + if( !(this->b_leaf_[0]) && !(this->b_leaf_[1])){ + ret += SSTR(this->b_data_)+" [color=black, "+"fillcolor="+this->labelColors[color_]+"]"; + ret += '\n'; + } + else{ + if( !(this->b_leaf_[0]) ){ + ret += SSTR(this->b_data_)+" [color=black, "+"fillcolor="+this->labelColors[color_]+"]"; + ret += '\n'; + ret += SSTR(this->b_data_); + ret += "->"; + ret += SSTR(this->b_leaf_[1]->b_data_); + } + else if( !(this->b_leaf_[1]) ){ + ret += SSTR(this->b_data_)+" [color=black, "+"fillcolor="+this->labelColors[color_]+"]"; + ret += '\n'; + ret += SSTR(this->b_data_); + ret += "->"; + ret += SSTR(this->b_leaf_[0]->b_data_); + } + else{ + ret += SSTR(this->b_data_)+" [color=black, "+"fillcolor="+this->labelColors[color_]+"]"; + ret += '\n'; + ret += SSTR(this->b_data_); + ret += "->"; + ret += SSTR(this->b_leaf_[0]->b_data_); + ret += '\n'; + ret += SSTR(this->b_data_); + ret += "->"; + ret += SSTR(this->b_leaf_[1]->b_data_); + } + } + return ret; + } + + void change_color(){ + if( this->color_ == RED ){ + this->color_ = BLACK; + return; + } + this->color_ = RED; + return; + } + +}; + +#endif // NODE_H diff --git a/data_structures/red_and_black_tree/C++/test_tree_binary.h b/data_structures/red_and_black_tree/C++/test_tree_binary.h new file mode 100644 index 0000000000..c802652949 --- /dev/null +++ b/data_structures/red_and_black_tree/C++/test_tree_binary.h @@ -0,0 +1,69 @@ +#ifndef TEST_TREE_BINARY_H +#define TEST_TREE_BINARY_H + +//#include "binary_tree.h" +//#include + +//class TestAvlTree{ +// public: +// TestAvlTree(){ + +// } +// void run_tests(){ +// this->test_insert(); +// this->test_find(); +// this->test_remove(); +// } + +// void test_insert(){ +// AvlTree< TraitGreatest > tree; +// tree.insert(7); +// tree.insert(6); +// tree.insert(9); + +// assert(tree.root_->b_leaf_[0]->b_data_ < tree.root_->b_data_); +// assert(tree.root_->b_leaf_[1]->b_data_ > tree.root_->b_data_); +// assert(tree.root_->b_data_ == 7); +// } +// void test_remove(){ +// AvlTree< TraitGreatest > tree; +// tree.insert(7); +// tree.insert(6); +// tree.insert(9); +// tree.insert(1); +// //I will test the case 0: +// tree.remove(1); +// Node** p; +// assert( (tree.find(1,p)) == 0 ); +// //I need insert the element again +// tree.insert(1); + +// //Now I will test the case 1 +// tree.remove(9); +// Node** q; +// assert( tree.find(9,q) == 0 ); +// //I need insert the element again +// tree.insert(9); + +// //Now I will test the case 2 +// tree.remove(7); +// Node** r; +// assert( tree.find(7,r) == 0 ); +// //I need insert the element again +// tree.insert(9); + +// } +// void test_find(){ +// AvlTree< TraitGreatest > tree; +// tree.insert(7); +// tree.insert(6); +// tree.insert(9); +// tree.insert(1); + +// Node** r; +// assert( tree.find(7,r) ); +// } + +//}; + +#endif // TEST_TREE_BINARY_H From fb39ba0bd78fdcb55a829a5b6831924c0a45b92b Mon Sep 17 00:00:00 2001 From: Elias Valencia Date: Sat, 14 Oct 2017 22:55:38 -0500 Subject: [PATCH 137/355] deleted bad test --- .../red_and_black_tree/C++/test_tree_binary.h | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 data_structures/red_and_black_tree/C++/test_tree_binary.h diff --git a/data_structures/red_and_black_tree/C++/test_tree_binary.h b/data_structures/red_and_black_tree/C++/test_tree_binary.h deleted file mode 100644 index c802652949..0000000000 --- a/data_structures/red_and_black_tree/C++/test_tree_binary.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef TEST_TREE_BINARY_H -#define TEST_TREE_BINARY_H - -//#include "binary_tree.h" -//#include - -//class TestAvlTree{ -// public: -// TestAvlTree(){ - -// } -// void run_tests(){ -// this->test_insert(); -// this->test_find(); -// this->test_remove(); -// } - -// void test_insert(){ -// AvlTree< TraitGreatest > tree; -// tree.insert(7); -// tree.insert(6); -// tree.insert(9); - -// assert(tree.root_->b_leaf_[0]->b_data_ < tree.root_->b_data_); -// assert(tree.root_->b_leaf_[1]->b_data_ > tree.root_->b_data_); -// assert(tree.root_->b_data_ == 7); -// } -// void test_remove(){ -// AvlTree< TraitGreatest > tree; -// tree.insert(7); -// tree.insert(6); -// tree.insert(9); -// tree.insert(1); -// //I will test the case 0: -// tree.remove(1); -// Node** p; -// assert( (tree.find(1,p)) == 0 ); -// //I need insert the element again -// tree.insert(1); - -// //Now I will test the case 1 -// tree.remove(9); -// Node** q; -// assert( tree.find(9,q) == 0 ); -// //I need insert the element again -// tree.insert(9); - -// //Now I will test the case 2 -// tree.remove(7); -// Node** r; -// assert( tree.find(7,r) == 0 ); -// //I need insert the element again -// tree.insert(9); - -// } -// void test_find(){ -// AvlTree< TraitGreatest > tree; -// tree.insert(7); -// tree.insert(6); -// tree.insert(9); -// tree.insert(1); - -// Node** r; -// assert( tree.find(7,r) ); -// } - -//}; - -#endif // TEST_TREE_BINARY_H From 17354f2fa0536ae3db6aab59f875eb9a402a8743 Mon Sep 17 00:00:00 2001 From: Kushagra Nagori Date: Sun, 15 Oct 2017 09:58:21 +0530 Subject: [PATCH 138/355] toposort in python with example included in the code --- .../python/topological_sorting.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 graphsearch/topological_sorting/python/topological_sorting.py diff --git a/graphsearch/topological_sorting/python/topological_sorting.py b/graphsearch/topological_sorting/python/topological_sorting.py new file mode 100644 index 0000000000..9b113d9e31 --- /dev/null +++ b/graphsearch/topological_sorting/python/topological_sorting.py @@ -0,0 +1,43 @@ +graph_tasks = { "wash the dishes" : ["have lunch"], + "cook food" : ["have lunch"], + "have lunch" : [], + "wash laundry" : ["dry laundry"], + "dry laundry" : ["fold laundry"], + "fold laundry" : [] } + + +def dfs_topsort(graph): # recursive dfs with + L = [] # additional list for order of nodes + color = { u : "white" for u in graph } + found_cycle = [False] + for u in graph: + if color[u] == "white": + dfs_visit(graph, u, color, L, found_cycle) + if found_cycle[0]: + break + + if found_cycle[0]: # if there is a cycle, + L = [] # then return an empty list + + L.reverse() # reverse the list + return L # L contains the topological sort + + +def dfs_visit(graph, u, color, L, found_cycle): + if found_cycle[0]: + return + color[u] = "gray" + for v in graph[u]: + if color[v] == "gray": + found_cycle[0] = True + return + if color[v] == "white": + dfs_visit(graph, v, color, L, found_cycle) + color[u] = "black" # when we're done with u, + L.append(u) # add u to list (reverse it later!) + + +order = dfs_topsort(graph_tasks) + +for task in order: + print(task) From 187ac905d302cbe01e2e3d31f90a07d5217cc1f5 Mon Sep 17 00:00:00 2001 From: Kushagra Nagori Date: Sun, 15 Oct 2017 10:52:17 +0530 Subject: [PATCH 139/355] bfs implementation in python --- graphsearch/breadth-first-search/python/bfs.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 graphsearch/breadth-first-search/python/bfs.py diff --git a/graphsearch/breadth-first-search/python/bfs.py b/graphsearch/breadth-first-search/python/bfs.py new file mode 100644 index 0000000000..65027d0860 --- /dev/null +++ b/graphsearch/breadth-first-search/python/bfs.py @@ -0,0 +1,17 @@ +import collections + +def bfs(graph, root): + visited, queue = set(), collections.deque([root]) + visited.add(root) + while queue: + vertex = queue.popleft() + for neighbour in graph[vertex]: + if neighbour not in visited: + visited.add(neighbour) + queue.append(neighbour) + + +if __name__ == '__main__': + graph = {0: [1, 2], 1: [2], 2: [3], 3: [1,2]} + bfs(graph, 0) + # print graph From 8b5f18f75abf31b26d1a60cc198c53906b06e76f Mon Sep 17 00:00:00 2001 From: rohitrango Date: Sun, 15 Oct 2017 12:22:35 +0530 Subject: [PATCH 140/355] Rod Cutting: Solution added in Python --- dp/rod_cutting/python/rodCutting.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 dp/rod_cutting/python/rodCutting.py diff --git a/dp/rod_cutting/python/rodCutting.py b/dp/rod_cutting/python/rodCutting.py new file mode 100644 index 0000000000..f50f6cc720 --- /dev/null +++ b/dp/rod_cutting/python/rodCutting.py @@ -0,0 +1,21 @@ +def rodCutting(res, prices, n): + if(n==1): + res[1] = prices[1] + else: + # call recursively + rodCutting(res, prices, n-1) + maxval = prices[n] + for i in xrange(1, n): + maxval = max(maxval, prices[i] + res[n-i]) + res[n] = maxval + + +n = input("Enter value of n: ") +res = [-1]*(n+1) +prices = [-1]*(n+1) +for i in xrange(n): + prices[i+1] = input("") + +rodCutting(res, prices, n) + +print("Max. amount by cutting rods is: %d"%res[n]) From a3791a812f962b32f0323aa6fa0d240ecc180e57 Mon Sep 17 00:00:00 2001 From: zuzanatoldyova Date: Sat, 14 Oct 2017 23:58:56 -0700 Subject: [PATCH 141/355] towers of hanoi in javascript --- math/towers_of_hanoi/javascript/towers_of_hanoi.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 math/towers_of_hanoi/javascript/towers_of_hanoi.js diff --git a/math/towers_of_hanoi/javascript/towers_of_hanoi.js b/math/towers_of_hanoi/javascript/towers_of_hanoi.js new file mode 100644 index 0000000000..36d28e5e28 --- /dev/null +++ b/math/towers_of_hanoi/javascript/towers_of_hanoi.js @@ -0,0 +1,10 @@ +function move( n, src, dest, temp ) { + + if (n >= 1) { + move(n - 1, src, temp, dest); + console.log(`Moving ${src} -> ${dest}`); + move(n - 1, temp, dest, src); + } +} + +move(3,1,3,2); From 99088486009b9725cd3510019cec07639d0d26b8 Mon Sep 17 00:00:00 2001 From: nghiaxlee Date: Sun, 15 Oct 2017 10:55:25 +0200 Subject: [PATCH 142/355] LCS with O(n) mem --- .../cpp/lcs_O(n)_memory.cpp | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 dp/longest_common_subsequence/cpp/lcs_O(n)_memory.cpp diff --git a/dp/longest_common_subsequence/cpp/lcs_O(n)_memory.cpp b/dp/longest_common_subsequence/cpp/lcs_O(n)_memory.cpp new file mode 100644 index 0000000000..e14771558a --- /dev/null +++ b/dp/longest_common_subsequence/cpp/lcs_O(n)_memory.cpp @@ -0,0 +1,41 @@ +//Longest Common Subsequence with O(n ^ 2) complexity and O(n) memory +/* Test: + In: 5 6 + 1 1 2 3 5 1000 + 1000 3 5 1 1 2 + Out: 3 +*/ + + + +#include + +using namespace std; + +int a[100005], b[100005], f[100005]; +int n, m; + +void process() { + memset(f, 0, sizeof(f)); + for(int i = 1; i <= m; ++i) { + int u = 0; + for(int j = 1; j <= n; ++j) { + if (a[i] == b[j] && f[j] < f[u] + 1) f[j] = f[u] + 1; + else if (f[u] < f[j]) u = j; // find max value of f to update; + } + } + + //for(int i = 1; i <= n; ++i) cout << f[i] << ' '; +} + +int main() { + ios_base::sync_with_stdio(false); cin.tie(NULL); + cin >> m >> n; + for(int i = 1; i <= m; ++i) cin >> a[i]; + for(int i = 1; i <= n; ++i) cin >> b[i]; + + process(); + + cout << *max_element(f + 1, f + n + 1); + return 0; +} \ No newline at end of file From bf39f9f974ee7e98b7100a11948bf3586f14f3dd Mon Sep 17 00:00:00 2001 From: Aman Bansal Date: Sun, 15 Oct 2017 15:24:19 +0530 Subject: [PATCH 143/355] Added ruby implementation of the sum of digits --- math/sum_of_digits/ruby/sum_of_digits.rb | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 math/sum_of_digits/ruby/sum_of_digits.rb diff --git a/math/sum_of_digits/ruby/sum_of_digits.rb b/math/sum_of_digits/ruby/sum_of_digits.rb new file mode 100644 index 0000000000..f667f19004 --- /dev/null +++ b/math/sum_of_digits/ruby/sum_of_digits.rb @@ -0,0 +1,25 @@ +# Function to calculate the sum of digits +def sum_of_digits (num = 0) +######################################################################################################################### + #The Algorithm for finding the sum_of_digits(num) of a given number is as follows: + # If num = 0 then sum_of_digits(num) = 0 + # Else + # extract the last digit of num + # add the last digit to the total sum + # drop the last digit of the number + # Repeat until num is not equal to 0 +######################################################################################################################### + sum = 0 + while (num != 0) + digit = num % 10 # To extract the last digit of the number + num /= 10 # Drop the last digit of the number + sum += digit # Add the digit to the total sum + end + return sum +end + +# Take a number from the user as input and output the sum of the digits of the number +print("Enter a number: ") +num = gets.chomp.to_i +sum = sum_of_digits(num) +print("The sum of digits of " + num.to_s + " is " + sum.to_s + "\n") From b350ac8f1d29960f3f5eae68b4254a6c59965e5d Mon Sep 17 00:00:00 2001 From: shikhar96 Date: Sun, 15 Oct 2017 15:54:56 +0530 Subject: [PATCH 144/355] Added greedy knapsack. --- greedy/knapsack_problem/C/greedyknap.c | 73 ++++++++++++++++++++++++++ greedy/knapsack_problem/README.md | 0 2 files changed, 73 insertions(+) create mode 100644 greedy/knapsack_problem/C/greedyknap.c create mode 100644 greedy/knapsack_problem/README.md diff --git a/greedy/knapsack_problem/C/greedyknap.c b/greedy/knapsack_problem/C/greedyknap.c new file mode 100644 index 0000000000..b3822c9f1e --- /dev/null +++ b/greedy/knapsack_problem/C/greedyknap.c @@ -0,0 +1,73 @@ +#include +void knapsack(int n, float weight[], float profit[], float capacity) { + float x[20], tp = 0; + int i, j, u; + u = capacity; + + for (i = 0; i < n; i++) + x[i] = 0.0; + + for (i = 0; i < n; i++) { + if (weight[i] > u) + break; + else { + x[i] = 1.0; + tp = tp + profit[i]; + u = u - weight[i]; + } + } + + if (i < n) + x[i] = u / weight[i]; + + tp = tp + (x[i] * profit[i]); + + printf("\nThe result vector is:- "); + for (i = 0; i < n; i++) + printf("%f\t", x[i]); + + printf("\nMaximum profit is:- %f", tp); + +} + +int main() { + float weight[20], profit[20], capacity; + int num, i, j; + float ratio[20], temp; + + printf("\nEnter the no. of objects:- "); + scanf("%d", &num); + + printf("\nEnter the weights and profits of each object:- "); + for (i = 0; i < num; i++) { + scanf("%f %f", &weight[i], &profit[i]); + } + + printf("\nEnter the capacity of knapsack:- "); + scanf("%f", &capacity); + + for (i = 0; i < num; i++) { + ratio[i] = profit[i] / weight[i]; + } + + for (i = 0; i < num; i++) { + for (j = i + 1; j < num; j++) { + if (ratio[i] < ratio[j]) { + temp = ratio[j]; + ratio[j] = ratio[i]; + ratio[i] = temp; + + temp = weight[j]; + weight[j] = weight[i]; + weight[i] = temp; + + temp = profit[j]; + profit[j] = profit[i]; + profit[i] = temp; + } + } + } + + knapsack(num, weight, profit, capacity); + return(0); +} \ No newline at end of file diff --git a/greedy/knapsack_problem/README.md b/greedy/knapsack_problem/README.md new file mode 100644 index 0000000000..e69de29bb2 From f023918697b2acc147a2a5e0e9fb5635eb483364 Mon Sep 17 00:00:00 2001 From: Abinash Date: Sun, 15 Oct 2017 16:09:21 +0530 Subject: [PATCH 145/355] implementation --- sort/python_bucket_sort/python/input.txt | 2 ++ sort/python_bucket_sort/python/output.txt | 1 + 2 files changed, 3 insertions(+) create mode 100644 sort/python_bucket_sort/python/input.txt create mode 100644 sort/python_bucket_sort/python/output.txt diff --git a/sort/python_bucket_sort/python/input.txt b/sort/python_bucket_sort/python/input.txt new file mode 100644 index 0000000000..66f88591ee --- /dev/null +++ b/sort/python_bucket_sort/python/input.txt @@ -0,0 +1,2 @@ +4 34 5 +16 27 23 15 9 5 17 33 \ No newline at end of file diff --git a/sort/python_bucket_sort/python/output.txt b/sort/python_bucket_sort/python/output.txt new file mode 100644 index 0000000000..d0f818aad1 --- /dev/null +++ b/sort/python_bucket_sort/python/output.txt @@ -0,0 +1 @@ +[5, 9, 15, 16, 17, 23, 27, 33] From 231bb9c1c8c86ac315b751a7bc0adbace6d65364 Mon Sep 17 00:00:00 2001 From: Aman Bansal Date: Sun, 15 Oct 2017 16:09:32 +0530 Subject: [PATCH 146/355] Added ruby implementation of the linear search --- search/linear_search/ruby/linear_search.rb | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 search/linear_search/ruby/linear_search.rb diff --git a/search/linear_search/ruby/linear_search.rb b/search/linear_search/ruby/linear_search.rb new file mode 100644 index 0000000000..4d480a9817 --- /dev/null +++ b/search/linear_search/ruby/linear_search.rb @@ -0,0 +1,32 @@ +# Function implementing Linear search Algorithm +def linear_search (arr, size, num) +######################################################################################################################### + #The Linear Search Algorithm for finding if a number is present in an array is as follows: + # Iterate linearly through the array + # If the current number is equal to the number to be searched => Return the INDEX of the current number + # Else go to next number + # If number not found in the given array => Return -1 +######################################################################################################################### + for i in 0..(size-1) + if(arr[i] == num) + return i + end + end + return -1 +end + +# Take the size of the array, the array and the number to search as an input and output the INDEX of the number if it is present else output "Number not found!" +print("Enter size of the arrray: ") +size = gets.chomp.to_i +print("Enter the elements of the array: ") +arr = gets.split.map(&:to_i) +print("Enter the number to be searched: ") +num = gets.chomp.to_i + +idx = linear_search(arr, size, num) + +if(idx == -1) + print("Number not found!\n") +else + print("Number found in the array at index " + idx.to_s + "\n") +end From 8ec9532ef28c6734975c6e0ddaff8f4c215c8957 Mon Sep 17 00:00:00 2001 From: shikhar96 Date: Sun, 15 Oct 2017 16:11:44 +0530 Subject: [PATCH 147/355] Added README --- greedy/knapsack_problem/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/greedy/knapsack_problem/README.md b/greedy/knapsack_problem/README.md index e69de29bb2..f77b64a86a 100644 --- a/greedy/knapsack_problem/README.md +++ b/greedy/knapsack_problem/README.md @@ -0,0 +1,13 @@ +Knapsack Problem + +Problem Scenario: +A thief is robbing a store and can carry a maximal weight of W into his knapsack. There are n items available in the store and weight of ith item is wi and its profit is pi. What items should the thief take? + +In this context, the items should be selected in such a way that the thief will carry those items for which he will gain maximum profit. Hence, the objective of the thief is to maximize the profit. + +Algorithm: +Assume knapsack holds weight W and items have value vi and weight wi +Rank items by value/weight ratio: vi / wi +Thus: vi / wi ≥ vj / wj, for all i ≤ j +Consider items in order of decreasing ratio +Take as much of each item as possible \ No newline at end of file From 6adf544060dfebef44e70a9d640a2dbb443bc057 Mon Sep 17 00:00:00 2001 From: Brad Davies Date: Sun, 15 Oct 2017 12:47:36 +0100 Subject: [PATCH 148/355] Add perfect number function (JavaScript) --- .../javascript/perfect-number.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 math/perfect_number/javascript/perfect-number.js diff --git a/math/perfect_number/javascript/perfect-number.js b/math/perfect_number/javascript/perfect-number.js new file mode 100644 index 0000000000..cbae96bf8c --- /dev/null +++ b/math/perfect_number/javascript/perfect-number.js @@ -0,0 +1,24 @@ +/** + * Checks whether the given number is perfect + * @param {Number} n The number to test + * @return true if the number is perfect, else false + */ +function isPerfect (n) { + if (n % 2 === 1) return false // Odd perfect numbers don't exist (probably!) + let result = 1 // 1 is always a divisor, so start with it already added + let i = 2 // Start from i = 2 (as 1 is always true) + // Loop until i <= sqrt of n + while (i * i <= n) { + if (n % i === 0) result += i + n / i + i++ + } + // If a pefect square, then sqroot of n was added an extra time, so remove + if (i * i === n) result -= i + return result === n +} + +console.log(isPerfect(6)) // true +console.log(isPerfect(28)) // true +console.log(isPerfect(496)) // true +console.log(isPerfect(8128)) // true +console.log(isPerfect(16723)) // false From 91c0de00fe484b77f100aff71a49001e9d395c5d Mon Sep 17 00:00:00 2001 From: Prakriti-nith Date: Sun, 15 Oct 2017 08:16:00 -0400 Subject: [PATCH 149/355] Create Prakriti_insertionSort.cpp C++ program for insertion sort --- .../c++/Prakriti_insertionSort.cpp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 sort/insertion_sort/c++/Prakriti_insertionSort.cpp diff --git a/sort/insertion_sort/c++/Prakriti_insertionSort.cpp b/sort/insertion_sort/c++/Prakriti_insertionSort.cpp new file mode 100644 index 0000000000..16e4fef333 --- /dev/null +++ b/sort/insertion_sort/c++/Prakriti_insertionSort.cpp @@ -0,0 +1,29 @@ +#include +using namespace std; +int main() +{ + cout<<"Enter the number of items: "; + int n,item; + cin>>n; + int a[n]; + //input for array items + for(int i=0;i>a[i]; + //sorting + for(int i=1;iitem && j>=0) + { a[j+1]=a[j]; + j--; + } + a[j+1]=item; + } + } + for(int i=0;i Date: Sun, 15 Oct 2017 08:31:08 -0400 Subject: [PATCH 150/355] Create shell sort.cpp --- sort/shell_sort/cpp/shell sort.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 sort/shell_sort/cpp/shell sort.cpp diff --git a/sort/shell_sort/cpp/shell sort.cpp b/sort/shell_sort/cpp/shell sort.cpp new file mode 100644 index 0000000000..94d6a0b7c0 --- /dev/null +++ b/sort/shell_sort/cpp/shell sort.cpp @@ -0,0 +1,27 @@ +#include +using namespace std; +int main() +{ + int a[20],n,j,gap,item; + cout<<"Enter the number of elements: "; + cin>>n; + gap=n/2; + for(int i=0;i>a[i]; + while(gap>=1) + { + for(int i=gap;i=0 && a[j]>item;j=j-gap) + { + a[j+gap]=a[j]; + } + a[j+gap]=item; + } + gap=gap/2; + } + for(int i=0;i Date: Sun, 15 Oct 2017 09:02:08 -0400 Subject: [PATCH 151/355] Merge Sort in C++ --- sort/merge_sort/c++/Lavesh_MergeSort.cpp | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sort/merge_sort/c++/Lavesh_MergeSort.cpp diff --git a/sort/merge_sort/c++/Lavesh_MergeSort.cpp b/sort/merge_sort/c++/Lavesh_MergeSort.cpp new file mode 100644 index 0000000000..582d83ef69 --- /dev/null +++ b/sort/merge_sort/c++/Lavesh_MergeSort.cpp @@ -0,0 +1,58 @@ +#include +using namespace std; +void merge(int *a,int p,int q,int r) +{ + int lb1=p,ub1=q,lb2=q+1,ub2=r,n1=q-p+1,n2=r-q; + int arr[n1+n2+1],k=1,i,j; + for(i=lb1,j=lb2;i<=ub1 && j<=ub2;k++) + { + if(a[i]>a[j]) + { + arr[k]=a[j]; + j++; + } + else + { arr[k]=a[i]; + i++; + } + } + while(i<=ub1) + { + arr[k++]=a[i]; + i++; + } + while(j<=ub2) + { + arr[k++]=a[j]; + j++; + } + for(int i=1;i>n; + int a[n+1]; + for(int i=1;i<=n;i++) + cin>>a[i]; + int p=1,r=n; + merge_sort(a,p,r); + for(int i=1;i<=n;i++) + cout< Date: Sun, 15 Oct 2017 18:32:33 +0530 Subject: [PATCH 152/355] Add: Egyptian Fraction (Greedy) --- .../cpp/egyptian_fraction.cpp | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 greedy/egyptian_fraction/cpp/egyptian_fraction.cpp diff --git a/greedy/egyptian_fraction/cpp/egyptian_fraction.cpp b/greedy/egyptian_fraction/cpp/egyptian_fraction.cpp new file mode 100644 index 0000000000..7f112c28b2 --- /dev/null +++ b/greedy/egyptian_fraction/cpp/egyptian_fraction.cpp @@ -0,0 +1,60 @@ +/* +Greedy Algorithm for Egyptian Fraction +Every positive fraction can be represented as sum of unique unit fractions. +A fraction is unit fraction if numerator is 1 and denominator is a positive +integer, for example 1/3 is a unit fraction. Such a representation is called +Egyptian Fraction as it was used by ancient Egyptians. + +Following are few examples: + +Egyptian Fraction Representation of 2/3 is 1/2 + 1/6 +Egyptian Fraction Representation of 6/14 is 1/3 + 1/11 + 1/231 +Egyptian Fraction Representation of 12/13 is 1/2 + 1/3 + 1/12 + 1/156 +*/ + +#include +#include +#include + +using namespace std; +void egyptian(int nr, int dr, vector >& res){ + if(dr == 0 || nr == 0){ + return; + } + + if(dr%nr == 0){ + res.push_back(pair(1, dr/nr)); + return; + } + + + if(nr%dr == 0){ + res.push_back(pair(dr/nr, 1)); + } + //ceil + if(nr > dr){ + res.push_back(pair(nr/dr, 1)); + egyptian(nr%dr, dr, res); + } + + int c = dr/nr + 1; + res.push_back(pair(1, c)); + + egyptian(nr*c - dr*1, dr*c, res); +} + +void printVecPair(vector > res){ + for(int i=0; i > res; + int nr = 12, dr = 13; + egyptian(nr, dr, res); + + printVecPair(res); + return 0; +} \ No newline at end of file From 9e0410dda29610d2929eb1982b7094d5f21ddacd Mon Sep 17 00:00:00 2001 From: sks147 Date: Sun, 15 Oct 2017 18:35:52 +0530 Subject: [PATCH 153/355] Update Readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f86b22e673..0b6da64879 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ Clean example implementations of data structures and algorithms written in diffe * [kruskal's algorithm](greedy/kruskal's_algorithm) * [prim's algorithm](greedy/prim's_algorithm) * [job sequencing problem](greedy/Job_sequencing_problem) + * [egyptian fraction](greedy/egyptian_fraction) * [Graphs](graphsearch) * [breadth-first-search](graphsearch/breadth-first-search) * [depth-first-search](graphsearch/depth-first-search) From 8d78a534619b02c103038336476aff76b822be36 Mon Sep 17 00:00:00 2001 From: Lavesh2702 <32814899+Lavesh2702@users.noreply.github.com> Date: Sun, 15 Oct 2017 09:10:20 -0400 Subject: [PATCH 154/355] SinglyLinkedList in C++ --- .../linked_list/C++/Lavesh_singlyLinkedList | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 data_structures/linked_list/C++/Lavesh_singlyLinkedList diff --git a/data_structures/linked_list/C++/Lavesh_singlyLinkedList b/data_structures/linked_list/C++/Lavesh_singlyLinkedList new file mode 100644 index 0000000000..90f943562b --- /dev/null +++ b/data_structures/linked_list/C++/Lavesh_singlyLinkedList @@ -0,0 +1,143 @@ +#include +#include +using namespace std; +struct node +{ + int info; + node * link; +}; +int main() +{ + int n,item; + node *start; + start=NULL; + do + { + cout<<"1.Insert a new node\n2.Delete a node\n3.Find a node with given data\n4.Find middle of Linked List\n5.Insert a node with " + <<"some data before another node\n6.Exit"; + cin>>n; + switch(n) + { + case 1: + { + node *newnode=new node(); + node *ptr; + cout<<"Enter the info of node"; + cin>>item; + newnode.info=item; + newnode.link=NULL; + if(start==NULL) + { + start=newnode; + } + else + { + ptr=start; + while(ptr.link!=NULL) + { + ptr=ptr.link; + } + ptr.link=newnode; + } + break; + } + case 2: + { + int item; + cout<<"Enter the info of the node to be deleted"; + cin>>item; + + } + case 3: + { + cout<<"Enter the data to find"; + cin>>item; + node *ptr,*loc; + ptr=start; + while(ptr!=NULL) + { + if(ptr.info==item) + { + loc=ptr; + break; + } + ptr=ptr.link; + } + if(loc!=NULL) + cout<<"Found at address: "<>x>>y; + node *newnode=new node(); + newnode.info=x; + if(ptr.info==y) + { + newnode.link=ptr; + start=newnode; + } + else + { while(ptr.info!=y) + { + ptr=ptr.link; + } + while(ptr2.link!=ptr) + { + ptr2=ptr2.link; + } + newnode.link=ptr; + ptr2.link=newnode; + } + } + } + } + while(n!=6); + return 0; +} From e954ddeece9311c5aa4d23b89ea94c785b1630d3 Mon Sep 17 00:00:00 2001 From: Lavesh2702 <32814899+Lavesh2702@users.noreply.github.com> Date: Sun, 15 Oct 2017 09:13:10 -0400 Subject: [PATCH 155/355] Heap Sort in C++ --- sort/heap_sort/c++/LaveshHeapSort.cpp | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 sort/heap_sort/c++/LaveshHeapSort.cpp diff --git a/sort/heap_sort/c++/LaveshHeapSort.cpp b/sort/heap_sort/c++/LaveshHeapSort.cpp new file mode 100644 index 0000000000..92004ed84b --- /dev/null +++ b/sort/heap_sort/c++/LaveshHeapSort.cpp @@ -0,0 +1,52 @@ +#include +using namespace std; +void swap(int &a,int &b) +{ + int t; + t=a; + a=b; + b=t; +} +void maxheap(int *a,int n,int i) +{ + //if(n==1) + // return; + int max=i; + if(i*2+1a[max]) + { max=i*2+1; + } + else if(i*2+2a[max]) + { + max=i*2+2; + } + if(max!=i) + { + swap(a[i],a[max]); + maxheap(a,n,max); + } +} +void heapsort(int *a,int n) +{ int k=n; + for(int i=n/2-1;i>=0;i--) + maxheap(a,n,i); + for(int i=0;i>n; + int a[n]; + for(int i=0;i>a[i]; + heapsort(a,n); + for(int i=0;i Date: Sun, 15 Oct 2017 22:20:32 +0900 Subject: [PATCH 156/355] Add dinic's algorithm written by c++ --- .../dinics_algorithm/c++/dinics_algorithm.cpp | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 graphsearch/dinics_algorithm/c++/dinics_algorithm.cpp diff --git a/graphsearch/dinics_algorithm/c++/dinics_algorithm.cpp b/graphsearch/dinics_algorithm/c++/dinics_algorithm.cpp new file mode 100644 index 0000000000..f84f19abfd --- /dev/null +++ b/graphsearch/dinics_algorithm/c++/dinics_algorithm.cpp @@ -0,0 +1,113 @@ +#include +#include +#include +#include + +struct edge +{ + int to; + int cap; + int rev; +}; + +class dinic +{ +private: + int INF; + std::vector G[100000]; + int level[100000]; + int iter[100000]; + +public: + dinic(); + void add_edge(int from,int to,int cap); + void bfs(int s); + int dfs(int v,int t,int f); + int maximum_flow(int s,int t); +}; + +dinic::dinic() +{ + INF=0x7fffffff; + std::fill(level,level+100000,0); + std::fill(iter,iter+100000,0); +} + +void dinic::add_edge(int from,int to,int cap) +{ + G[from].push_back((edge){to,cap,(int)G[to].size()}); + G[to].push_back((edge){from,0,(int)G[from].size()-1}); +} + +void dinic::bfs(int s) +{ + std::memset(level,-1,sizeof(level)); + std::queue que; + level[s]=0; + que.push(s); + while(!que.empty()) + { + int v=que.front(); + que.pop(); + for(int i=0;i<(int)G[v].size();i++) + { + edge &e=G[v][i]; + if(e.cap>0&&level[e.to]<0) + { + level[e.to]=level[v]+1; + que.push(e.to); + } + } + } +} + +int dinic::dfs(int v,int t,int f) +{ + if(v==t) return f; + for(int &i=iter[v];i<(int)G[v].size();i++) + { + edge &e=G[v][i]; + if(e.cap>0&&level[v]0) + { + e.cap-=d; + G[e.to][e.rev].cap+=d; + return d; + } + } + } + return 0; +} + +int dinic::maximum_flow(int s,int t) +{ + int flow=0; + for(;;) + { + bfs(s); + if(level[t]<0) + return flow; + std::memset(iter,0,sizeof(iter)); + int f; + while((f=dfs(s,t,INF))>0) + flow+=f; + } +} + +int main() +{ + int V,E; + int u,v,c; + int i; + dinic g; + std::cin>>V>>E; + for(i=0;i>u>>v>>c; + g.add_edge(u,v,c); + } + std::cout< Date: Sun, 15 Oct 2017 18:56:12 +0530 Subject: [PATCH 157/355] Adding splay trees implementation in C++ --- .../Splay_trees/C++/splay_trees.cpp | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 data_structures/Splay_trees/C++/splay_trees.cpp diff --git a/data_structures/Splay_trees/C++/splay_trees.cpp b/data_structures/Splay_trees/C++/splay_trees.cpp new file mode 100644 index 0000000000..0c139398e0 --- /dev/null +++ b/data_structures/Splay_trees/C++/splay_trees.cpp @@ -0,0 +1,221 @@ +// Contributed by Riya Pannu. + +#include +using namespace std; + +struct node{ //Tree node + int key; + node *left; + node *right; +}; + +//Allocating a new node with the given key and left and right pointers +node* GetNewNode(int key){ + node* NewNode=new node(); + NewNode->key=key; + NewNode->left=NULL; + NewNode->right=NULL; + return NewNode; +} + +// Function to right rotate subtree rooted with y +node *rightRotate(node *x) +{ + node *y = x->left; + x->left = y->right; + y->right = x; + return y; +} + +// Function to left rotate subtree rooted with x +node *leftRotate(node *x) +{ + node *y = x->right; + x->right = y->left; + y->left = x; + return y; +} + +//If key is found, that node is splayed and it becomes the new root +//else the last node accessed prior to reaching NULL becomes the root. +// This function returns the new node. + +node *splay(struct node *root, int key) +{ + // Base cases: root is NULL or key is present at root + if (root == NULL || root->key == key) + return root; + + // Key lies in left subtree + if (root->key > key) + { + + if (root->left == NULL) return root; + + // Zig-Zig + if (root->left->key > key) + { + // Recursively bring the key as root of left-left + root->left->left = splay(root->left->left, key); + + // Do first rotation for root, second rotation is done after else + root = rightRotate(root); + } + else if (root->left->key < key) // Zig-Zag + { + // Recursively bring the key as root of left-right + root->left->right = splay(root->left->right, key); + + // Do first rotation for root->left + if (root->left->right != NULL) + root->left = leftRotate(root->left); + } + + // Do second rotation for root + return (root->left == NULL)? root: rightRotate(root); + } + else // Key lies in right subtree + { + + if (root->right == NULL) return root; + + // Zag-Zig + if (root->right->key > key) + { + // Bring the key as root of right-left + root->right->left = splay(root->right->left, key); + + // Do first rotation for root->right + if (root->right->left != NULL) + root->right = rightRotate(root->right); + } + else if (root->right->key < key)// Zag-Zag + { + // Bring the key as root of right-right and do first rotation + root->right->right = splay(root->right->right, key); + root = leftRotate(root); + } + + // Do second rotation for root + return (root->right == NULL)? root: leftRotate(root); + } +} + +struct node *search(struct node *root, int key) +{ + return splay(root, key); +} + +// Print preorder traversal of the tree. +void preOrder(node *root) +{ + if (root != NULL) + { + cout<key<left); + preOrder(root->right); + } +} + +// Function to insert a new key k in splay tree with given root +node *insert(struct node *root, int k) +{ + // Simple Case: If tree is empty + if (root == NULL) return GetNewNode(k); + + // Bring the closest leaf node to root + root = splay(root, k); + + // If key is already present, then return + if (root->key == k) return root; + + // Otherwise allocate memory for new node + node *newnode = GetNewNode(k); + + // If root's key is greater, make root as right child + // of newnode and copy the left child of root to newnode + if (root->key > k) + { + newnode->right = root; + newnode->left = root->left; + root->left = NULL; + } + + // If root's key is smaller, make root as left child + // of newnode and copy the right child of root to newnode + else + { + newnode->left = root; + newnode->right = root->right; + root->right = NULL; + } + + return newnode; // newnode becomes new root +} + +// Delete function for Splay tree. +// Returns the new root of Splay Tree after removing the key +node* delete_key(node *root, int key) +{ + node *temp; + if (!root) + return NULL; + + // Splay the given key + root = splay(root, key); + + // If key is not present, then return root + if (key != root->key) + return root; + + // If key is present + // If left child of root does not exist + // make root->right as root + if (!root->left) + { + temp = root; + root = root->right; + } + + // Else if left child exits + else + { + temp = root; + + root = splay(root->left, key); + + // Make right child of previous root as new root's right child + root->right = temp->right; + } + + // Free the the node containing the key + free(temp); + + // Return root of the new Splay Tree + return root; + +} + +int main() +{ + node *root = GetNewNode(200); + root->left = GetNewNode(150); + root->right = GetNewNode(300); + root->left->left = GetNewNode(140); + root->left->left->left = GetNewNode(130); + root->left->left->left->left = GetNewNode(120); + root = search(root, 120); + cout<<"Preorder traversal of the modified Splay tree is \n"; + preOrder(root); + root = insert(root, 125); + cout<<"Preorder traversal of the modified Splay tree is \n"; + preOrder(root); + int key = 140; + root = delete_key(root, key); + cout<<"Preorder traversal of the modified Splay tree is \n"; + preOrder(root); + return 0; +} + + + From e476d8567c14c3ad2b2bbeacf0c25f263d5cb2fc Mon Sep 17 00:00:00 2001 From: sketch873 Date: Sun, 15 Oct 2017 17:37:40 +0300 Subject: [PATCH 158/355] Adding BinarySearchTree.java --- .../Java/BinarySearchTree.java | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 data_structures/binarySearch_tree/Java/BinarySearchTree.java diff --git a/data_structures/binarySearch_tree/Java/BinarySearchTree.java b/data_structures/binarySearch_tree/Java/BinarySearchTree.java new file mode 100644 index 0000000000..b47a1ce190 --- /dev/null +++ b/data_structures/binarySearch_tree/Java/BinarySearchTree.java @@ -0,0 +1,158 @@ +public class BinarySearchTree { + private int value; + private BinarySearchTree left; + private BinarySearchTree right; + + public BinarySearchTree(int value) { + this.value = value; + this.left = null; + this.right = null; + } + + public String printInorder(BinarySearchTree root) { + String result = ""; + + if(root.left != null) { + result = result + root.printInorder(root.left); + } + + result = result + root.value; + + if(root.right != null) { + result = result + root.printInorder(root.right); + } + + return result; + } + + public int height(BinarySearchTree root) { + if(root == null) { + return 0; + } + + int left = 1 + root.height(root.left); + int right = 1 + root.height(root.right); + + if(left > right) { + return left; + } else { + return right; + } + } + + public String printPreorder(BinarySearchTree root) { + String result = ""; + + result = result + root.value; + + if(root.left != null) { + result = result + root.printPreorder(root.left); + } + + if(root.right != null) { + result = result + root.printPreorder(root.right); + } + + return result; + } + + public String printPostorder(BinarySearchTree root) { + String result = ""; + + if(root.left != null) { + result = result + root.printPostorder(root.left); + } + + if(root.right != null) { + result = result + root.printPostorder(root.right); + } + + result = result + root.value; + + return result; + } + + public BinarySearchTree makeNode(int value) { + BinarySearchTree node = new BinarySearchTree(value); + return node; + } + + public int minimum(BinarySearchTree root) { + if(root != null) { + while(root.left != null) { + root = root.left; + } + return root.value; + } + return -1; + } + + public BinarySearchTree delete(BinarySearchTree root, int value) { + if(root == null) { + return root; + } + + if(root.value > value) { + root.left = root.delete(root.left, value); + } else if(root.value < value) { + root.right = root.delete(root.right, value); + } else { + if(root.left != null && root.right != null) { + int tmp = root.minimum(root.right); + root.value = tmp; + root.right = root.delete(root.right, tmp); + } else { + BinarySearchTree tmp = root; + if(root.left != null) { + root = root.left; + } else { + root = root.right; + } + } + } + + return root; + } + + public BinarySearchTree addNode(BinarySearchTree root, int value) { + if(root == null) { + root = root.makeNode(value); + } else if(root.value == value) { + return root; + } else if(root.value > value) { + if(root.left == null) { + root.left = root.makeNode(value); + } else { + root.left = root.addNode(root.left, value); + } + } else if(root.value < value) { + if(root.right == null) { + root.right = root.makeNode(value); + } else { + root.right = root.addNode(root.right, value); + } + } + + return root; + } + + public static void main(String []args) { + BinarySearchTree tree = null; + tree = new BinarySearchTree(5); + tree = tree.addNode(tree, 3); + tree = tree.addNode(tree, 2); + tree = tree.addNode(tree, 4); + tree = tree.addNode(tree, 7); + tree = tree.addNode(tree, 6); + tree = tree.addNode(tree, 8); + + System.out.println("Inorder: " + tree.printInorder(tree)); + System.out.println("Postorder: " + tree.printPostorder(tree)); + System.out.println("Preorder: " + tree.printPreorder(tree)); + System.out.println("Height: " + tree.height(tree)); + + tree = tree.delete(tree, 5); + + System.out.println("Inorder: " + tree.printInorder(tree)); + } +} From a4b6633d6846c1ecc9a682ce7e945df4f66c94d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Goca?= Date: Sun, 15 Oct 2017 17:08:36 +0200 Subject: [PATCH 159/355] Added russian peasant in php. Added russian peasant in php. --- math/russian_peasant/php/russian_peasant.php | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 math/russian_peasant/php/russian_peasant.php diff --git a/math/russian_peasant/php/russian_peasant.php b/math/russian_peasant/php/russian_peasant.php new file mode 100644 index 0000000000..7776437432 --- /dev/null +++ b/math/russian_peasant/php/russian_peasant.php @@ -0,0 +1,21 @@ + 0) { + if ($a % 2 == 1) { + $result += $b; + } + $a >>= 1; + $b <<= 1; + } + + return $result; +} + +if (russianPeasant(5, 15) != 75) { + echo "Test failed."; +} else { + echo "Test passed."; +} From 8288f39858b5c32d9b2633501ec9fc41fd614fde Mon Sep 17 00:00:00 2001 From: Anurag Mehta Date: Mon, 16 Oct 2017 00:06:32 +0530 Subject: [PATCH 160/355] polybius cipher in java with updated README --- README.md | 1 + cryptography/polybius_cipher/README.md | 11 +++ .../polybius_cipher/java/polybius.java | 86 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 cryptography/polybius_cipher/README.md create mode 100644 cryptography/polybius_cipher/java/polybius.java diff --git a/README.md b/README.md index f86b22e673..56f9b75b08 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ Clean example implementations of data structures and algorithms written in diffe * [chinese cipher](cryptography/chinese_cipher) * [codewheel](cryptography/codewheel) * [end to end](cryptography/end_to_end) + * [polybius cipher](cryptography/polybius_cipher) * [Greedy](greedy) * [dijkstra’s algorithm](greedy/dijkstra’s_algorithm) * [kruskal's algorithm](greedy/kruskal's_algorithm) diff --git a/cryptography/polybius_cipher/README.md b/cryptography/polybius_cipher/README.md new file mode 100644 index 0000000000..d743590bdd --- /dev/null +++ b/cryptography/polybius_cipher/README.md @@ -0,0 +1,11 @@ +### Polybius cipher + +In cryptography, the Polybius square, also known as the Polybius checkerboard, is a device invented by the Ancient Greek historian and scholar Polybius, for fractionating plaintext characters so that they can be represented by a smaller set of symbols. + +The Polybius Square is essentially identical to the simple substitution cipher, except that each plaintext character is enciphered as 2 ciphertext characters. It can ususally be detected if there are only 5 or 6 different characters in the ciphertext. + +This algorithm offers very little communication security, and can be easily broken even by hand, especially as the messages become longer (more than several hundred ciphertext characters). + +#### An example of polybius cipher + +[Polybius cipher](http://crypto.interactive-maths.com/polybius-square.html) diff --git a/cryptography/polybius_cipher/java/polybius.java b/cryptography/polybius_cipher/java/polybius.java new file mode 100644 index 0000000000..5b138c2405 --- /dev/null +++ b/cryptography/polybius_cipher/java/polybius.java @@ -0,0 +1,86 @@ +import java.util.Scanner; +public class polybious { + + void cipher(String plainText) + + { + + plainText=plainText.toUpperCase(); + + plainText=plainText.replaceAll(" ",""); + + plainText=plainText.replaceAll("J","I"); + + + + char allchar[][] = {{'A','B','C','D','E'},{'F','G','H','I','K'}, + + {'L','M','N','O','P'}, {'Q','R','S','T','U'},{'V','W','X','Y','Z'}}; + + int len=plainText.length(); + + char b; + + System.out.println("Cipher Text is Here :"); + + for(int i=0; i Date: Sun, 15 Oct 2017 21:14:54 +0530 Subject: [PATCH 161/355] Added the producer consumer problem --- .../ProducerConsumer/C/ProducerConsumer.c | 104 ++++++++++++++++++ synchronization/ProducerConsumer/README.md | 5 + 2 files changed, 109 insertions(+) create mode 100644 synchronization/ProducerConsumer/C/ProducerConsumer.c create mode 100644 synchronization/ProducerConsumer/README.md diff --git a/synchronization/ProducerConsumer/C/ProducerConsumer.c b/synchronization/ProducerConsumer/C/ProducerConsumer.c new file mode 100644 index 0000000000..7d1aca1221 --- /dev/null +++ b/synchronization/ProducerConsumer/C/ProducerConsumer.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include +int ITERS; + +int *buffer; +int size, filled; +pthread_mutex_t mutex; +pthread_cond_t prod, cons; +int producers_left, consumers_left; + +void* Producer(void* tNo) { + int t = (int)(*((int *)tNo)); + for(int i=0;icN?pN:cN; + pthread_mutex_init(&mutex, NULL); + pthread_cond_init(&prod, NULL); + pthread_cond_init(&cons, NULL); + + producers_left = pN*ITERS; + consumers_left = cN*ITERS; + + pthread_t *producer = (pthread_t *)malloc(pN * sizeof(pthread_t)); + pthread_t *consumer = (pthread_t *)malloc(cN * sizeof(pthread_t)); + int *threadNo = (int *)malloc(maxN * sizeof(int)); + for(int i=0;i Date: Sun, 15 Oct 2017 17:45:54 +0200 Subject: [PATCH 162/355] Added selection sort in php. --- sort/selection_sort/php/selection_sort.php | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 sort/selection_sort/php/selection_sort.php diff --git a/sort/selection_sort/php/selection_sort.php b/sort/selection_sort/php/selection_sort.php new file mode 100644 index 0000000000..284530a560 --- /dev/null +++ b/sort/selection_sort/php/selection_sort.php @@ -0,0 +1,28 @@ + Date: Sun, 15 Oct 2017 11:17:23 -0500 Subject: [PATCH 163/355] added mergesort in c# --- sort/merge_sort/c#/MergeSortArray.cs | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 sort/merge_sort/c#/MergeSortArray.cs diff --git a/sort/merge_sort/c#/MergeSortArray.cs b/sort/merge_sort/c#/MergeSortArray.cs new file mode 100644 index 0000000000..fd54405293 --- /dev/null +++ b/sort/merge_sort/c#/MergeSortArray.cs @@ -0,0 +1,74 @@ +using System; + +public class Program +{ + + public static int[] MergeSort(int[] arr) + { + int Len = arr.Length; + if(Len < 2) + { + return arr; + } + int MidIdx = Len/2; + int[] LeftArr = new int[MidIdx]; + int[] RightArr = new int[Len-MidIdx]; + for(int i=0;i Date: Sun, 15 Oct 2017 23:28:18 +0530 Subject: [PATCH 164/355] changed c++11 to c++ --- .../c++/README.md | 11 ++++++ dp/longest_increasing_subsequence/c++/lis.cpp | 37 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 dp/longest_increasing_subsequence/c++/README.md create mode 100644 dp/longest_increasing_subsequence/c++/lis.cpp diff --git a/dp/longest_increasing_subsequence/c++/README.md b/dp/longest_increasing_subsequence/c++/README.md new file mode 100644 index 0000000000..7aab5b7051 --- /dev/null +++ b/dp/longest_increasing_subsequence/c++/README.md @@ -0,0 +1,11 @@ +## C++ Implementation + --- + +This implementation can be used with any numeric datatype - i.e. int, unsigned int, long long, float, double etc. + +To run the program, perform the following steps: +1. Create a vector of the required data type and pass it to LIS function. +2. (This will compile the code) On the terminal, type: + ` g++ -std=c++11 -o lis lis.cpp` +3. (This will run the code) On the terminal, type: + ` ./lis ` \ No newline at end of file diff --git a/dp/longest_increasing_subsequence/c++/lis.cpp b/dp/longest_increasing_subsequence/c++/lis.cpp new file mode 100644 index 0000000000..31d5e674e7 --- /dev/null +++ b/dp/longest_increasing_subsequence/c++/lis.cpp @@ -0,0 +1,37 @@ +#include +#include +#include + +using namespace std; + + +// this algorithm supports all numeric data types. +template +multiset LIS(vector const &arr) +{ + multiset lis; + + for(int i = 0; i < arr.size(); i++) + { + lis.insert(arr[i]); + auto it = lis.upper_bound(arr[i]); + if(it != lis.end()) + { + lis.erase(it); + } + } + + return lis; +} + +int main() +{ + vector A{2, 5, 3, 7, 11, 8, 10, 13, 6 }; + + multiset L = LIS(A); + + cout << L.size() << endl; + + return 0; + +} \ No newline at end of file From d10cfd051be03103d550a638f5f6893b7ac56b1b Mon Sep 17 00:00:00 2001 From: Anishka Gupta Date: Mon, 16 Oct 2017 00:02:45 +0530 Subject: [PATCH 165/355] longest palindromic subsequence --- dp/longest_palidromic_subsequence/cpp/dp.cpp | 28 ++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 dp/longest_palidromic_subsequence/cpp/dp.cpp diff --git a/dp/longest_palidromic_subsequence/cpp/dp.cpp b/dp/longest_palidromic_subsequence/cpp/dp.cpp new file mode 100644 index 0000000000..09fea017a6 --- /dev/null +++ b/dp/longest_palidromic_subsequence/cpp/dp.cpp @@ -0,0 +1,28 @@ +#include +using namespace std; + +int main() { + int n; + cin >> n; + int arr[n]; + for (int i=0; i> arr[i]; + int lps[n][n]; + for (int i=0; i=0; i--) { + for (int j=i+1; j Date: Mon, 16 Oct 2017 00:15:53 +0530 Subject: [PATCH 166/355] Create all_topological_sorts.cpp --- .../c++/all_topological_sorts.cpp | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 graphsearch/topological_sorting/c++/all_topological_sorts.cpp diff --git a/graphsearch/topological_sorting/c++/all_topological_sorts.cpp b/graphsearch/topological_sorting/c++/all_topological_sorts.cpp new file mode 100644 index 0000000000..c096f87f10 --- /dev/null +++ b/graphsearch/topological_sorting/c++/all_topological_sorts.cpp @@ -0,0 +1,65 @@ +#include +#include +using namespace std; + +class Graph { + vector> graph; + vector indegree; + public: + Graph (int); + void insert_egde (int, int); + void all_topo_sorts (); + void all_topo_sorts_helper (vector &, vector &); +}; + +Graph :: Graph (int v) { + graph.resize (v); + indegree.resize (v); +} + +void Graph :: insert_egde (int s, int d) { + graph[s].push_back (d); + indegree[d]++; +} + +void Graph :: all_topo_sorts () { + vector topo; + vector visited (graph.size()); + all_topo_sorts_helper (topo, visited); +} + +void Graph :: all_topo_sorts_helper (vector & topo, vector & visited) { + for (int i = 0; i < graph.size(); i++) { + if (indegree[i] == 0 && !visited[i]) { + for (auto j : graph[i]) // reduce indegree of outgoing vertices + indegree[j]--; + topo.push_back (i); // visit this vertex + visited[i] = true; + all_topo_sorts_helper (topo, visited); // recursively call this method; for all vertices which come after this one in the topological sort + visited[i] = false; // now backtracking + topo.erase (topo.end() - 1); + for (auto j : graph[i]) + indegree[j]++; + } + } + if (topo.size() == graph.size()) { + for (int i = 0; i < topo.size(); i++) + cout << topo[i] << " "; + cout << endl; + } +} + +int main() { + int v, e, s, d; + cout << "Enter number of vertices and edges : "; + cin >> v >> e; + Graph g (v); + cout << "Enter the edges :\n"; + for (int i = 0; i < e; i++) { + cin >> s >> d; + g.insert_egde (s, d); + } + cout << "The topological sorts are : \n"; + g.all_topo_sorts(); + return 0; +} From 08541dc46c750fcabf8e02616a42216ed40838b8 Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:48:32 +0200 Subject: [PATCH 167/355] Add Python folder to Stack implementations --- data_structures/Stack/Python/Stack.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data_structures/Stack/Python/Stack.py diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py new file mode 100644 index 0000000000..e69de29bb2 From 90a100f26e5db4df81e9594f92a4d6521d5fb754 Mon Sep 17 00:00:00 2001 From: Anishka Gupta Date: Mon, 16 Oct 2017 00:18:44 +0530 Subject: [PATCH 168/355] Create reverse_string_using_stack.sh --- .../Stack/bash/reverse_string_using_stack.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 data_structures/Stack/bash/reverse_string_using_stack.sh diff --git a/data_structures/Stack/bash/reverse_string_using_stack.sh b/data_structures/Stack/bash/reverse_string_using_stack.sh new file mode 100644 index 0000000000..5f26882bca --- /dev/null +++ b/data_structures/Stack/bash/reverse_string_using_stack.sh @@ -0,0 +1,18 @@ +echo 'Program to reverse a string using stack' +read -p "Please enter your string : " str +len=${#str} +i=0 +until [ ! $i -lt $len ] +do + stack[$i]=${str:i:1} + i=`expr $i + 1` +done +top=`expr $i - 1` +revstr='' +until [ ! $top -gt -1 ] +do + x=${stack[$top]} + revstr=$revstr$x + top=`expr $top - 1` +done +echo "The reversed string is : $revstr" From 1f33bd6d4b4b94c7353263585078536cb852252a Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:49:33 +0200 Subject: [PATCH 169/355] Add Stack class and constructor --- data_structures/Stack/Python/Stack.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py index e69de29bb2..36fdda4700 100644 --- a/data_structures/Stack/Python/Stack.py +++ b/data_structures/Stack/Python/Stack.py @@ -0,0 +1,8 @@ +# Author: AlexBanks97 +# Purpose: LIFO Stack implementation using python array. +# Date: October 15th 2017 + +class Stack(object): + def __init__(self): + # Initialize stack as empty array + self.stack = [] \ No newline at end of file From f177e6acbafa514f6e6ac4563cb92c49f3213618 Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:50:12 +0200 Subject: [PATCH 170/355] Add pop method and implementation --- data_structures/Stack/Python/Stack.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py index 36fdda4700..49a0850e9d 100644 --- a/data_structures/Stack/Python/Stack.py +++ b/data_structures/Stack/Python/Stack.py @@ -5,4 +5,10 @@ class Stack(object): def __init__(self): # Initialize stack as empty array - self.stack = [] \ No newline at end of file + self.stack = [] + + # Return and remove the last element of the stack array. + def pop(self): + # If the stack is not empty, pop. + if self.stack.length > 0: + return self.stack.pop() \ No newline at end of file From 5f385913ab06fc288c61d22d98f2f9a903194f8f Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:50:39 +0200 Subject: [PATCH 171/355] Add push method and implementation --- data_structures/Stack/Python/Stack.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py index 49a0850e9d..62fe17a079 100644 --- a/data_structures/Stack/Python/Stack.py +++ b/data_structures/Stack/Python/Stack.py @@ -11,4 +11,8 @@ def __init__(self): def pop(self): # If the stack is not empty, pop. if self.stack.length > 0: - return self.stack.pop() \ No newline at end of file + return self.stack.pop() + + # Add an element to the end of the stack array. + def push(self, element): + self.stack.append(element) \ No newline at end of file From eb0772fc6c30d98b83bf1c8e7d83af21066ae45b Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:50:59 +0200 Subject: [PATCH 172/355] Add peek method and implementation --- data_structures/Stack/Python/Stack.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py index 62fe17a079..fef8352153 100644 --- a/data_structures/Stack/Python/Stack.py +++ b/data_structures/Stack/Python/Stack.py @@ -15,4 +15,8 @@ def pop(self): # Add an element to the end of the stack array. def push(self, element): - self.stack.append(element) \ No newline at end of file + self.stack.append(element) + + # Return the last element of the stack array (without removing it). + def peek(self): + return self.stack[-1] \ No newline at end of file From 5db76016455638ec54dec3c9bbbe2a77e1edcc09 Mon Sep 17 00:00:00 2001 From: Aman Bansal Date: Mon, 16 Oct 2017 00:23:52 +0530 Subject: [PATCH 173/355] Added ruby implementation of bubble sort --- sort/bubble_sort/ruby/bubble_sort.rb | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 sort/bubble_sort/ruby/bubble_sort.rb diff --git a/sort/bubble_sort/ruby/bubble_sort.rb b/sort/bubble_sort/ruby/bubble_sort.rb new file mode 100644 index 0000000000..3eb9b8908e --- /dev/null +++ b/sort/bubble_sort/ruby/bubble_sort.rb @@ -0,0 +1,33 @@ +# Function implementing Bubble Sort Algorithm +def bubble_sort (arr, size) +######################################################################################################################### + #Bubble Sort Algorithm for sorting an array is as follows: + # Iterate through the array size-1 times + # In each iteration iterate from 0th index to (size-2-i)th index + # Check + # If current element is greater than the next element => Swap the two elements + # Else => Do nothing +######################################################################################################################### + for i in 0..size-2 + for j in 0..(size-2-i) + if (arr[j] > arr[j+1]) + temp = arr[j] + arr[j] = arr[j+1] + arr[j+1] = temp + end + end + end +end + + +# Take size of the array and array as input and output the sorted array using bubble sort +print("Enter size of array: ") +size = gets.chomp.to_i +print("Enter the elements of the array: ") +arr = gets.split.map(&:to_i) +bubble_sort(arr, size) +print("Array after sorting: ") +for i in arr + print(i.to_s + " ") +end +print("\n") From 9d8d89484a82ce7a20c2691070d0d64df21990b4 Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:54:27 +0200 Subject: [PATCH 174/355] Changed self.stack.length to len(self.stack), accidential java syntax --- data_structures/Stack/Python/Stack.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py index fef8352153..7295094a0c 100644 --- a/data_structures/Stack/Python/Stack.py +++ b/data_structures/Stack/Python/Stack.py @@ -10,7 +10,7 @@ def __init__(self): # Return and remove the last element of the stack array. def pop(self): # If the stack is not empty, pop. - if self.stack.length > 0: + if len(self.stack) > 0: return self.stack.pop() # Add an element to the end of the stack array. @@ -19,4 +19,13 @@ def push(self, element): # Return the last element of the stack array (without removing it). def peek(self): - return self.stack[-1] \ No newline at end of file + return self.stack[-1] + +# Test: +st = Stack() + +st.push("Hello") +st.push("World") + +print(st.pop()) +print(st.pop()) \ No newline at end of file From 60c0c30b504148e07c21c60260ecaf08286410d9 Mon Sep 17 00:00:00 2001 From: Banks Date: Sun, 15 Oct 2017 20:55:11 +0200 Subject: [PATCH 175/355] Removed naive test of the data structure --- data_structures/Stack/Python/Stack.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/data_structures/Stack/Python/Stack.py b/data_structures/Stack/Python/Stack.py index 7295094a0c..3519737d6a 100644 --- a/data_structures/Stack/Python/Stack.py +++ b/data_structures/Stack/Python/Stack.py @@ -19,13 +19,4 @@ def push(self, element): # Return the last element of the stack array (without removing it). def peek(self): - return self.stack[-1] - -# Test: -st = Stack() - -st.push("Hello") -st.push("World") - -print(st.pop()) -print(st.pop()) \ No newline at end of file + return self.stack[-1] \ No newline at end of file From bcee3717be30124d08abe0bf6f9e5ee50d5aa58e Mon Sep 17 00:00:00 2001 From: Anishka Gupta Date: Mon, 16 Oct 2017 00:26:40 +0530 Subject: [PATCH 176/355] Create rat_in_a_maze.cpp --- .../rat_in_a_maze/cpp/rat_in_a_maze.cpp | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 backtracking/rat_in_a_maze/cpp/rat_in_a_maze.cpp diff --git a/backtracking/rat_in_a_maze/cpp/rat_in_a_maze.cpp b/backtracking/rat_in_a_maze/cpp/rat_in_a_maze.cpp new file mode 100644 index 0000000000..3b3ef830f7 --- /dev/null +++ b/backtracking/rat_in_a_maze/cpp/rat_in_a_maze.cpp @@ -0,0 +1,66 @@ + +#include +#define N 9 +using namespace std; + +int maze[N][N]; +int path[N][N] = {0}; +int direction[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} }; +int src_x, src_y, dest_x, dest_y; + +bool is_valid_move (int x, int y) { + return (x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 0); +} + +// this will not give the shortest path but only give one of the possible paths + +bool traverse (int curr_x, int curr_y) { + if (curr_x == dest_x && curr_y == dest_y) + return true; + for (int k = 0; k < 4; k++) { + int next_x = curr_x + direction[k][0]; + int next_y = curr_y + direction[k][1]; + if (is_valid_move (next_x, next_y)) { + maze[curr_x][curr_y] = 1; // as the rat has already traversed this path marking it as a block to prevent rat from moving backwards + path[next_x][next_y] = 1; + if (traverse (next_x, next_y) == true) + return true; + else { + maze[curr_x][curr_y] = 0; + path[next_y][next_y] = 0; + } + } + } + return false; +} + +int main() { + cout << "Enter the maze (0 for empty, 1 for blocked square, 5 for source and 6 for destination) : \n"; + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + cin >> maze[i][j]; + if (maze[i][j] == 5) { + src_x = i; + src_y = j; + } + if (maze[i][j] == 6) { + dest_x = i; + dest_y = j; + } + } + } + path[src_x][src_y] = 1; + maze[src_x][src_y] = 0; + maze[dest_x][dest_y] = 0; + if (! traverse (src_x, src_y)) { + cout << "Sorry! The rat cannot reach the destination..."; + return 0; + } + cout << "The path followed by the rat to reach the destination is : \n"; + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) + cout << path[i][j] << " "; + cout << endl; + } + return 0; +} From 457a1e6024ed54f9ed0591c6262de553624bab12 Mon Sep 17 00:00:00 2001 From: Ved Patel Date: Mon, 16 Oct 2017 02:52:19 +0530 Subject: [PATCH 177/355] Create CoinChange.java --- dp/coin_change/java/CoinChange.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 dp/coin_change/java/CoinChange.java diff --git a/dp/coin_change/java/CoinChange.java b/dp/coin_change/java/CoinChange.java new file mode 100644 index 0000000000..edaf2789f9 --- /dev/null +++ b/dp/coin_change/java/CoinChange.java @@ -0,0 +1,27 @@ +import java.util.Arrays; + +class CoinChange +{ + static long countWays(int S[], int m, int n) + { + long[] table = new long[n+1]; + + Arrays.fill(table, 0); //O(n) + + table[0] = 1; + + for (int i=0; i Date: Mon, 16 Oct 2017 05:21:49 +0530 Subject: [PATCH 178/355] Updated README --- README.md | 26 +++++++++++++++++++ .../README.md | 0 .../c++/Atbash_Cipher.cpp | 0 .../Go/railfence.go | 0 .../README.md | 0 .../c++/Rail_Fence Cipher.cpp | 0 6 files changed, 26 insertions(+) rename cryptography/{Atbash Cipher => atbash_cipher}/README.md (100%) rename cryptography/{Atbash Cipher => atbash_cipher}/c++/Atbash_Cipher.cpp (100%) rename cryptography/{Rail Fence Cipher => rail_fence_cipher}/Go/railfence.go (100%) rename cryptography/{Rail Fence Cipher => rail_fence_cipher}/README.md (100%) rename cryptography/{Rail Fence Cipher => rail_fence_cipher}/c++/Rail_Fence Cipher.cpp (100%) diff --git a/README.md b/README.md index 53cd99c69b..32a06b9db0 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ Clean example implementations of data structures and algorithms written in diffe * [binary search](search/binary_search) * [linear search](search/linear_search) * [jump search](search/jump_search) + * [ternary search](search/ternary_search) + * [interpolation search](search/interpolation_search) * [Sort](sort) * [bubble sort](sort/bubble_sort) * [insertion sort](sort/insertion_sort) @@ -21,6 +23,9 @@ Clean example implementations of data structures and algorithms written in diffe * [counting sort](sort/counting_sort) * [radix sort](sort/radix_sort) * [shell sort](sort/shell_sort) + * [comb sort](sort/Comb_sort) + * [bucket sort](sort/bucket_sort) + * [cycle sort](sort/cycle_sort) * [Math](math) * [russian peasant](math/russian_peasant) * [towers of hanoi](math/towers_of_hanoi) @@ -40,6 +45,7 @@ Clean example implementations of data structures and algorithms written in diffe * [catalan number](math/catalan) * [moments](math/moments) * [primality check](math/is_prime) + * [euler's totient](math/eulers_totient_function) * [Cryptography](cryptography) * [caesar cipher](cryptography/caesar_cipher) * [substitution cipher](cryptography/substitution_cipher) @@ -50,18 +56,24 @@ Clean example implementations of data structures and algorithms written in diffe * [codewheel](cryptography/codewheel) * [end to end](cryptography/end_to_end) * [polybius cipher](cryptography/polybius_cipher) + * [atbash cipher](cryptography/atbash_cipher) + * [hill cipher](cryptography/hillcipher) + * [rail fence cipher](cryptography/rail_fence_cipher) * [Greedy](greedy) * [dijkstra’s algorithm](greedy/dijkstra’s_algorithm) * [kruskal's algorithm](greedy/kruskal's_algorithm) * [prim's algorithm](greedy/prim's_algorithm) * [job sequencing problem](greedy/Job_sequencing_problem) * [egyptian fraction](greedy/egyptian_fraction) + * [activity selection](greedy/activity_selection) + * [knapsack problem](greedy/knapsack_problem) * [Graphs](graphsearch) * [breadth-first-search](graphsearch/breadth-first-search) * [depth-first-search](graphsearch/depth-first-search) * [topological sorting](graphsearch/topological_sorting) * [a-star search](graphsearch/a-star-search) * [dijkstra](graphsearch/dijkstra) + * [dinics algorithm](graphsearch/dinics_algorithm) * [String search](string_search) * [knuth morris pratt](string_search/knuth_morris_pratt) * [rabin karp](string_search/rabin_karp) @@ -78,6 +90,10 @@ Clean example implementations of data structures and algorithms written in diffe * [coin change](dp/coin_change) * [longest common subsequence](dp/longest_common_subsequence) * [longest increasing subsequence](dp/longest_increasing_subsequence) + * [longest palindromic subsequence](dp/longest_palindromic_subsequence) + * [maximum subarray problem](dp/maximum_subarray_problem) + * [rod cutting](dp/rod_cutting) + * [subset sum](dp/subset_sum) * [Data structures](data_structures) * [linked list](data_structures/linked_list) * [avl tree](data_structures/avl_tree) @@ -86,10 +102,20 @@ Clean example implementations of data structures and algorithms written in diffe * [dictionary](data_structures/dictionary) * [queue](data_structures/Queue) * [stack](data_structures/Stack) + * [hash table](data_structures/hash_table) + * [binary search tree](data_structures/binarySearch_tree) + * [binary indexed tree](data_structures/binary_indexed_tree) + * [red and black tree](data_structures/red_and_black_tree) + * [segment tree](data_structures/segment_tree) + * [splay tree](data_structures/Splay_trees) * [Backtracking](backtracking) * [sudoku](backtracking/sudoku) * [knights tour](backtracking/knightsTour) * [n queens](backtracking/n-queens) + * [rat in a maze](backtracking/rat_in_a_maze) + * [wordsearch](backtracking/wordsearch) +* [Synchronization](synchronization) + * [Producer consumer problem](synchronization/ProducerConsumer) ## Contribution * Contributions are always welcome. Language doesn't matter. Just make sure you're implementing an algorithm. diff --git a/cryptography/Atbash Cipher/README.md b/cryptography/atbash_cipher/README.md similarity index 100% rename from cryptography/Atbash Cipher/README.md rename to cryptography/atbash_cipher/README.md diff --git a/cryptography/Atbash Cipher/c++/Atbash_Cipher.cpp b/cryptography/atbash_cipher/c++/Atbash_Cipher.cpp similarity index 100% rename from cryptography/Atbash Cipher/c++/Atbash_Cipher.cpp rename to cryptography/atbash_cipher/c++/Atbash_Cipher.cpp diff --git a/cryptography/Rail Fence Cipher/Go/railfence.go b/cryptography/rail_fence_cipher/Go/railfence.go similarity index 100% rename from cryptography/Rail Fence Cipher/Go/railfence.go rename to cryptography/rail_fence_cipher/Go/railfence.go diff --git a/cryptography/Rail Fence Cipher/README.md b/cryptography/rail_fence_cipher/README.md similarity index 100% rename from cryptography/Rail Fence Cipher/README.md rename to cryptography/rail_fence_cipher/README.md diff --git a/cryptography/Rail Fence Cipher/c++/Rail_Fence Cipher.cpp b/cryptography/rail_fence_cipher/c++/Rail_Fence Cipher.cpp similarity index 100% rename from cryptography/Rail Fence Cipher/c++/Rail_Fence Cipher.cpp rename to cryptography/rail_fence_cipher/c++/Rail_Fence Cipher.cpp From 508dbc9daa3ca8c2b75ecce6b66e9bbe5a704210 Mon Sep 17 00:00:00 2001 From: Khaled Alkiek Date: Mon, 16 Oct 2017 02:37:58 +0200 Subject: [PATCH 179/355] Add binary search in ruby --- search/binary_search/ruby/binary_search.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 search/binary_search/ruby/binary_search.rb diff --git a/search/binary_search/ruby/binary_search.rb b/search/binary_search/ruby/binary_search.rb new file mode 100644 index 0000000000..adcb0c5759 --- /dev/null +++ b/search/binary_search/ruby/binary_search.rb @@ -0,0 +1,21 @@ +def binary_search(array, num) + low = 0 + high = array.size - 1 + + while low <= high + mid = (low + high) / 2 + + if (array[mid] == num) + return true + elsif array[mid] < num + low = mid + 1 + else + high = mid - 1 + end + end + + return false +end + +# test +puts binary_search([4, 5, 9, 88, 104, 203, 501, 670], 5) \ No newline at end of file From 72d036ed1ecde11836a96cb3f1d02cc8510e24b9 Mon Sep 17 00:00:00 2001 From: Luis Bonilla Date: Sun, 15 Oct 2017 21:38:24 -0500 Subject: [PATCH 180/355] Adding counting sort algorithm for c++ --- sort/counting_sort/C++/Counting sort.cc | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 sort/counting_sort/C++/Counting sort.cc diff --git a/sort/counting_sort/C++/Counting sort.cc b/sort/counting_sort/C++/Counting sort.cc new file mode 100644 index 0000000000..20945c0a57 --- /dev/null +++ b/sort/counting_sort/C++/Counting sort.cc @@ -0,0 +1,43 @@ +#include + +using namespace std; + +const int INPUT_SIZE = 20; +const int BUCKET_K = 10; + +void print(int *input) +{ + for ( int i = 0; i < INPUT_SIZE; i++ ) + cout << input[i] << " "; + cout << endl; +} + +void countingsort(int* input) +{ + int CountArr[BUCKET_K] = { 0 }; + + for (int i=0;i Date: Mon, 16 Oct 2017 10:01:37 +0530 Subject: [PATCH 181/355] Added producer and consumer problem solution using java --- .../Java/producer_consumer.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 synchronization/ProducerConsumer/Java/producer_consumer.java diff --git a/synchronization/ProducerConsumer/Java/producer_consumer.java b/synchronization/ProducerConsumer/Java/producer_consumer.java new file mode 100644 index 0000000000..11f77ff4a2 --- /dev/null +++ b/synchronization/ProducerConsumer/Java/producer_consumer.java @@ -0,0 +1,122 @@ +// Java program to implement solution of producer and consumer problem. +import java.util.LinkedList; + +public class Threadexample +{ + public static void main(String[] args) + throws InterruptedException + { + // Object of a class that has both produce() + // and consume() methods + final PC pc = new PC(); + + // Create producer thread + Thread t1 = new Thread(new Runnable() + { + @Override + public void run() + { + try + { + pc.produce(); + } + catch(InterruptedException e) + { + e.printStackTrace(); + } + } + }); + + // Create consumer thread + Thread t2 = new Thread(new Runnable() + { + @Override + public void run() + { + try + { + pc.consume(); + } + catch(InterruptedException e) + { + e.printStackTrace(); + } + } + }); + + // Start both threads + t1.start(); + t2.start(); + + // t1 finishes before t2 + t1.join(); + t2.join(); + } + + // This class has a list, producer (adds items to list + // and consumber (removes items). + public static class PC + { + // Create a list shared by producer and consumer + // Size of list is 2. + LinkedList list = new LinkedList<>(); + int capacity = 2; + + // Function called by producer thread + public void produce() throws InterruptedException + { + int value = 0; + while (true) + { + synchronized (this) + { + // producer thread waits while list + // is full + while (list.size()==capacity) + wait(); + + System.out.println("Producer produced-" + + value); + + // to insert the jobs in the list + list.add(value++); + + // notifies the consumer thread that + // now it can start consuming + notify(); + + // makes the working of program easier + // to understand + Thread.sleep(1000); + } + } + } + + // Function called by consumer thread + public void consume() throws InterruptedException + { + while (true) + { + synchronized (this) + { + // consumer thread waits while list + // is empty + while (list.size()==0) + wait(); + + //to retrive the ifrst job in the list + int val = list.removeFirst(); + + System.out.println("Consumer consumed-" + + val); + + // Wake up producer thread + notify(); + + // and sleep + Thread.sleep(1000); + } + } + } + } +} \ No newline at end of file From d2ce7f087ee806f50f6c26a03c9a036257deaa47 Mon Sep 17 00:00:00 2001 From: alphaguy4 Date: Mon, 16 Oct 2017 10:21:58 +0530 Subject: [PATCH 182/355] Added egg_dropping_puzzle using dp --- dp/egg_dropping_puzzle/a.out | Bin 0 -> 9384 bytes .../egg_dropping_puzzle.cpp | 50 ++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100755 dp/egg_dropping_puzzle/a.out create mode 100644 dp/egg_dropping_puzzle/egg_dropping_puzzle.cpp diff --git a/dp/egg_dropping_puzzle/a.out b/dp/egg_dropping_puzzle/a.out new file mode 100755 index 0000000000000000000000000000000000000000..bce569d62c3f484565a6346cfb7a1c4002f7046a GIT binary patch literal 9384 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 U_A(+`pXJJLR0_}7GVSI67bZ2*0ssI2 literal 0 HcmV?d00001 diff --git a/dp/egg_dropping_puzzle/egg_dropping_puzzle.cpp b/dp/egg_dropping_puzzle/egg_dropping_puzzle.cpp new file mode 100644 index 0000000000..73a5c07770 --- /dev/null +++ b/dp/egg_dropping_puzzle/egg_dropping_puzzle.cpp @@ -0,0 +1,50 @@ +// Solution to egg dropping puzzle using dynamic programming + +#include + +#define MAX_EGGS 100 +#define MAX_FLOORS 100 +#define INF 1000000000 + +using namespace std; + +int memo[MAX_EGGS][MAX_FLOORS]; + +/* + * Returns the minimum number of attempts + * needed in the worst case for n eggs + * and k floors. + * Time complexity: O(n*k^2) + */ +int eggDrop(int n, int k) { + + // base cases + if(k == 0) return 0; // if there is no floor, no attempt is necessary + if(k == 1) return 1; // if there is only one floor, just one attempt is necessary + if(n == 1) return k; // with only one egg, k attempts are necessary + + // check if it is already computed + if(memo[n][k] > -1) return memo[n][k]; + + int ans = INF; + // attempt to drop an egg at each height from 1 to k + for(int h = 1; h <= k; ++h) { + + ans = min(ans, max( // get worst case from: + eggDrop(n-1, h-1), // case in which egg breaks + eggDrop(n, k-h) // case in which egg does not break + )); + } + + return memo[n][k] = ans + 1; // store minimum value +} + +int main() { + + memset(memo, -1, sizeof memo); + + cout << eggDrop(2, 100) << '\n'; + cout << eggDrop(10, 5) << '\n'; + cout << eggDrop(10, 100) << '\n'; + return 0; +} From 88ba7c09280ed80d620c801449d39328ab43ea80 Mon Sep 17 00:00:00 2001 From: alphaguy4 Date: Mon, 16 Oct 2017 10:24:39 +0530 Subject: [PATCH 183/355] Added egg_dropping_puzzle using dp --- dp/egg_dropping_puzzle/a.out | Bin 9384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 dp/egg_dropping_puzzle/a.out diff --git a/dp/egg_dropping_puzzle/a.out b/dp/egg_dropping_puzzle/a.out deleted file mode 100755 index bce569d62c3f484565a6346cfb7a1c4002f7046a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9384 zcmcIq4QyN06~4C9Hf>YaDSxG9)M70ZSWVKTAy62061Ojqwpo&PWuv?}wv%``c4R-7 zv|1ruD3TSzDnO!4Y_P#5O%oeTnuM6vq!iIoO`=GEI#Es8fXSg{gu$wam3rT~?;hv* z+2Kdij`H5Q=ey^e`+wiP$GJb)w#n&m2qvfawjgPEfnP%ATZr5hQdC%@SSb8rmAFF8 z2Qm+jU*-@uQ_N?SYvz?o&jntAr_pHwjZVKzFz4c!a}9}8d9&nKNt3_1#1xqe;gtZ{ zQC(+L{>+kYi8CKm^_YH2!gzUQf?%>+?v^5Ww@fgfB*!4;+&*d>JzdIgm(vf4WIr*{ zBHy!|bcx#EHzJgNZ?P1?{W8J)E)y2a+3q{Aqk4W-@+id)Ro-0vQmN|CTs2qR5RdgV z)ZY+~tc%AInW1$>V4^?Z@p|c`6u1YTer)SxF5ZcsLmJTp*cYLV~tNme(}bm zC!A}ZTiLyTRd~pU*)ETuX-XK;+TdGlmmI2UHl@<{UjQvDg~ej{D2G#h zy=C-Q&4KR+Ue3?5Is9LkL;s06@VYt5-8KjQ;T(Qq3U62I8KR`u@vast#IUDZ${y5P z62>)cM8el!Ph;62biHpNnb6ZlC}rrn&~M+ZcSQSQX(O6yj)&6eXjG^OCK zEzR*{BH9(|iAT-6@;Tqz+G#Y#l4-psl#bT7CSpcQZE&~HOYvqC?=<4+)=s0gHryXd z=|(CPGt#Z$V6X#N9h}6%dNOUKqM?D-aF-tJ+@Ocyt<$IvCo_ihn~bM}F@Y9_xp8P$ z_#Qpne~;c9ip9~|@K8t(8PTDbAqJuY=_m|!GEhA*5Q-(l=C;1s_IbmKq#k;_0-qql_I2OasR3TPl90<#-h%KZQ;#1?|fCVKf zkI1<85o|S1akI*wS=udeS}U}!n0S0?&s1BV%v!F-eE}rpLgHQv&UK}XwHDmE|JGP= z>;BVd!Kn-;zXj*LlJYbQ&TE|Tb_=eyM1qAja<)<%ows43S7-+&jCr|dB=}0@QJGzM zKf?bwlS$&OvN$S-pD!tm4HrK?(mcrl3%*{-eY2h&Do+*!HM5~$d&SLba4TV1SWCvt9L|dhN+L5Uo4W63vLju>r z$47&wweU$Tdr~_x>C_x2wXus2Q2QwjHk2cE9(76&GV>c6JR6n#sM1#{xWPc|M4 zeoFNi4Su>Ycp@AgUS7hvK9fQ zW=)Ym3u2s*oX4VfpH=Tj!JpL2pacL1UVaa$!cNVc(VJ>XEQS+`_4Nu*X-Xn zlh0#DUO7Jb9ICPr+AnpZQin+#r|({FGq8hZqtG5yjK(ncJG4x>%BIwA7m^)tg;va=iw=8`u%Z<^$UUU2S7)9&~!K_{P>f4BpwA zJ=dCjtL<7^36S;+D&INA7~@5 zRDOR~;I6=~z}*4;=)u`SKf(Sd{Xqjs?CnnBSn1lh6KU$^^PlDO&w@XRq73jy&^3Ps zufr&v1wR4ahVH3E=fuIk0bT_j1pgNJ55XS-KMVdQIGy8&9D6&2W60xJS+$_@pkslD za5}qtQOMI#m4LER$oOfNT&tQVfg(y z$`=8*=Rs%llKHMD9VlAn(;U4Gv*~g0Lca46%9i;L0A7f8(w0-m56f(s|199@FUWrd z`Mcr&+gAHMv-a-+e+>DTSo7P>{1#vps5i~_DCIY~JwJ9fxtBle3c9^x6;1B756#ou zH4o0$+>Ij(wz&N%cVoa^6L7C>a(kf%{U&#%?DsbKq19#mPLs>8LhY4)sdjde$!nC% zw$!ymcK)sj7tY}?&i6}%&lYduvqf~deA9iaTc%bjna?jPlw66=1rd!a5r#<8zc1vI zlsM${6D!>LJQb$QXN?J`Dbw60+N3JXXNBb^EaX_IG%**au~QInA5KVVc3$(@OLrNdZN6K98w32tId}aQBXMB&f7j#aI>wN5=M3*Xl zwc-tmZ&G}R;=PJXBg<=ZbMwvKwcC3#2_xg(;H&r5tZT?fsrJ6w2479Rul`yS_pYz0 zZK!FexyfQ(KIy{jY;^idGU>eCRTg&%qby!gm}gdJF3h@#vikD{&%7-W3Z6g3_#(mctQcP`c)b{lJ>(!fwXC*n(3!MD(zE3tp58`o@8JAxIFW0U=N&OXq4p&56E}bFB|8Ldz zM1C8AomV)2XLui;tKTRN;Xq{Nz4-ds=hZOu%f*Z6#9t2ojl|u8Zi7Vpo%jfeW$5Q&HBb0# z^+)J?rDpN##2ok^r2o?O{#S_?`yk0B%PqyPnghRO4*Y(F)4AMA&jR;a0hOKrUX7>+ z?>`j^e|--9Dd3(m{eKQP_1kWB&XH$F_;TSOQ0=^2&~?~KO9?L%AG=!V(+$H)b->9# zUE7JG@-0L&a1Z?0{ci()74#iSf34DwNDH^TARL(@gn~@wI12zaanF@yD0ui z?Rr}68+6Ab`k5@(EhyeVB+t&^w@SRscPE@O(nhAY*M}gRetUC=-qzaLg$UtnAW%03 z^e}}25hBzhNxd(g>=XC^-yL=gp&h<@u(4v_-@?LxS_m~-WyBA^iV1l+M`Dk zMrx1fO@#)cdL%P2um>gMwN^;nWj zAlBFF6yP%uLL?*>ipTasLf|u$h#G_?iEsHg#vVn9YAme4clD7u2$$yr%^W$8fuLNJMQSxJJ-`6EQ;gPv)x!P=WyLX zEMc>VQf-9{Qwv{u&wvr?0XI@6@8?u3fdKxX@FkK))E8)KU1x;)l+>5V_uPp>)6SMfN1%&*VnR%-J1HrLjti1RZ&)Xgov)Dm554gip5FhorAB2@x@NylHhq zDJg61i}tJa+#i7xmP}J~VVf45{y`XOC?+%z3!@H6gWLn5F7Tmqg%4ZI0JaUerTtGY zI-g%LsgjjpX<+h%Pt(#%}*GFzQ#1 zd+YsB{P2vvelmNm4h@XL0n%`DwThV z468k#Ux$@_hpoa~F8h1NX3zK3H&vi#AuB3wb0>bS?D?$C=gCQBZ`Ws;`3uUP$DeVHVB<13N59uK#l U_A(+`pXJJLR0_}7GVSI67bZ2*0ssI2 From 89751783a935585199c4cf5a9f6aece2191e8139 Mon Sep 17 00:00:00 2001 From: suhitmajumdar Date: Mon, 16 Oct 2017 10:35:36 +0530 Subject: [PATCH 184/355] updated documentation Updated intendation to improve readability of code. --- search/binary_search/c++/binary_search.cpp | 41 ++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/search/binary_search/c++/binary_search.cpp b/search/binary_search/c++/binary_search.cpp index 81460ad3a3..0da013a39e 100644 --- a/search/binary_search/c++/binary_search.cpp +++ b/search/binary_search/c++/binary_search.cpp @@ -2,49 +2,61 @@ #include /* cout and cin */ #include /* steady_clock::now */ -bool binarySearchIterative(int list[], int first, int end, int item){ +bool binarySearchIterative(int list[], int first, int end, int item) +{ int middle; - while(first <= end){ - middle = (first + end)/2; - if(list[middle] == item) { + while(first <= end) + { + middle = (first + end)/2; + if(list[middle] == item) + { return true; } - if(list[middle] < item) { + if(list[middle] < item) + { first = middle + 1; - } else { + } else + { end = middle - 1; } } return false; } -bool binarySearchRecursive(int list[], int first, int end, int item){ +bool binarySearchRecursive(int list[], int first, int end, int item) +{ int middle = (first + end)/2; - if(list[middle] == item){ + if(list[middle] == item) + { return true; } - if(first >= end){ + if(first >= end) + { return false; } - if(list[middle] < item){ + if(list[middle] < item) + { return binarySearchRecursive(list, middle+1, end, item); - } else { + } else + { return binarySearchRecursive(list, first, middle-1, item); } } -int main(int argc, char const *argv[]){ +int main(int argc, char const *argv[]) +{ std::cout << "Please, enter the size of the list." << std::endl; int size, value, option; bool find; std::cin >> size; int *list = new int[size]; - for(int i = 0; i < size; i++){ + for(int i = 0; i < size; i++) + { std::cout << "Enter the element " << i << " of the list." << std::endl; std::cin >> list[i]; } @@ -79,7 +91,8 @@ int main(int argc, char const *argv[]){ { std::cout << "You find the element using the binary search recursive." << std::endl; } - else{ + else + { std::cout << "You not find the element using the binary search recursive." << std::endl; } std::cout << "And the time of search was " << std::chrono::duration (diff).count() << " ms." << std::endl; From d5b028fed1b027df2b97aa4b9110921fbaf21c36 Mon Sep 17 00:00:00 2001 From: Alex Martin Date: Mon, 16 Oct 2017 01:08:17 -0400 Subject: [PATCH 185/355] Add Russian Peasant function in Go. --- math/russian_peasant/go/russian_peasant.go | 10 +++++++ .../go/russian_peasant_test.go | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 math/russian_peasant/go/russian_peasant.go create mode 100644 math/russian_peasant/go/russian_peasant_test.go diff --git a/math/russian_peasant/go/russian_peasant.go b/math/russian_peasant/go/russian_peasant.go new file mode 100644 index 0000000000..e391b9a4bd --- /dev/null +++ b/math/russian_peasant/go/russian_peasant.go @@ -0,0 +1,10 @@ +package russian_peasant + +func RussianPeasant(a int, b int) (sum int) { + for b > 0 { + if (a % 2 == 1) { sum += b } + a = a >> 1 + b = b << 1 + } + return +} diff --git a/math/russian_peasant/go/russian_peasant_test.go b/math/russian_peasant/go/russian_peasant_test.go new file mode 100644 index 0000000000..866d55fd18 --- /dev/null +++ b/math/russian_peasant/go/russian_peasant_test.go @@ -0,0 +1,27 @@ +package russian_peasant + +import ( + "fmt" +) + +func ExampleByZero() { + fmt.Println(RussianPeasant(0, 3)) + // Output: 0 +} + +func ExampleByOne() { + fmt.Println(RussianPeasant(1, 7)) + // Output: 7 +} + +func ExampleRandomNumbers() { + first := RussianPeasant(2, 3) + second := RussianPeasant(9, 9) + fmt.Println(first, second) + // Output 6 81 +} + +func ExampleBigNumbers() { + fmt.Println(RussianPeasant(123456, 7890)) + // Output: 974067840 +} From fb33771fd2c31a10098aa6d7a425b8d7aa59196e Mon Sep 17 00:00:00 2001 From: suhitmajumdar Date: Mon, 16 Oct 2017 10:42:14 +0530 Subject: [PATCH 186/355] Added comments Comments help users to understand the code better. --- sort/bubble_sort/c/bubble.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sort/bubble_sort/c/bubble.c b/sort/bubble_sort/c/bubble.c index 53f2a70680..edd83e514c 100644 --- a/sort/bubble_sort/c/bubble.c +++ b/sort/bubble_sort/c/bubble.c @@ -7,22 +7,22 @@ void swap(int *xp, int *yp) *yp = temp; } -void bubbleSort(int arr[], int n) +void bubbleSort(int arr[], int n)// Function to implement bubble sort { int i, j; - for (i = 0; i < n-1; i++) + for (i = 0; i < n-1; i++)//For number of passes { - for (j = 0; j < n-i-1; j++) + for (j = 0; j < n-i-1; j++)// For number of elements { - if (arr[j] > arr[j+1]) + if (arr[j] > arr[j+1])//For comparing two elements { - swap(&arr[j], &arr[j+1]); + swap(&arr[j], &arr[j+1]);//Swapping takes place } } } } -void printArray(int arr[], int size) +void printArray(int arr[], int size)//For printing the elements { int i; for (i=0; i < size; i++) From 3699d6b8e08a2ef7c07c396a6aabff3f69066a9e Mon Sep 17 00:00:00 2001 From: thesemicolonguy Date: Mon, 16 Oct 2017 17:55:52 +0530 Subject: [PATCH 187/355] Add neuralnetwork.py (Implementation of a Neural Network from scratch) --- deep_learning/python/neuralnetwork.py | 141 ++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 deep_learning/python/neuralnetwork.py diff --git a/deep_learning/python/neuralnetwork.py b/deep_learning/python/neuralnetwork.py new file mode 100644 index 0000000000..f592b2fd98 --- /dev/null +++ b/deep_learning/python/neuralnetwork.py @@ -0,0 +1,141 @@ +import numpy as np +import dill + +class neural_network: + + def __init__(self, num_layers, num_nodes, activation_function, cost_function): + self.num_layers = num_layers + self.num_nodes = num_nodes + self.layers = [] + self.cost_function = cost_function + + for i in range(num_layers): + if i != num_layers-1: + layer_i = layer(num_nodes[i], num_nodes[i+1], activation_function[i]) + else: + layer_i = layer(num_nodes[i], 0, activation_function[i]) + self.layers.append(layer_i) + + def train(self, batch_size, inputs, labels, num_epochs, learning_rate, filename): + self.batch_size = batch_size + self.learning_rate = learning_rate + for j in range(num_epochs): + i = 0 + print("== EPOCH: ", j, " ==") + while i+batch_size != len(inputs): + self.error = 0 + # input_batch = [] + # label_batch = [] + # # print(i) + # for i in range(i, i+batch_size): + # input_batch.append(inputs[i]) + # label_batch.append(labels[i]) + self.forward_pass(inputs[i:i+batch_size]) + self.calculate_error(labels[i:i+batch_size]) + self.back_pass(labels[i:i+batch_size]) + i += 1 + print("Error: ", self.error) + dill.dump_session(filename) + + def forward_pass(self, inputs): + self.layers[0].activations = inputs + for i in range(self.num_layers-1): + self.layers[i].add_bias(self.batch_size, self.layers[i+1].num_nodes_in_layer) + temp = np.add(np.matmul(self.layers[i].activations, self.layers[i].weights_for_layer), self.layers[i].bias_for_layer) + if self.layers[i+1].activation_function == "sigmoid": + self.layers[i+1].activations = self.sigmoid(temp) + elif self.layers[i+1].activation_function == "softmax": + self.layers[i+1].activations = self.softmax(temp) + elif self.layers[i+1].activation_function == "relu": + self.layers[i+1].activations = self.relu(temp) + elif self.layers[i+1].activation_function == "tanh": + self.layers[i+1].activations = self.tanh(temp) + else: + self.layers[i+1].activations = temp + + def relu(self, layer): + layer[layer < 0] = 0 + return layer + + def softmax(self, layer): + exp = np.exp(layer) + return exp/np.sum(exp, axis=1, keepdims=True) + + def sigmoid(self, layer): + return np.divide(1, np.add(1, np.exp(layer))) + + def tanh(self, layer): + return np.tanh(layer) + + def calculate_error(self, labels): + if len(labels[0]) != self.layers[self.num_layers-1].num_nodes_in_layer: + print ("Error: Label is not of the same shape as output layer.") + print("Label: ", len(labels), " : ", len(labels[0])) + print("Out: ", len(self.layers[self.num_layers-1].activations), " : ", len(self.layers[self.num_layers-1].activations[0])) + return + + if self.cost_function == "mean_squared": + self.error = np.mean(np.divide(np.square(np.subtract(labels, self.layers[self.num_layers-1].activations)), 2)) + elif self.cost_function == "cross_entropy": + self.error = np.negative(np.sum(np.multiply(labels, np.log(self.layers[self.num_layers-1].activations)))) + + def back_pass(self, labels): + # if self.cost_function == "cross_entropy" and self.layers[self.num_layers-1].activation_function == "softmax": + targets = labels + i = self.num_layers-1 + y = self.layers[i].activations + deltaw = np.matmul(np.asarray(self.layers[i-1].activations).T, np.multiply(y, np.multiply(1-y, targets-y))) + new_weights = self.layers[i-1].weights_for_layer - self.learning_rate * deltaw + for i in range(i-1, 0, -1): + y = self.layers[i].activations + deltaw = np.matmul(np.asarray(self.layers[i-1].activations).T, np.multiply(y, np.multiply(1-y, np.sum(np.multiply(new_weights, self.layers[i].weights_for_layer),axis=1).T))) + self.layers[i].weights_for_layer = new_weights + new_weights = self.layers[i-1].weights_for_layer - self.learning_rate * deltaw + self.layers[0].weights_for_layer = new_weights + + def predict(self, filename, input): + dill.load_session(filename) + self.batch_size = 1 + self.forward_pass(input) + a = self.layers[self.num_layers-1].activations + a[np.where(a==np.max(a))] = 1 + a[np.where(a!=np.max(a))] = 0 + return a + + def check_accuracy(self, filename, inputs, labels): + dill.load_session(filename) + self.batch_size = len(inputs) + self.forward_pass(inputs) + a = self.layers[self.num_layers-1].activations + num_classes = 10 + targets = np.array([a]).reshape(-1) + a = np.asarray(a) + one_hot_labels = np.eye(num_classes)[a.astype(int)] + total=0 + correct=0 + for i in range(len(a)): + total += 1 + if np.equal(one_hot_labels[i], labels[i]).all(): + correct += 1 + print("Accuracy: ", correct*100/total) + + + + def load_model(self, filename): + dill.load_session(filename) + + +class layer: + def __init__(self, num_nodes_in_layer, num_nodes_in_next_layer, activation_function): + self.num_nodes_in_layer = num_nodes_in_layer + self.activation_function = activation_function + self.activations = np.zeros([num_nodes_in_layer,1]) + if num_nodes_in_next_layer != 0: + self.weights_for_layer = np.random.normal(0, 0.001, size=(num_nodes_in_layer, num_nodes_in_next_layer)) + else: + self.weights_for_layer = None + self.bias_for_layer = None + + def add_bias(self, batch_size, num_nodes_in_next_layer): + if num_nodes_in_next_layer != 0: + self.bias_for_layer = np.random.normal(0, 0.01, size=(batch_size, num_nodes_in_next_layer)) \ No newline at end of file From d0330d8cf4abe5946c7abc9a96d0bedc5f395f33 Mon Sep 17 00:00:00 2001 From: Sarthak Gupta Date: Mon, 16 Oct 2017 18:55:10 +0530 Subject: [PATCH 188/355] Bug fix Will create a new PR for README in a while --- deep_learning/python/neuralnetwork.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deep_learning/python/neuralnetwork.py b/deep_learning/python/neuralnetwork.py index f592b2fd98..1363cfe4a9 100644 --- a/deep_learning/python/neuralnetwork.py +++ b/deep_learning/python/neuralnetwork.py @@ -33,7 +33,7 @@ def train(self, batch_size, inputs, labels, num_epochs, learning_rate, filename) self.forward_pass(inputs[i:i+batch_size]) self.calculate_error(labels[i:i+batch_size]) self.back_pass(labels[i:i+batch_size]) - i += 1 + i += batch_size print("Error: ", self.error) dill.dump_session(filename) @@ -138,4 +138,4 @@ def __init__(self, num_nodes_in_layer, num_nodes_in_next_layer, activation_funct def add_bias(self, batch_size, num_nodes_in_next_layer): if num_nodes_in_next_layer != 0: - self.bias_for_layer = np.random.normal(0, 0.01, size=(batch_size, num_nodes_in_next_layer)) \ No newline at end of file + self.bias_for_layer = np.random.normal(0, 0.01, size=(batch_size, num_nodes_in_next_layer)) From 3f509ca8de7c6f275cf2b981cf0bb2863bc8a106 Mon Sep 17 00:00:00 2001 From: vyshakh Date: Mon, 16 Oct 2017 20:17:52 +0530 Subject: [PATCH 189/355] Added Java 8 implementation of Histogram Equalization --- .../java/HistogramEqualization.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 image_processing/histogram_equalization/java/HistogramEqualization.java diff --git a/image_processing/histogram_equalization/java/HistogramEqualization.java b/image_processing/histogram_equalization/java/HistogramEqualization.java new file mode 100644 index 0000000000..0293229504 --- /dev/null +++ b/image_processing/histogram_equalization/java/HistogramEqualization.java @@ -0,0 +1,121 @@ +/* +* This file has been created by github user vn17. +* Feel free to use it for any purpose. +* +* This file makes extensive use of Java 8 lambdas. +* +* For more details on the algorithm, +* refer to @see https://en.wikipedia.org/wiki/Histogram_equalization +*/ +package Java; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.stream.IntStream; + +import static java.util.stream.Collectors.joining; + + +public class HistogramEqualization { + + public static void main(String[] args) { + ImageMatrix imageMatrix = new ImageMatrix(new int[][]{{2, 3, 1}, {3, 4, 6}, {7, 3, 6}}); + System.out.println("Input Matrix: \n" + imageMatrix); + System.out.println("Frequency: \t" + imageMatrix.frequency() + "\nCDF: \t\t" + imageMatrix.cdf() + "\n"); + ImageMatrix equalizedImageMatrix = imageMatrix.equalize(); + System.out.println("Histogram Equalized Matrix: \n" + equalizedImageMatrix); + } +} + +class ImageMatrix { + private static final int NUMBER_OF_LEVELS = 8;//This is the intensity range. + // Eg. For a 3 bit per pixel image, the intensity value is 8. + + private int cdfMin = -1;//This is the cdf of the minimum intensity value + + private int size;//Size of the image. 3 x 3 = 9 in this case + + private int[][] imageArray;//3 x 3 Array to store intensity values at each pixel + + private HashMap frequency;//HashMap to store the frequency of each intensity value i.e. + // the number of times each value has appeared in the 3 x 3 array. + + private HashMap cdf;//HashMap to store the CDF of each intensity value i.e. + // the sum of the frequency values of all intensities lesser than the current intensity level. + + public ImageMatrix(int[][] arr) { + this.imageArray = arr; + this.size = (int) Arrays.stream(arr).flatMapToInt(IntStream::of).count(); + } + + public int getFrequency(int key) { + if (frequency == null) calculateFrequency(); + return frequency().get(key); + } + + public int getCdf(int key) { + if (cdf == null) calculateCdf(); + return cdf().get(key); + } + + public HashMap frequency() { + if (frequency == null) calculateFrequency(); + return frequency; + } + + public HashMap cdf() { + if (cdf == null) calculateCdf(); + return cdf; + } + + /** + * This method calculates the frequency of each intensity value in the given intensity range. + */ + private void calculateFrequency() { + this.frequency = new HashMap<>(); + Arrays.stream(imageArray)//Get the 2D array + .flatMapToInt(IntStream::of)//Convert it to a 1D array + .forEach(intensity -> {//Increment the frequency value for intensity by 1 + if (frequency.containsKey(intensity)) frequency.put(intensity, frequency.get(intensity) + 1); + else frequency.put(intensity, 1); + }); + } + + /** + * This method calculates the CDF by adding all the intensity values lesser than the current value. + */ + private void calculateCdf() { + if (frequency == null) calculateFrequency(); + cdf = (HashMap) frequency().clone(); + cdf.keySet().stream() + .sorted().mapToInt(Integer::intValue) + .reduce(0, (previousSum, currentKey) -> { + int sum = previousSum + cdf.get(currentKey); + cdf.put(currentKey, sum); + if (cdfMin == -1)//To store the cdf of the minimum intensity value + cdfMin = sum; + return sum; + }); + } + + /** + * This method applies the equalization formula to each element in the matrix. + * @return + */ + public ImageMatrix equalize() { + int[][] equalizedArray = Arrays.stream(imageArray) + .map(p -> Arrays.stream(p).map(q -> (getCdf(q) - cdfMin) * (NUMBER_OF_LEVELS - 2) / (size - 1) + 1).toArray()) + .toArray(int[][]::new); + return new ImageMatrix(equalizedArray); + } + + /** + * Prints a 2D array line by line for each array. + * @return + */ + @Override + public String toString() { + return Arrays.stream(imageArray).map(s -> String.format("%s\n", Arrays.toString(s))).collect(joining()); + } +} + From 708ab0b9093aeb7c42761cde4e361a598cb8f028 Mon Sep 17 00:00:00 2001 From: Aaditya Khare Date: Mon, 16 Oct 2017 22:32:37 +0530 Subject: [PATCH 190/355] Add files via upload --- dynamic control/PID_algo_with_documentation.c | 59 +++++++++++++++++++ dynamic control/Readme.txt | 14 +++++ 2 files changed, 73 insertions(+) create mode 100644 dynamic control/PID_algo_with_documentation.c create mode 100644 dynamic control/Readme.txt diff --git a/dynamic control/PID_algo_with_documentation.c b/dynamic control/PID_algo_with_documentation.c new file mode 100644 index 0000000000..7e18081580 --- /dev/null +++ b/dynamic control/PID_algo_with_documentation.c @@ -0,0 +1,59 @@ +/* +Compute() is called either regularly or irregularly, and it works pretty well. This series isnt about works pretty well though. If were going to turn this code into something on par with industrial PID controllers, +well have to address a few things: + +Sample Time The PID algorithm functions best if it is evaluated at a regular interval. If the algorithm is aware of this interval, we can also simplify some of the internal math. +Derivative Kick Not the biggest deal, but easy to get rid of, so were going to do just that. +On-The-Fly Tuning Changes A good PID algorithm is one where tuning parameters can be changed without jolting the internal workings. +Reset Windup Mitigation Well go into what Reset Windup is, and implement a solution with side benefits +On/Off (Auto/Manual) In most applications, there is a desire to sometimes turn off the PID controller and adjust the output by hand, without the controller interfering +Initialization When the controller first turns on, we want a bumpless transfer. That is, we dont want the output to suddenly jerk to some new value +Controller Direction This last one isnt a change in the name of robustness per se. its designed to ensure that the user enters tuning parameters with the correct sign. +NEW: Proportional on Measurement Adding this feature makes it easier to control certain types of processes + +Once weve addressed all these issues, well have a solid PID algorithm. + + +You can tune the values of Kp, Ki and Kd using the following mathematical/non-mathematical methods: +Help for the same can be found out online at https://en.wikipedia.org/wiki/PID_controller + +Manual tuning +ZieglerNichols +Tyreus Luyben +Software tools Consistent tuning +CohenCoon +strm-Hgglund +*/ + + +//working variables +unsigned long lastTime; +double Input, Output, Setpoint; +double errSum, lastErr; +double kp, ki, kd; +void Compute() +{ + /*How long since we last calculated*/ + unsigned long now = millis(); + double timeChange = (double)(now - lastTime); + + /*Compute all the working error variables*/ + double error = Setpoint - Input; + errSum += (error * timeChange); + double dErr = (error - lastErr) / timeChange; + + /*Compute PID Output*/ + Output = kp * error + ki * errSum + kd * dErr; + + /*Remember some variables for next time*/ + lastErr = error; + lastTime = now; +} + +void SetTunings(double Kp, double Ki, double Kd) +{ + kp = Kp; + ki = Ki; + kd = Kd; +} + diff --git a/dynamic control/Readme.txt b/dynamic control/Readme.txt new file mode 100644 index 0000000000..f47dadfa0a --- /dev/null +++ b/dynamic control/Readme.txt @@ -0,0 +1,14 @@ +PID algorithm is a Control System based dynamic control algorithm. +In simpler terms it can be described as a dynamic error calculation +and correction algorithm/ + +Majorly used in wheeled robotic locomotion to follow and maintain +locomotion along a straight guideline usually drawn on the floor. + +The code here is a very basic implementation of the PID algorithm. +A very good algorithm for robotics enthusiasts struggling with robotic +locomotion. + +Do read the detailed documentation on the concepts and tuning formulas on: +https://en.wikipedia.org/wiki/PID_controller + From 248c8c2475dc256794f348091d383621ce2259f8 Mon Sep 17 00:00:00 2001 From: Juan Martin Enriquez Date: Mon, 16 Oct 2017 14:14:34 -0300 Subject: [PATCH 191/355] Added fast exponentiation by squaring in golang --- .../go/fast_exponentiation.go | 17 ++++++++++ .../go/fast_exponentiation_test.go | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 math/fast_exponentiation/go/fast_exponentiation.go create mode 100644 math/fast_exponentiation/go/fast_exponentiation_test.go diff --git a/math/fast_exponentiation/go/fast_exponentiation.go b/math/fast_exponentiation/go/fast_exponentiation.go new file mode 100644 index 0000000000..63bcd4ccac --- /dev/null +++ b/math/fast_exponentiation/go/fast_exponentiation.go @@ -0,0 +1,17 @@ +package fast_exponentiation + +func FastPower(base,exponent int64) int64 { + if exponent == 0 { + return 1 + } + + if exponent == 1 { + return base + } + + if exponent % 2 == 0 { + return FastPower(base*base, exponent/2) + } else { + return base * FastPower(base*base, (exponent-1)/2) + } +} diff --git a/math/fast_exponentiation/go/fast_exponentiation_test.go b/math/fast_exponentiation/go/fast_exponentiation_test.go new file mode 100644 index 0000000000..83b2e09a20 --- /dev/null +++ b/math/fast_exponentiation/go/fast_exponentiation_test.go @@ -0,0 +1,31 @@ +package fast_exponentiation + +import ( + "testing" + "math" +) + +var testCase = []struct { + base int64 + exponent int64 +}{ + {10, 1}, + {10, 0}, + {10, 2}, + {3, 11}, + {2, 10}, + {2, 10}, + {20, 3}, + {31, 3}, + {4, 20}, +} + +func TestFastExponentiation(t *testing.T) { + for _, tt := range testCase { + result := float64(FastPower(tt.base, tt.exponent)) + expected := math.Pow(float64(tt.base), float64(tt.exponent)) + if expected != result { + t.Errorf("Failed: %d^%d Result: %d Actual: %d\n", tt.base, tt.exponent, result, expected) + } + } +} From 7024371cd9241a2588bf74cd0cbb16335f3d8c55 Mon Sep 17 00:00:00 2001 From: Mark Hillman Date: Mon, 16 Oct 2017 18:57:20 +0100 Subject: [PATCH 192/355] Added Gauss-Legendre Pi calculation algorithm in Erlang. --- math/gauss_legendre/erlang/gauss_legendre.erl | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 math/gauss_legendre/erlang/gauss_legendre.erl diff --git a/math/gauss_legendre/erlang/gauss_legendre.erl b/math/gauss_legendre/erlang/gauss_legendre.erl new file mode 100644 index 0000000000..e8aa2697a0 --- /dev/null +++ b/math/gauss_legendre/erlang/gauss_legendre.erl @@ -0,0 +1,41 @@ +%% @author Mark Hillman +%% @doc +%% This short module is used to calculate PI using the Gauss-Legendre +%% algorithm. The algorithm is fairly short and consists of just 4 steps. +%% The algorithm can be found on wikipedia [https://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_algorithm]. + +-module(gauss_legendre). +-export([calculate_pi/1]). + +%% @doc +%% Initial values for the algorithm. +a_init() -> 1. +b_init() -> 1 / math:sqrt(2). +t_init() -> 1 / 4. +p_init() -> 1. + +%% @doc +%% Calculate the next values of the iteration. +a_next(A, B) -> (A + B) / 2. +b_next(A, B) -> math:sqrt(A * B). +t_next(T, P, A, ANext) -> T - P * math:pow(A - ANext, 2). +p_next(P) -> 2 * P. + +%% @doc +%% Determines current iteration of pi from the variables +pi_approx(A, B, T) -> + math:pow(A + B, 2) / (4 * T). + +%% @doc +%% Calculates PI using the Gauss-Legendre algorithm. The only argument is the +%% number of iterations that the algorithm should go through. +-spec calculate_pi(N :: pos_integer()) -> number(). +calculate_pi(N) when N =< 0 -> 0; +calculate_pi(N) -> calculate_pi(N, a_init(), b_init(), t_init(), p_init(), 0). +calculate_pi(N, ANext, BNext, TNext, _P, N) -> pi_approx(ANext, BNext, TNext); +calculate_pi(N, A, B, T, P, Iter) -> + ANext = a_next(A, B), + BNext = b_next(A, B), + TNext = t_next(T, P, A, ANext), + PNext = p_next(P), + calculate_pi(N, ANext, BNext, TNext, PNext, Iter+1). \ No newline at end of file From 3a63e1a4aaf22f69791086fe86e461b4da921cf7 Mon Sep 17 00:00:00 2001 From: rohitrango Date: Mon, 16 Oct 2017 23:26:12 +0530 Subject: [PATCH 193/355] added string permutations --- .../permutations/C++/permutations.cpp | 31 +++++++++++++++++++ backtracking/permutations/README.md | 17 ++++++++++ 2 files changed, 48 insertions(+) create mode 100644 backtracking/permutations/C++/permutations.cpp create mode 100644 backtracking/permutations/README.md diff --git a/backtracking/permutations/C++/permutations.cpp b/backtracking/permutations/C++/permutations.cpp new file mode 100644 index 0000000000..4463eda033 --- /dev/null +++ b/backtracking/permutations/C++/permutations.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +using namespace std; + +void swap(string &s, int i, int j) { + char temp = s[i]; + s[i] = s[j]; + s[j] = temp; +} + +void permute(string &s, int level, int &num) { + if(level == s.size()) { + cout<>s; + sort(s.begin(),s.end()); + permute(s,0,c); +} \ No newline at end of file diff --git a/backtracking/permutations/README.md b/backtracking/permutations/README.md new file mode 100644 index 0000000000..f539574465 --- /dev/null +++ b/backtracking/permutations/README.md @@ -0,0 +1,17 @@ +## Generate all permutations of a string ## + +Given a string with all distinct characters, the task is to +generate all permutations of the string. For a n-letter string, there should +be n! strings as output. For repeating characters, there are corresponding duplicates. + +An example of the program: +Input: +abc + +Output: +1. abc +2. acb +3. bac +4. bca +5. cba +6. cab From c5702cd9635e5ab67c108d75a74882c412bf687d Mon Sep 17 00:00:00 2001 From: vn17 Date: Mon, 16 Oct 2017 23:37:26 +0530 Subject: [PATCH 194/355] Create EuclidsGCD.java Java Implementation of Euclid's Algorithm. Resolves issue #228 --- math/euclids_gcd/java/EuclidsGCD.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 math/euclids_gcd/java/EuclidsGCD.java diff --git a/math/euclids_gcd/java/EuclidsGCD.java b/math/euclids_gcd/java/EuclidsGCD.java new file mode 100644 index 0000000000..757cd06144 --- /dev/null +++ b/math/euclids_gcd/java/EuclidsGCD.java @@ -0,0 +1,18 @@ +import java.util.Scanner; + +public class EuclidsGCD { + public static void main(String[] args) { + Scanner sc=new Scanner(System.in); + while(sc.hasNextInt()){ + int a=sc.nextInt(); + int b=sc.nextInt(); + int gcd=gcd(a,b); + System.out.println("GCD of "+a+" and "+b+" = "+gcd); + } + } + + private static int gcd(int a, int b) { + if(a==0)return b; + return gcd(b%a,a); + } +} From ba6d9442d26fc554c818425fdff3d650c4244924 Mon Sep 17 00:00:00 2001 From: vn17 Date: Tue, 17 Oct 2017 00:02:59 +0530 Subject: [PATCH 195/355] Created StrongNumber implementation in Java --- math/strong_number/java/StrongNumber.java | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 math/strong_number/java/StrongNumber.java diff --git a/math/strong_number/java/StrongNumber.java b/math/strong_number/java/StrongNumber.java new file mode 100644 index 0000000000..4c8499d97e --- /dev/null +++ b/math/strong_number/java/StrongNumber.java @@ -0,0 +1,29 @@ +import java.util.Scanner; + +public class StrongNumber { + public static void main(String[] args) { + Scanner sc=new Scanner(System.in); + while(sc.hasNextInt()){ + int a=sc.nextInt(); + System.out.println(strongNumber(a)?a+" is a strong number":a+" is NOT a strong number"); + + } + } + + private static boolean strongNumber(int number) { + int sum=0,temp,num=number; + while(num>0){ + temp=num%10; + num/=10; + sum+=factorial(temp); + } + return sum==number; + } + + private static int factorial(int num) { + for (int i = num-1; i >1; i--) { + num*=i; + } + return num; + } +} From c029e017a80cdce380589c970244ff140d1bb54d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20=C3=81lvarez?= Date: Mon, 16 Oct 2017 14:42:11 -0500 Subject: [PATCH 196/355] Add vigenere cipher implementation in C++ --- .../vigenere_cipher/cpp/vigenere_cipher.cpp | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 cryptography/vigenere_cipher/cpp/vigenere_cipher.cpp diff --git a/cryptography/vigenere_cipher/cpp/vigenere_cipher.cpp b/cryptography/vigenere_cipher/cpp/vigenere_cipher.cpp new file mode 100644 index 0000000000..44c85ff013 --- /dev/null +++ b/cryptography/vigenere_cipher/cpp/vigenere_cipher.cpp @@ -0,0 +1,103 @@ +#include + +using namespace std; + +int get_int_value( char c ){ + return toupper(c) - 65; +} + +char get_char_value( int c ){ + return char(c + 65); +} + +string extend_key( int size, string &key ){ + string new_key = key; + while( new_key.size() < size ){ + new_key += key; + } + return new_key; +} + +string encrypt( string &plain_text, string key ){ + string cipher_text = ""; + int p, k; + key = extend_key(plain_text.size(), key); + + for( int i = 0; i < plain_text.size(); ++i ){ + p = get_int_value(plain_text[i]); + k = get_int_value(key[i]); + cipher_text += get_char_value((p + k) % 26); + } + return cipher_text; +} + +string decrypt(string &cipher_text, string key ){ + string plain_text = ""; + int p, k; + key = extend_key(cipher_text.size(), key); + + for( int i = 0; i < cipher_text.size(); ++i ){ + p = get_int_value(cipher_text[i]); + k = get_int_value(key[i]); + plain_text += get_char_value((p - k + 26) % 26); + } + return plain_text; +} + +void test(){ + string action, text, result, key; + text = "HACKTOBERFEST"; + key = "CRYPTO"; + result = encrypt( text, key ); + + cout << "\n-------------------------------------\n"; + cout << "- Test\n"; + cout << "- Plain text: " << text <<'\n'; + cout << "- Key: " << key <<'\n'; + cout << "- Cipher text: " << result <<'\n'; + cout << "- Cipher text must be: JRAZMCDVPUXGV\n- \n"; + + text = "JRAZMCDVPUXGV"; + result = decrypt( text, key ); + + cout << "- Cipher text: " << text <<'\n'; + cout << "- Key: " << key <<'\n'; + cout << "- Plain text: " << result <<'\n'; + cout << "- Plain text must be: HACKTOBERFEST\n"; + cout << "-------------------------------------\n"; +} + +void instructions(){ + cout << "----------------------------------------\n"; + cout << "- This program implements vigenere cipher.\n"; + cout << "- It has two funcionalities.\n"; + cout << "- Encrypt: --encrypt plain_text key\n"; + cout << "- Decrypt: --decrypt cipher_text key\n"; + cout << "- All arguments are strings.\n"; + cout << "- Example:\n"; + cout << "- ./vigenere.out -encrypt hello bye\n"; + cout << "----------------------------------------\n"; +} + +int main( int argc, char* argv[] ){ + if( argc != 4 ){ + instructions(); + return 0; + } + + string action, text, result, key; + + action = argv[1]; + text = argv[2]; + key = argv[3]; + + if(action == "encrypt"){ + cout << encrypt(text, key) << '\n'; + } + else{ + cout << decrypt(text, key) << '\n'; + } + + // Uncomment to run a test + // test(); +} From 5c9a0719793e7adfcd372fc6c9f023427964aac9 Mon Sep 17 00:00:00 2001 From: Gustavo Kath Date: Mon, 16 Oct 2017 19:47:52 +0000 Subject: [PATCH 197/355] Add MinHeap implementation in Ruby --- data_structures/heap/Ruby/min_heap.rb | 72 +++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 data_structures/heap/Ruby/min_heap.rb diff --git a/data_structures/heap/Ruby/min_heap.rb b/data_structures/heap/Ruby/min_heap.rb new file mode 100644 index 0000000000..45729f3a45 --- /dev/null +++ b/data_structures/heap/Ruby/min_heap.rb @@ -0,0 +1,72 @@ +class MinHeap + attr_reader :heap + + def initialize + @heap = [] + end + + def push(value) + @heap.push(value) + index = @heap.size - 1 + + up_heap(index) + end + + def pop + min = @heap.first + last = @heap.pop + @heap[0] = last + + heapfy(0) + min + end + + def empty? + heap.empty? + end + + def min + @heap.first + end + + private + def up_heap(index) + parent_index = index/2 + + if(@heap[parent_index] > @heap[index]) + parent = @heap[parent_index] + @heap[parent_index] = @heap[index] + @heap[index] = parent + + up_heap(parent_index) + end + end + + def heapfy(index) + left = index * 2 + right = left + 1 + min = index + + min = left if left < @heap.size && @heap[left] < @heap[min] + min = right if right < @heap.size && @heap[right] < @heap[min] + + if min != index + min_value = @heap[min] + @heap[min] = @heap[index] + @heap[index] = min_value + heapfy(min) + end + end +end + +h = MinHeap.new +h.push(4) +h.push(10) +h.push(2) +p h.min +h.push(5) +p h.pop +p h.min +h.push(9) +h.push(1) +p h.min From fbf1ebc18515a9ed6b57a28e01483b49dc835467 Mon Sep 17 00:00:00 2001 From: Hernan Olarte Date: Mon, 16 Oct 2017 14:53:39 -0500 Subject: [PATCH 198/355] Add substitution cipher implementation in c++ --- .../substitution_cipher/cpp/my_file.txt | 1 + .../cpp/my_file_decrypted.txt | 1 + .../substitution_cipher/cpp/my_table.txt | 2 + .../cpp/substitution_cipher.cpp | 154 ++++++++++++++++++ .../cpp/substitution_cipher.out | Bin 0 -> 75896 bytes 5 files changed, 158 insertions(+) create mode 100644 cryptography/substitution_cipher/cpp/my_file.txt create mode 100644 cryptography/substitution_cipher/cpp/my_file_decrypted.txt create mode 100644 cryptography/substitution_cipher/cpp/my_table.txt create mode 100644 cryptography/substitution_cipher/cpp/substitution_cipher.cpp create mode 100755 cryptography/substitution_cipher/cpp/substitution_cipher.out diff --git a/cryptography/substitution_cipher/cpp/my_file.txt b/cryptography/substitution_cipher/cpp/my_file.txt new file mode 100644 index 0000000000..3b18e512db --- /dev/null +++ b/cryptography/substitution_cipher/cpp/my_file.txt @@ -0,0 +1 @@ +hello world diff --git a/cryptography/substitution_cipher/cpp/my_file_decrypted.txt b/cryptography/substitution_cipher/cpp/my_file_decrypted.txt new file mode 100644 index 0000000000..13160e059a --- /dev/null +++ b/cryptography/substitution_cipher/cpp/my_file_decrypted.txt @@ -0,0 +1 @@ +pcssi bidsm diff --git a/cryptography/substitution_cipher/cpp/my_table.txt b/cryptography/substitution_cipher/cpp/my_table.txt new file mode 100644 index 0000000000..bcabec7305 --- /dev/null +++ b/cryptography/substitution_cipher/cpp/my_table.txt @@ -0,0 +1,2 @@ +abcdefghijklmnopqrstuvwxyz +qwertyuiopasdfghjklzxcvbnm diff --git a/cryptography/substitution_cipher/cpp/substitution_cipher.cpp b/cryptography/substitution_cipher/cpp/substitution_cipher.cpp new file mode 100644 index 0000000000..d448da963c --- /dev/null +++ b/cryptography/substitution_cipher/cpp/substitution_cipher.cpp @@ -0,0 +1,154 @@ +#include +#include +#include +#include +#include + +using namespace std; + +map subs_table_enc; +map subs_table_dec; +map options; + +void help () { + cout << "Instructions:" << endl; + cout << "This is an implementation of substitution cipher that at the end gives you a file called _encrypted.txt or _decryted.txt" << endl; + cout << endl; + cout << "The program has 3 options:" << endl; + cout << "--encrypt, -e: encrypt a file passed as an argument" << endl; + cout << "--decript, -d: decrypt a file passed as an argument" << endl; + cout << "--subs_table, -s: use a substitution table passed as an argument" << endl; + cout << endl; + cout << "Example:" << endl; + cout << "./substitution_cipher -e my_file_decrypted.txt -s my_table.txt" << endl; + cout << "./substitution_cipher -d my_file_encrypted.txt -s my_table.txt" << endl; +} + +int load_options (int argc, char* argv[]) { + for (int i = 1; i < argc; i += 2) { + string option = argv[i]; + if (i + 1 >= argc) { + return -1; + } + if (option == "-e" || option == "encrypt") { + options['e'] = argv[i + 1]; + } + else if (option == "-d" || option == "decrypt") { + options['d'] = argv[i + 1]; + } + else if (option == "-s" || option == "subs_table") { + options['s'] = argv[i + 1]; + } + else { + return -1; + } + } + return 0; +} + +int load_table () { + ifstream table_file (options['s']); + + if (!table_file.is_open ()) { + return -1; + } + + string line1; + string line2; + + getline (table_file, line1); + getline (table_file, line2); + + if (line1.size() != line2.size()) { + return -1; + } + + for (int i = 0; i < line1.size(); ++i) { + subs_table_enc[line1[i]] = line2[i]; + subs_table_dec[line2[i]] = line1[i]; + } + + table_file.close (); + return 0; +} + +string remove_ext (const string &file_name) { + int pos = file_name.size () - 1; + for (; pos >= 0; --pos) { + if (file_name[pos] == '.') { + break; + } + } + return file_name.substr (0, pos); +} + +int base_function (const string &file_name, map &subs, const string &cypher_name) { + ifstream file (file_name); + if (!file.is_open()) { + return -1; + } + ofstream o_file; + o_file.open (remove_ext (file_name) + "_" + cypher_name); + string line; + string nline; + while (getline (file, line)) { + nline = ""; + for (char c : line) { + if (!subs.count(c)) { + nline += c; + continue; + } + nline += subs[c]; + } + o_file << nline << endl; + } + o_file.close (); + return 0; +} + +int encrypt (const string &file_name) { + return base_function (file_name, subs_table_enc, "encrypted.txt"); +} + +int decrypt (const string &file_name) { + return base_function (file_name, subs_table_dec, "decrypted.txt"); +} + +int main (int argc, char* argv[]) { + + if (argc != 5) { + help (); + return 0; + } + + if (load_options (argc, argv) == -1) { + cout << "The command is not valid" << endl; + help (); + return 0; + } + + if (load_table() == -1) { + cout << "Table file not found" << endl; + help (); + return 0; + } + + if (options.count ('e')) { + if (encrypt (options['e']) == -1) { + cout << "Error encrypting the file" << endl; + help (); + } + } + else if (options.count ('d')) { + if (decrypt (options['d']) == -1) { + cout << "Error decrypting the file" << endl; + help (); + } + } + else { + cout << "The command is not valid" << endl; + help (); + } + + return 0; +} diff --git a/cryptography/substitution_cipher/cpp/substitution_cipher.out b/cryptography/substitution_cipher/cpp/substitution_cipher.out new file mode 100755 index 0000000000000000000000000000000000000000..296654c4c9d0af731514afb5b1be92c99d44f1f8 GIT binary patch literal 75896 zcmeHwdtg+>_5aNSq=F<`v4{^=MT-hC2>}9v@>mE9 zXiAmR)>_)ymin`m)<;pPMxlhSwJlm7RIR4g+Kp(xw6zv3n&0QloVj=Q?!BAMQuO;r zuadKK&Y77rXU?2C^Vqvz@)yocO-V7-lV)6EP-@jEiJ8HK!#3}l3s0A5LqSzLL8{N|`S2D=QP41a0zvsm)~y{P z3Fs3a6g)%%;pwpo_lY!#NBMSez8#!T!AzE4LDfEL8~rO~x)aU;jUEMwm!6_Ohb!pw zxS&YJz&A-4JPN9OmmwdMBtt)cGnrn@^?B)~ise^O^}|Iq)#a1&E~=>*UsGMz+%mo; zf719#d09>MS-GO!R6g;}TeL*fMC#?D1pQ>B2}kswzVY^m-(UTw`A@vPaLL?>HH|CZ zJ9z@}=HZ{}H^ayjp9x3Lh^@nB%TMlqQ&IRyE~GN_uN(ecbetRh3MkbL{}{@4!(Zf4 ze!v4i;xmSEwu_vN=vcS%3!oS`{8JusuJ_=tIL^JCbPxPLJ@omK2meM7eGWl;-Q>R; z9qoo+?xD9^J=*)R2mVP9JuLH(^A!*Mr+Sq0v4=hU%cJ}$9_@YIqrDG$=s&|lp0OT! zSnAPV+dc4?c;Kgd=!ZtTTR)EQ(8JRn?VaP%-q9%EhkwrJHIMR7^U%W>4?85k<#QH} z^u-?dCJ#B^@z76&N57xz!GAaOf1+`!vF$5Ts!Ze;5BzUaxFUGrh2(Q58K$|qw!Y46 z3YRs8P17(7N*9_Hp~lea>ZWk0v2@|=n)