From 1f304523add19a75731d7c402985a79d6ced21ce Mon Sep 17 00:00:00 2001 From: Dan Calloway Date: Mon, 15 Sep 2025 16:02:00 -0400 Subject: [PATCH] initial commit of files --- 2D_array_boolean_indexing.py | 9 ++ 2D_array_indexing.py | 30 +++++ 2D_array_slicing.py | 19 +++ 2D_int_array_indexing.py | 19 +++ 3D_array_indexing.py | 17 +++ CodeChallenge_02(Medium).py | 34 +++++ CodeChallenge_1.py | 12 ++ CodeChallenge_10.py | 23 ++++ CodeChallenge_11.py | 30 +++++ CodeChallenge_12.py | 41 ++++++ CodeChallenge_13.py | 25 ++++ CodeChallenge_14.py | 28 ++++ CodeChallenge_15.py | 26 ++++ CodeChallenge_16.py | 26 ++++ CodeChallenge_17.py | 40 ++++++ CodeChallenge_18.py | 36 +++++ CodeChallenge_19.py | 34 +++++ CodeChallenge_2.py | 11 ++ CodeChallenge_20.py | 27 ++++ CodeChallenge_21.py | 27 ++++ CodeChallenge_22.py | 27 ++++ CodeChallenge_23.py | 34 +++++ CodeChallenge_24.py | 27 ++++ CodeChallenge_25.py | 19 +++ CodeChallenge_26.py | 33 +++++ CodeChallenge_27.py | 25 ++++ CodeChallenge_28.py | 41 ++++++ CodeChallenge_29.py | 58 ++++++++ CodeChallenge_3.py | 28 ++++ CodeChallenge_30.py | 34 +++++ CodeChallenge_31.py | 34 +++++ CodeChallenge_32.py | 33 +++++ CodeChallenge_33.py | 31 +++++ CodeChallenge_34.py | 40 ++++++ CodeChallenge_35.py | 35 +++++ CodeChallenge_36.py | 34 +++++ CodeChallenge_37.py | 49 +++++++ CodeChallenge_38.py | 34 +++++ CodeChallenge_39.py | 61 +++++++++ CodeChallenge_4.py | 34 +++++ CodeChallenge_5.py | 27 ++++ CodeChallenge_6.py | 25 ++++ CodeChallenge_7.py | 19 +++ CodeChallenge_8.py | 33 +++++ CodeChallenge_9.py | 21 +++ Code_Challenge_medium_1.py | 53 ++++++++ Context_Managers.py | 5 + Hello_Python_World.py | 1 + Hello_Python_World_Alternative.py | 5 + Lambda_funcs.py | 24 ++++ Lists_In_Functions.py | 14 ++ Projects.code-workspace | 15 +++ README.txt | 0 README_GITEA_PUSH.md | 90 +++++++++++++ RMD_Calculator.py | 34 +++++ URLSuffixHash.py | 106 +++++++++++++++ activations.py | 22 +++ alien.py | 7 + alien1.py | 4 + alien2.py | 4 + alien3.py | 14 ++ alien4.py | 6 + alien5.py | 7 + alien5a.py | 3 + alien5get_method.py | 3 + aliens.py | 7 + amusement_park.py | 9 ++ amusement_park_alternate.py | 11 ++ animal_talk.py | 75 +++++++++++ apostrophe.py | 2 + areaOfTriangle.py | 16 +++ args_and_kargs_in_func.py | 19 +++ args_and_optionals.py | 33 +++++ array_boolean_indexing.py | 10 ++ array_comparisons.py | 18 +++ array_copying.py | 18 +++ array_creation_functions.py | 25 ++++ array_indexing.py | 25 ++++ array_manipulation.py | 18 +++ array_scalar_operations.py | 62 +++++++++ array_statistical_operations.py | 72 ++++++++++ assigning_values_to_indexed_elements.py | 44 ++++++ banned_users.py | 5 + bicycles.py | 10 ++ broadcasting_arrays.py | 34 +++++ cars.py | 25 ++++ cars2.py | 7 + class_Pet.py | 25 ++++ class_inheritance.py | 25 ++++ class_user_def_context_mgr.py | 22 +++ classes_fundamentals.py | 63 +++++++++ complex_class.py | 73 ++++++++++ concatenating_arrays.py | 38 ++++++ console_print_with_function.py | 7 + cylinder_max.py | 43 ++++++ decorator_add.py | 47 +++++++ decorator_chaining.py | 33 +++++ decorator_exercise.py | 33 +++++ decorator_validation.py | 17 +++ def decode_permissions(permissions):.py | 47 +++++++ default_func_parameters.py | 12 ++ dict_merge.py | 6 + digital_to_binary.py | 23 ++++ digital_to_hexidecimal.py | 23 ++++ dimensions.py | 35 +++++ discounted_list_prices.py | 14 ++ enhanced_decorators.py | 42 ++++++ even_numbers.py | 2 + famous_quote.py | 3 + famous_quote_2.py | 4 + favorite_language_values.py | 11 ++ favorite_languages.py | 10 ++ favorite_languages2.py | 9 ++ favorite_languages3.py | 8 ++ favorite_languages4.py | 12 ++ favorite_languages_in_set.py | 11 ++ favorite_languages_modified.py | 12 ++ favorite_languages_sorted.py | 9 ++ file_extension.py | 2 + first_numbers.py | 5 + flattening_arrays.py | 27 ++++ flexible_decorators.py | 49 +++++++ foods.py | 30 +++++ full_name.py | 6 + func_calls_func.py | 25 ++++ generators.py | 63 +++++++++ global_variables.py | 47 +++++++ high-order_functions.py | 50 +++++++ item_class.py | 170 ++++++++++++++++++++++++ kargs_in_dynamic_funcs.py | 21 +++ keyword_arguments_in_func_exercise.py | 18 +++ keyword_arguments_in_func_solution.py | 28 ++++ keyword_arguments_in_funcs.py | 8 ++ lambda_funcs_with_built-ins.py | 46 +++++++ lambda_with_lists.py | 10 ++ layers.py | 46 +++++++ layers.py.py | 46 +++++++ len.py | 4 + linear_algebra.py | 59 ++++++++ magic_number.py | 4 + magicians.py | 6 + many_users.py | 26 ++++ matrix_class.py | 73 ++++++++++ merge_arrays.py | 13 ++ modify_data_structure.py | 25 ++++ modify_global_var_in_func.py | 8 ++ modifying_a_tuple.py | 11 ++ motorcycles.py | 75 +++++++++++ mult.py | 25 ++++ mult_array.py | 25 ++++ mult_with_pool.py | 17 +++ mult_with_queue.py | 30 +++++ multi-layer-perceptron.py | 56 ++++++++ multi_layer_network.py | 27 ++++ multiple_aliens.py | 14 ++ multiple_aliens_modified.py | 27 ++++ myCode_1.py | 26 ++++ myCode_2.py | 21 +++ name.py | 7 + name_case.py | 5 + nested_functions.py | 19 +++ neural_network_example.py | 36 +++++ non_local_variables.py | 12 ++ numpy_2D_matrices.py | 7 + numpy_array.py | 44 ++++++ numpy_linspace_function.py | 27 ++++ orbital.py | 51 +++++++ packing-unpacking.py | 7 + packing.py | 138 +++++++++++++++++++ personal_message.py | 2 + pizza.py | 11 ++ players.py | 27 ++++ playing_cards.py | 81 +++++++++++ poker.py | 66 +++++++++ practice_1.py | 62 +++++++++ prime_numbers_over_an_interval.py | 20 +++ product_revenues_exercise.py | 21 +++ python-cheat-sheet.pdf | Bin 0 -> 339604 bytes python_closures.py | 17 +++ python_decorators.py | 21 +++ random_arrays.py | 15 +++ random_arrays_2.py | 20 +++ reshape_array.py | 37 ++++++ single_node_neural_network.py | 36 +++++ sleeping_decorator.py | 18 +++ slicing_1D_arrays.py | 31 +++++ sorted_arrays.py | 16 +++ sorting_2d_arrays.py | 24 ++++ square_numbers.py | 6 + square_numbers2.py | 2 + stripping_names.py | 6 + temperature_conversion.py | 21 +++ test.py | 24 ++++ test2.py | 19 +++ test_digital_to_hexidecimal.py | 0 threshold_checker.py | 16 +++ timing_decorator.py | 18 +++ toppings.py | 4 + toppings2.py | 9 ++ toppings3.py | 9 ++ toppings4.py | 11 ++ toppings5.py | 10 ++ toppings6.py | 0 two_numbers_sum_to_9.py | 33 +++++ unpacking.py | 7 + user.py | 10 ++ using_eval_function.py | 3 + using_kwargs.py | 21 +++ using_zip.py | 23 ++++ voting.py | 5 + voting2.py | 5 + voting3.py | 8 ++ votint3.py | 0 zipping_lists.py | 45 +++++++ 214 files changed, 5493 insertions(+) create mode 100644 2D_array_boolean_indexing.py create mode 100644 2D_array_indexing.py create mode 100644 2D_array_slicing.py create mode 100644 2D_int_array_indexing.py create mode 100644 3D_array_indexing.py create mode 100644 CodeChallenge_02(Medium).py create mode 100644 CodeChallenge_1.py create mode 100644 CodeChallenge_10.py create mode 100644 CodeChallenge_11.py create mode 100644 CodeChallenge_12.py create mode 100644 CodeChallenge_13.py create mode 100644 CodeChallenge_14.py create mode 100644 CodeChallenge_15.py create mode 100644 CodeChallenge_16.py create mode 100644 CodeChallenge_17.py create mode 100644 CodeChallenge_18.py create mode 100644 CodeChallenge_19.py create mode 100644 CodeChallenge_2.py create mode 100644 CodeChallenge_20.py create mode 100644 CodeChallenge_21.py create mode 100644 CodeChallenge_22.py create mode 100644 CodeChallenge_23.py create mode 100644 CodeChallenge_24.py create mode 100644 CodeChallenge_25.py create mode 100644 CodeChallenge_26.py create mode 100644 CodeChallenge_27.py create mode 100644 CodeChallenge_28.py create mode 100644 CodeChallenge_29.py create mode 100644 CodeChallenge_3.py create mode 100644 CodeChallenge_30.py create mode 100644 CodeChallenge_31.py create mode 100644 CodeChallenge_32.py create mode 100644 CodeChallenge_33.py create mode 100644 CodeChallenge_34.py create mode 100644 CodeChallenge_35.py create mode 100644 CodeChallenge_36.py create mode 100644 CodeChallenge_37.py create mode 100644 CodeChallenge_38.py create mode 100644 CodeChallenge_39.py create mode 100644 CodeChallenge_4.py create mode 100644 CodeChallenge_5.py create mode 100644 CodeChallenge_6.py create mode 100644 CodeChallenge_7.py create mode 100644 CodeChallenge_8.py create mode 100644 CodeChallenge_9.py create mode 100644 Code_Challenge_medium_1.py create mode 100644 Context_Managers.py create mode 100644 Hello_Python_World.py create mode 100644 Hello_Python_World_Alternative.py create mode 100644 Lambda_funcs.py create mode 100644 Lists_In_Functions.py create mode 100644 Projects.code-workspace create mode 100644 README.txt create mode 100644 README_GITEA_PUSH.md create mode 100644 RMD_Calculator.py create mode 100644 URLSuffixHash.py create mode 100644 activations.py create mode 100644 alien.py create mode 100644 alien1.py create mode 100644 alien2.py create mode 100644 alien3.py create mode 100644 alien4.py create mode 100644 alien5.py create mode 100644 alien5a.py create mode 100644 alien5get_method.py create mode 100644 aliens.py create mode 100644 amusement_park.py create mode 100644 amusement_park_alternate.py create mode 100644 animal_talk.py create mode 100644 apostrophe.py create mode 100644 areaOfTriangle.py create mode 100644 args_and_kargs_in_func.py create mode 100644 args_and_optionals.py create mode 100644 array_boolean_indexing.py create mode 100644 array_comparisons.py create mode 100644 array_copying.py create mode 100644 array_creation_functions.py create mode 100644 array_indexing.py create mode 100644 array_manipulation.py create mode 100644 array_scalar_operations.py create mode 100644 array_statistical_operations.py create mode 100644 assigning_values_to_indexed_elements.py create mode 100644 banned_users.py create mode 100644 bicycles.py create mode 100644 broadcasting_arrays.py create mode 100644 cars.py create mode 100644 cars2.py create mode 100644 class_Pet.py create mode 100644 class_inheritance.py create mode 100644 class_user_def_context_mgr.py create mode 100644 classes_fundamentals.py create mode 100644 complex_class.py create mode 100644 concatenating_arrays.py create mode 100644 console_print_with_function.py create mode 100644 cylinder_max.py create mode 100644 decorator_add.py create mode 100644 decorator_chaining.py create mode 100644 decorator_exercise.py create mode 100644 decorator_validation.py create mode 100644 def decode_permissions(permissions):.py create mode 100644 default_func_parameters.py create mode 100644 dict_merge.py create mode 100644 digital_to_binary.py create mode 100644 digital_to_hexidecimal.py create mode 100644 dimensions.py create mode 100644 discounted_list_prices.py create mode 100644 enhanced_decorators.py create mode 100644 even_numbers.py create mode 100644 famous_quote.py create mode 100644 famous_quote_2.py create mode 100644 favorite_language_values.py create mode 100644 favorite_languages.py create mode 100644 favorite_languages2.py create mode 100644 favorite_languages3.py create mode 100644 favorite_languages4.py create mode 100644 favorite_languages_in_set.py create mode 100644 favorite_languages_modified.py create mode 100644 favorite_languages_sorted.py create mode 100644 file_extension.py create mode 100644 first_numbers.py create mode 100644 flattening_arrays.py create mode 100644 flexible_decorators.py create mode 100644 foods.py create mode 100644 full_name.py create mode 100644 func_calls_func.py create mode 100644 generators.py create mode 100644 global_variables.py create mode 100644 high-order_functions.py create mode 100644 item_class.py create mode 100644 kargs_in_dynamic_funcs.py create mode 100644 keyword_arguments_in_func_exercise.py create mode 100644 keyword_arguments_in_func_solution.py create mode 100644 keyword_arguments_in_funcs.py create mode 100644 lambda_funcs_with_built-ins.py create mode 100644 lambda_with_lists.py create mode 100644 layers.py create mode 100644 layers.py.py create mode 100644 len.py create mode 100644 linear_algebra.py create mode 100644 magic_number.py create mode 100644 magicians.py create mode 100644 many_users.py create mode 100644 matrix_class.py create mode 100644 merge_arrays.py create mode 100644 modify_data_structure.py create mode 100644 modify_global_var_in_func.py create mode 100644 modifying_a_tuple.py create mode 100644 motorcycles.py create mode 100644 mult.py create mode 100644 mult_array.py create mode 100644 mult_with_pool.py create mode 100644 mult_with_queue.py create mode 100644 multi-layer-perceptron.py create mode 100644 multi_layer_network.py create mode 100644 multiple_aliens.py create mode 100644 multiple_aliens_modified.py create mode 100644 myCode_1.py create mode 100644 myCode_2.py create mode 100644 name.py create mode 100644 name_case.py create mode 100644 nested_functions.py create mode 100644 neural_network_example.py create mode 100644 non_local_variables.py create mode 100644 numpy_2D_matrices.py create mode 100644 numpy_array.py create mode 100644 numpy_linspace_function.py create mode 100644 orbital.py create mode 100644 packing-unpacking.py create mode 100644 packing.py create mode 100644 personal_message.py create mode 100644 pizza.py create mode 100644 players.py create mode 100644 playing_cards.py create mode 100644 poker.py create mode 100644 practice_1.py create mode 100644 prime_numbers_over_an_interval.py create mode 100644 product_revenues_exercise.py create mode 100644 python-cheat-sheet.pdf create mode 100644 python_closures.py create mode 100644 python_decorators.py create mode 100644 random_arrays.py create mode 100644 random_arrays_2.py create mode 100644 reshape_array.py create mode 100644 single_node_neural_network.py create mode 100644 sleeping_decorator.py create mode 100644 slicing_1D_arrays.py create mode 100644 sorted_arrays.py create mode 100644 sorting_2d_arrays.py create mode 100644 square_numbers.py create mode 100644 square_numbers2.py create mode 100644 stripping_names.py create mode 100644 temperature_conversion.py create mode 100644 test.py create mode 100644 test2.py create mode 100644 test_digital_to_hexidecimal.py create mode 100644 threshold_checker.py create mode 100644 timing_decorator.py create mode 100644 toppings.py create mode 100644 toppings2.py create mode 100644 toppings3.py create mode 100644 toppings4.py create mode 100644 toppings5.py create mode 100644 toppings6.py create mode 100644 two_numbers_sum_to_9.py create mode 100644 unpacking.py create mode 100644 user.py create mode 100644 using_eval_function.py create mode 100644 using_kwargs.py create mode 100644 using_zip.py create mode 100644 voting.py create mode 100644 voting2.py create mode 100644 voting3.py create mode 100644 votint3.py create mode 100644 zipping_lists.py diff --git a/2D_array_boolean_indexing.py b/2D_array_boolean_indexing.py new file mode 100644 index 0000000..ac4107b --- /dev/null +++ b/2D_array_boolean_indexing.py @@ -0,0 +1,9 @@ +import numpy as np + +array_2d = np.array([ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9] +]) +# Retrieving elements less than 3 or greater than OR greater than or equal to 8 +print(array_2d[(array_2d < 3) | (array_2d >= 8)]) \ No newline at end of file diff --git a/2D_array_indexing.py b/2D_array_indexing.py new file mode 100644 index 0000000..17d3dc2 --- /dev/null +++ b/2D_array_indexing.py @@ -0,0 +1,30 @@ +import numpy as np +array_2d = np.array([[1, 2, 3], [4, 5, 6]]) +# Accessing the first element (1D array) with positive index +print(array_2d[0]) +# Accessing the first element (1D array) with negative index +print(array_2d[-2]) +# Accessing the second element of the first 1D array with negative index +print(array_2d[0, -3]) +# Accessing the second element of the first 1D array with positive index +print(array_2d[0, 1]) +# Accessing the last element of the last 1D array with negative index +print(array_2d[-1, -1]) + +# Creating a 5x5 matrix representing stock prices +stock_prices = np.array([ + [120, 130, 140, 150, 160], + [210, 220, 230, 240, 250], + [310, 320, 330, 340, 350], + [410, 420, 430, 440, 450], + [510, 520, 530, 540, 550] +]) +# Retrieve all the stock prices of the first company over five days with a positive index +first_company_prices = stock_prices[0] +# Retrieve the stock price of the third company on the second day with positive indices +third_company_second_day_price = stock_prices[2, 1] +# Retrieve the stock price of the last company on the last day with negative indices +last_company_last_day_price = stock_prices[-1, -1] +print(first_company_prices) +print(third_company_second_day_price) +print(last_company_last_day_price) \ No newline at end of file diff --git a/2D_array_slicing.py b/2D_array_slicing.py new file mode 100644 index 0000000..c0a5275 --- /dev/null +++ b/2D_array_slicing.py @@ -0,0 +1,19 @@ +import numpy as np +array_2d = np.array([ + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12] +]) +print(array_2d[1:]) +print(array_2d[:, 0]) +print(array_2d[1:, 1:-1]) +print(array_2d[:-1, ::2]) +print(array_2d[2, ::-2]) + +array = np.array([23, 41, 7, 80, 3]) +# Retrieving elements at indices 0, 1 and 3 +print(array[[0, 1, 3]]) +# Retrieving elements at indices 1, -1 and 2 in this order +print(array[[1, -1, 2]]) +# IndexError is thrown since index 5 is out of bounds +print(array[[2, 4]]) \ No newline at end of file diff --git a/2D_int_array_indexing.py b/2D_int_array_indexing.py new file mode 100644 index 0000000..6142a13 --- /dev/null +++ b/2D_int_array_indexing.py @@ -0,0 +1,19 @@ +import numpy as np + +array_2d = np.array([ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9] +]) +# Retrieving first and the third row +print(array_2d[[0, 2]]) +# Retrieving the main diagonal elements +print(array_2d[[0, 1, 2], [0, 1, 2]]) +# Retrieving the first and third element of the second row +print(array_2d[1, [0, 2]]) +# IndexError is thrown, since index 3 along axis 0 is out of bounds +print(array_2d[[0, 2], [0, 1]]) +#print(array_2d[[0, 1, 2], [2, 1, 0]]) + + + diff --git a/3D_array_indexing.py b/3D_array_indexing.py new file mode 100644 index 0000000..9f9e89e --- /dev/null +++ b/3D_array_indexing.py @@ -0,0 +1,17 @@ +import numpy as np + +array_3d = np.array([ + [[1, 2, 3], [4, 5, 6]], + [[7, 8, 9], [10, 11, 12]], + [[13, 14, 15], [16, 17, 18]] +]) + +# Retrieving the first and second element of the first row in the second 2D array +#print(array_3d[0, 1, [0, 1]]) +# Retrieving the first and second element of the second row in the second 2D array +#print(array_3d[1, 1, [0, 1]]) +# Retrieving the first and second element of the second row in the third 2D array +#print(array_3d[2, 1, [0, 1]]) + +#accessing the main diagonal elements across the 3D array +print(array_3d[[0, 1, 2], [0, 1, 1], [0, 1, 2]]) \ No newline at end of file diff --git a/CodeChallenge_02(Medium).py b/CodeChallenge_02(Medium).py new file mode 100644 index 0000000..f368ab8 --- /dev/null +++ b/CodeChallenge_02(Medium).py @@ -0,0 +1,34 @@ +''' +The ternary numeric system is commonly used in Codeland, and to represent ternary numbers, the Tick alphabet is employed. In this system, the digit 0 +is represented by ., 1 by -., and 2 by --. Your task is to decode a Tick-encoded string and determine the corresponding ternary number. + +Example 1 +Input: +.-.-- +Output: +012 +''' + +class Solution(object): + def solve(self, code:str)->str: + tick_map = {'.': '0', '-.': '1', '--': '2'} + i = 0 + result = '' + while i < len(code): + if code[i] == '.': + result += '0' + i += 1 + elif code[i:i+2] == '-.': + result += '1' + i += 2 + elif code[i:i+2] == '--': + result += '2' + i += 2 + return result + +# Usage +s = Solution() +print(s.solve("-.--.-.--")) + + + \ No newline at end of file diff --git a/CodeChallenge_1.py b/CodeChallenge_1.py new file mode 100644 index 0000000..a034169 --- /dev/null +++ b/CodeChallenge_1.py @@ -0,0 +1,12 @@ +class Solution(object): + def solve(self,a:int,b:int,c:int)->int: + print(f"a: {a}, b: {b}, c: {c}") + v1 = a + b * c + v2 = a * (b + c) + v3 = a * b *c + v4 = (a + b) * c + s_max = max(v1, v2, v3, v4) + return s_max + +s = Solution() +print (s.solve(2, 7, 6)) \ No newline at end of file diff --git a/CodeChallenge_10.py b/CodeChallenge_10.py new file mode 100644 index 0000000..24cfa57 --- /dev/null +++ b/CodeChallenge_10.py @@ -0,0 +1,23 @@ +''' +Given two integers x and y, return a list of integers: the first being the minimum of x and y, and the second being the maximum of x and y. + +Example 1 +Input: +x = 5; y = 3 +Output: +[3, 5] +''' +from typing import List + +class Solution(object): + def solve(self, x:int, y:int) -> List[int]: + print(f"x: {x}, y: {y}") + result = [] + result.append(min(x, y)) + result.append(max(x, y)) + return result + +s = Solution() +print(s.solve(5, 3)) # Output: [3, 5] +print(s.solve(10, 20)) # Output: [10, 20] +print(s.solve(19, -3)) # Output: [-3, 19] \ No newline at end of file diff --git a/CodeChallenge_11.py b/CodeChallenge_11.py new file mode 100644 index 0000000..7e6b027 --- /dev/null +++ b/CodeChallenge_11.py @@ -0,0 +1,30 @@ +''' +Bill keeps his most treasured savings in a home safe with a combination lock. The combination lock is +represented by n rotating disks with digits from 0 to 9 written on them. Bill has to turn some disks so +that the combination of digits on the disks forms a secret combination. In one move, he can rotate one +disk one digit forwards or backwards. In particular, in one move he can go from digit 0 to digit 9 and +vice versa. What minimum number of actions does he need for that? + +Given an integer original and an integer of final code combination target, return an integer of the minimum +number of moves Bill needs to open the lock + +Example 1 +Input: +original = 82195; target = 64723 +Output: +13 +''' +class Solution(object): + def solve(self, original:int, target:int) -> int: + print(f"original: {original}, target: {target}") + original_str = f"{original}" + target_str = f"{target}" + turns = 0 + for i in range(len(original_str)): + diff = abs(int(original_str[i]) - int(target_str[i])) + turns += min(diff, 10 - diff) + return turns + +s = Solution() +print(s.solve(82195, 64723)) +print(s.solve(12345, 98765)) # Output: 1 \ No newline at end of file diff --git a/CodeChallenge_12.py b/CodeChallenge_12.py new file mode 100644 index 0000000..28c1129 --- /dev/null +++ b/CodeChallenge_12.py @@ -0,0 +1,41 @@ +''' +Given an integer n, determine how many integers x (where 1 ≤ x ≤ n) are interesting. An integer x is considered interesting if the sum of its digits decreases when incremented by 1, i.e., S(x+1) < S(x), where S(x) represents the sum of the digits of x in the decimal system. + +Your task is to count how many such interesting numbers exist within the given range. + +Example 1 +Input: +9 +Output: +1 +Example 2 +Input: +19 +Output: +2 +Example 3 +Input: +1 +Output: +0 +''' +class Solution(object): + def solve(self, n:int) -> int: + print(f"n: {n}") + interesting_count = 0 + for x in range(1, n + 1): + if self.is_interesting(x): + interesting_count += 1 + return interesting_count + + def is_interesting(self, x:int) -> bool: + return self.digit_sum(x + 1) < self.digit_sum(x) + + def digit_sum(self, x:int) -> int: + return sum(int(digit) for digit in str(x)) + +s = Solution() +print(s.solve(9)) # Output: 1 +print(s.solve(19)) # Output: 2 +print(s.solve(1)) # Output: 0 +print(s.solve(160)) # Output: 9 \ No newline at end of file diff --git a/CodeChallenge_13.py b/CodeChallenge_13.py new file mode 100644 index 0000000..0948989 --- /dev/null +++ b/CodeChallenge_13.py @@ -0,0 +1,25 @@ +''' +Jane, a budding mathematician and a second-grade student, is learning how to perform addition. Her teacher wrote down a sum of several numbers on the board, and the +students were asked to calculate the total. To keep things simple, the sum only includes the numbers 1, 2, and 3. However, Jane is still getting the hang of addition, +so she can only calculate the sum if the numbers are arranged in non-decreasing order (i.e., each number is greater than or equal to the one before it). For example, she cannot compute a sum like 2+1+3+2, but she can handle 1+2+2+3. +Your task is to rearrange the numbers in the given sum so that Sophia can compute it. + +Example 1 +Input: +1+3+2+1 +Output: +1+1+2+3 +''' +class Solution(object): + def solve(self, s:str) -> str: + print(f"s: {s}") + # Write your code here. + input_numbers = s.split('+') + print(f"input_numbers: {input_numbers}") + input_numbers = [int(num) for num in input_numbers] + input_numbers.sort() + return '+'.join(map(str, input_numbers)) # Join them back with '+' to form the output string + +s = Solution() +print(s.solve("1+3+2+1")) +print(s.solve("5+3+11+5+7")) # Output: "1+1+2+3" \ No newline at end of file diff --git a/CodeChallenge_14.py b/CodeChallenge_14.py new file mode 100644 index 0000000..d310b61 --- /dev/null +++ b/CodeChallenge_14.py @@ -0,0 +1,28 @@ +''' +Given three digits a, b, c, where two of them are equal and one is different, return the value that occurs exactly once. + +Example 1 +Input: +a = 1; b = 2; c = 2 +Output: +1 +Example 2 +Input: +a = 4; b = 3; c = 4 +Output: +3 +''' + +class Solution(object): + def solve(self,a:int, b:int, c:int) -> int: + print(f"a: {a}, b: {b}, c: {c}") + if a != b and a != c: + return a + elif b != a and b != c: + return b + else: + return c + +s = Solution() +print(s.solve(1, 2, 2)) +print(s.solve(4, 3, 4)) \ No newline at end of file diff --git a/CodeChallenge_15.py b/CodeChallenge_15.py new file mode 100644 index 0000000..a9a084e --- /dev/null +++ b/CodeChallenge_15.py @@ -0,0 +1,26 @@ +''' + Given an integer a and an integer b, return the smallest integer n such that if a is tripled n times and b is doubled n times, a exceeds b. + +Example 1 +Input: +a = 17; b = 100 +Output: +5 +''' + + +class Solution: + def solve(self, a:int, b:int) -> int: + print(f"a: {a}, b: {b}") + triple = a + double = b + n = 0 + while triple < double: + n += 1 + triple *= 3 + double *= 2 + return n + +s = Solution() +print(s.solve(17, 100)) +print(s.solve(4, 16806)) \ No newline at end of file diff --git a/CodeChallenge_16.py b/CodeChallenge_16.py new file mode 100644 index 0000000..f8405a8 --- /dev/null +++ b/CodeChallenge_16.py @@ -0,0 +1,26 @@ +''' +Given an integer n, return the last two digits of the number 5 raised to the power of n. Note that n can be rather large, so direct computation may not be feasible. The task requires an efficient approach to solve the problem. + +Example 1 +Input: +2 +Output: +25 +''' + +class Solution(object): + def solve(self, n:int) -> int: + print(f"n: {n}") + i = 1 + pow = 1 + for i in range (n): + pow *= 5 + pow_str = str(pow) + result = int(pow_str[-2:]) + return result + +s = Solution() +print(s.solve(4)) # Output: 25 +print(s.solve(100)) # Output: 25 +print(s.solve(1000)) # Output: 25 +print(s.solve(89)) # Output: 25 \ No newline at end of file diff --git a/CodeChallenge_17.py b/CodeChallenge_17.py new file mode 100644 index 0000000..e0abd3d --- /dev/null +++ b/CodeChallenge_17.py @@ -0,0 +1,40 @@ +''' +The price of one tomato at grocery-store is a dollars, but there is a promotion where you can buy two tomatoes for b dollars. Bob needs to buy exactly n tomatoes. +When buying two tomatoes, he can choose to buy them at the regular price or at the promotion price. What is the minimum amount of dollars Bob should spend to buy +n tomatoes? + +Example 1 +Input: +n = 2; a = 5; b = 9 +Output: +9 +Example 2 +Input: +n = 3; a = 5; b = 11 +Output: +15 +''' + +class Solution(object): + def solve(self, n:int, a:int, b:int) -> int: + print(f"n: {n}, a: {a}, b: {b}") + total = 0 + if n == 1: + total = a + else: + if a*2 > b: + if n % 2 == 0: # Buy at lower price + total = int((n/2)*b) + else: + total = int(((n-1)/2)*b + a) + elif b > a*2: + total = n*a + elif b == 2*a: + total = n*a + return total + +s = Solution() +print(s.solve(2, 5, 9)) # Output: 9 +print(s.solve(3, 5, 11)) # Output: 15 +print(s.solve(1, 5, 12)) +print(s.solve(9, 7, 13)) \ No newline at end of file diff --git a/CodeChallenge_18.py b/CodeChallenge_18.py new file mode 100644 index 0000000..21a993c --- /dev/null +++ b/CodeChallenge_18.py @@ -0,0 +1,36 @@ +''' +One day three best friends Bill, Bob, and Jane decided to form a team and take part in programming contests. During these contests, participants are typically +given several problems to solve. Before the competition began, the friends agreed on a rule: +They would only attempt to solve a problem if at least two of them were confident in their solution. Otherwise, they would skip that problem. For each problem, it is +known which of the friends are sure about the solution. Your task is to help the friends determine the number of problems they will attempt to solve based on their rule. + +Given a list of lists of triples of integers 1 or 0. If the first number in the line equals 1, then Bill is sure about the problem's solution, otherwise he isn't sure. +The second number shows Bob’s view on the solution, the third number shows Jane’s view. Return an integer - the number of problems the friends will implement on the +contest. + +Example 1 +Input: +[[ 1, 0, 1 ], [1, 1, 1], [0, 0, 0]] +Output: +2 +Example 2 +Input: +[[0, 1, 1], [0, 0, 1], [1, 1, 1], [1, 1, 0]] +Output: +3 +''' +from typing import List + +class Solution(object): + def solve(self, problems: List[List[int]]) -> int: + print(f"problems: {problems}") + count = 0 + for problem in problems: + if sum(problem) >= 2: + count += 1 + return count + +s = Solution() +# Example usage +print(s.solve([[1, 0, 1], [1, 1, 1], [0, 0, 0]])) # Output: 2 +print(s.solve([[0, 1, 1], [0, 0, 1], [1, 1, 1], [1, 1, 0]])) # Output: 3 \ No newline at end of file diff --git a/CodeChallenge_19.py b/CodeChallenge_19.py new file mode 100644 index 0000000..12e4d65 --- /dev/null +++ b/CodeChallenge_19.py @@ -0,0 +1,34 @@ +''' +Bob has three sisters: Ann, Bella, and Caroline. They're collecting coins. Currently, Ann has a coins, Bella has b coins and Caroline has c coins. Recently Bob has +returned from the trip around the world and brought n coins. He wants to distribute all these n coins between his sisters in such a way that the number of coins Ann +has is equal to the number of coins Bella has and is equal to the number of coins Caroline has. In other words, if Bob gives A coins to Ann, B coins to Bella and C +coins to Caroline A+B+C=n, then a+A=b+B=c+C + +Note that A, B or C (the number of coins Bob gives to Ann, Bella and Caroline correspondingly) can be 0. Help Bob to find out if it is possible to distribute all n +coins between sisters in a way described above. + +Given an integers a - the number of coins Ann has , b - number of coins Bella has, c - number of coins Caroline has and n - the number of coins Bob has. +Return YES if Bob can distribute all n coins between his sisters and NO in the opposite case. + +Example 1 +Input: +a = 3, b = 798, c = 437, n = 1804 +Output: +YES +''' + +class Solution(object): + def solve(self,a:int, b:int, c:int, n:int) -> str: + print(f"a: {a}, b: {b}, c: {c}, n: {n}") + total = a + b + c + n + if total % 3 == 0: + target = total // 3 + if target >= a and target >= b and target >= c: + return "YES" + return "NO" + +s = Solution() +# Example usage +print(s.solve(3, 798, 437, 1804)) # Output: YES +print(s.solve(1, 2, 3, 4)) # Output: NO + \ No newline at end of file diff --git a/CodeChallenge_2.py b/CodeChallenge_2.py new file mode 100644 index 0000000..84e8150 --- /dev/null +++ b/CodeChallenge_2.py @@ -0,0 +1,11 @@ +class Solution(object): + def solve(self, n:int) -> str: + print(f"n: {n}") + s = list(str(n)) + for i in range(len(s)): + if s[i] != '4' and s[i] != '7': + return "NO" + return "YES" + +s = Solution() +print(s.solve(47)) \ No newline at end of file diff --git a/CodeChallenge_20.py b/CodeChallenge_20.py new file mode 100644 index 0000000..cc343e0 --- /dev/null +++ b/CodeChallenge_20.py @@ -0,0 +1,27 @@ +''' +Given an array of operations ++x, x++, --x. x-- and an integer target, return an initial integer, so that the final value is the target value. + +Example 1 +Input: +["x++", "--x", "--x"], 12 +Output: +13 +''' + +from typing import List + +class Solution(object): + def solve(self,ops:List[str], target:int) -> int: + print(f"ops: {ops}, target: {target}") + current = 0 + for op in ops: + if op == "++x" or op == "x++": + current += 1 + else: + current -= 1 + return target - current + +s = Solution() +print(s.solve(["x++", "--x", "--x"], 12)) # Output: 13 +print(s.solve(["x++", "x++", "x--"], 2)) # Output: 1 +print(s.solve(["--x", "x++", "x++"], 3)) \ No newline at end of file diff --git a/CodeChallenge_21.py b/CodeChallenge_21.py new file mode 100644 index 0000000..5fd0555 --- /dev/null +++ b/CodeChallenge_21.py @@ -0,0 +1,27 @@ +''' +Bill has found a set. The set consists of small English letters. Bill carefully wrote out all the letters from the set in one line, separated by a comma. He also added an opening curved bracket at the beginning of the line and a closing curved bracket at the end of the line. Unfortunately, from time to time Bill would forget writing some letter and write it again. Help Bill to count the total number of distinct letters in his set. + +Given a string of set format set_str, return an integer of total number of distinct letters from set. + +Example 1 +Input: +{b, a, b, a} +Output: +2 +''' + +class Solution(object): + def solve(self, set_str:str) -> int: + print(f"set_str: {set_str}") + # Remove the curly braces and split the string by comma + elements = set_str[1:-1].split(", ") + # Use a set to find distinct elements + distinct_elements = set(elements) + return len(distinct_elements) + +s = Solution() +print(s.solve("{b, a, b, a}")) # Output: 2 +print(s.solve("{c, d, e, c, d}")) # Output: 3 +print(s.solve("{x, y, z}")) # Output: 3 +print (s.solve("{a, b, c, d, e, f, g, h, i, j}")) # Output: 10 +print(s.solve("{a, a, a, a}")) # Output: 1 \ No newline at end of file diff --git a/CodeChallenge_22.py b/CodeChallenge_22.py new file mode 100644 index 0000000..f6acc7c --- /dev/null +++ b/CodeChallenge_22.py @@ -0,0 +1,27 @@ +''' +Given a list of integers and a threshold integer, return a sum of numbers, where each number contributes 2 if it exceeds or equals +the threshold and 1 otherwise. + +Example 1 +Input: +[2, 8, 25, 18, 99, 11, 17, 16], 17 +Output: +12 +''' +from typing import List + +class Solution(object): + def solve(self, nums:List[int], threshold:int) -> int: + print(f"nums: {nums}, threshold: {threshold}") + total = 0 + for num in nums: + if num >= threshold: + total += 2 + else: + total += 1 + return total + +s = Solution() +print(s.solve([2, 8, 25, 18, 99, 11, 17, 16], 17)) # Output: 12 +print(s.solve([1, 2, 3, 4, 5], 3)) # Output: 8 +print(s.solve([10, 20, 30], 15)) # Output: \ No newline at end of file diff --git a/CodeChallenge_23.py b/CodeChallenge_23.py new file mode 100644 index 0000000..81a5d08 --- /dev/null +++ b/CodeChallenge_23.py @@ -0,0 +1,34 @@ +''' +Given an integers a and b, return a count of numbers between a and b (inclusive) that have no repeated digits. + +Example 1 +Input: +a = 100; b = 1000 +Output: +648 +''' + +class Solution(object): + def solve(self,a:int, b:int) ->int: + print(f"a: {a}, b: {b}") + count = 0 + for num in range(a, b+1): # Iterate through each number in the range + if self.has_unique_digits(num): + count += 1 # increment count if the number has unique digits + return count + + def has_unique_digits(self, num:int) -> bool: + digits = set() + while num > 0: + digit = num % 10 # Looks at the last digit of num + if digit in digits: # If the digit is already in the set, return false + return False + digits.add(digit) # Add the digit to the set of digits + num //= 10 # Remove the last digit of num + return True + +s = Solution() +print(s.solve(100, 1000)) # Output: 648 +print(s.solve(1000, 10000)) # Output: 5520 +print(s.solve(10001, 100000)) # Output: 45360 +print(s.solve(500, 600)) # Output: 403200 diff --git a/CodeChallenge_24.py b/CodeChallenge_24.py new file mode 100644 index 0000000..f9be9c0 --- /dev/null +++ b/CodeChallenge_24.py @@ -0,0 +1,27 @@ +''' +Given three integers a, b, and c, return + if the equation a + b = c is true, and - if the equation a - b = c is true + +Example 1 +Input: +a = 1; b = 2; c = 3 +Output: ++ +Example 2 +Input: +a = 2; b = 9; c = -7 +Output: +- +''' + +class Solution(object): + def solve(self, a:int, b:int, c:int) -> str: + if a + b == c: + return "+" + elif a - b == c: + return "-" + else: + return "0" + +s = Solution() +print(s.solve(1, 2, 3)) # Output: "+" +print(s.solve(2, 9, -7)) # Output: "-" \ No newline at end of file diff --git a/CodeChallenge_25.py b/CodeChallenge_25.py new file mode 100644 index 0000000..4a07858 --- /dev/null +++ b/CodeChallenge_25.py @@ -0,0 +1,19 @@ +''' +Given an array of integers nums and an integer k, return an amount of integers in array are larger than the k. + +Example 1 +Input: +[9, 10, 2, 3, 55, 76, 12, 6]; k = 7 +Output: +5 +''' +class Solution(object): + def solve(self, nums: list[int], k: int) -> int: + count = 0 + for num in nums: + if num > k: + count += 1 + return count + +s = Solution() +print(s.solve([9, 10, 2, 3, 55, 76, 12, 6], 7)) # Output: 5 \ No newline at end of file diff --git a/CodeChallenge_26.py b/CodeChallenge_26.py new file mode 100644 index 0000000..2a4c97f --- /dev/null +++ b/CodeChallenge_26.py @@ -0,0 +1,33 @@ +''' +Bob has recently started commuting by bus. We know that a one bus ride ticket costs a dollars. Besides, Bob found out that he can buy a special ticket for m rides, +also he can buy it several times. It costs b dollars. Bob will need to use bus n times. Help Bob to calculate what is the minimum sum of money he will have to spend +to make n rides? + +Example 1 +Input: +n = 10; m = 3; a = 1; b = 2 +Output: +7 +Example 2 +Input: +n = 10; m = 2; a = 1; b = 1 +Output: +5 +''' +import math + +class Solution(object): + def solve(self, n: int, m: int, a: int, b: int) -> int: # n: number of rides, m: rides in special ticket, a: cost of single ticket, b: cost of special ticket + # Calculate the cost using only single tickets + cost_single = n * a + # Calculate the cost using special tickets + cost_special = (n // m) * b + (n % m) * a # Full special tickets + remaining rides with single tickets + + cost_packs_only = math.ceil(n / m) * b # If we only use special tickets, we need to round up the number of packs + # Return the minimum of the two costs + return min(cost_single, cost_special, cost_packs_only) + + +s = Solution() +print(s.solve(10, 3, 5, 1)) # Output: 4 +print(s.solve(10, 2, 1, 1)) # Output: 5 \ No newline at end of file diff --git a/CodeChallenge_27.py b/CodeChallenge_27.py new file mode 100644 index 0000000..0953876 --- /dev/null +++ b/CodeChallenge_27.py @@ -0,0 +1,25 @@ +''' +Bill decided to visit his friend. It turned out that the Bill's house is located at point 0 and his friend's house is located at point x (x > 0) of the +coordinate line. In one step Bill can move 1, 2, 3, 4 or 5 positions forward. + +Given integer x, return the minimum number of steps Bill needs to make in order to get to his friend's house. + +Example 1 +Input: +12 +Output: +3 +Example 2 +Input: +41 +Output: +9 +''' +class Solution(object): + def solve(self, x: int) -> int: + return (x + 4) // 5 # Round up division by 5 + +s = Solution() +print(s.solve(12)) # Output: 3 +print(s.solve(41)) # Output: 9 +print(s.solve(999999)) # Output: 200000 diff --git a/CodeChallenge_28.py b/CodeChallenge_28.py new file mode 100644 index 0000000..2846f68 --- /dev/null +++ b/CodeChallenge_28.py @@ -0,0 +1,41 @@ +''' +Liam enjoys playing chess, and so does his friend Noah. One day, they played n games in a row. For each game, it is known who the winner was—Liam or Noah. +None of the games ended in a tie. + +Now Liam is curious to know who won more games - him or Noah. Can you help him find out? +Given a string s, consisting of uppercase English letters L and N — the outcome of each of the games. The i-th character of the string is equal to L if the Liam +won the i-th game and N if Noah won the i-th game, return a string with Noah If Noah won more games than Liam and Liam in the opposite case. If Noah and Liam won +the same number of games, return Friendship + +Example 1 +Input: +LNLLLL +Output: +Liam +Example 2 +Input: +NLNLNL +Output: +Friendship +Example 3 +Input: +NNLNLN +Output: +Noah +''' + +class Solution(object): + def solve(self, s:str) -> str: + liam_wins = s.count('L') + noah_wins = s.count('N') + if liam_wins > noah_wins: + return "Liam" + elif noah_wins > liam_wins: + return "Noah" + else: + return "Friendship" + +s = Solution() +print(s.solve("LNLLLL")) # Output: Liam +print(s.solve("NLNLNL")) # Output: Friendship +print(s.solve("NNLNLN")) # Output: Noah \ No newline at end of file diff --git a/CodeChallenge_29.py b/CodeChallenge_29.py new file mode 100644 index 0000000..fcd7316 --- /dev/null +++ b/CodeChallenge_29.py @@ -0,0 +1,58 @@ +''' +Bob likes to play his game on paper. He writes n integers a1, a2, ..., an. Each of those integers can be either 0 or 1. He's allowed to +do exactly one move: he chooses two indices i and j (1 ≤ i ≤ j ≤ n) and flips all values ak for which their positions are in range [i, j] +(that is i ≤ k ≤ j). Flip the value of ak means to apply operation ak = 1 - ak. + +The goal of the game is that after exactly one move to obtain the maximum number of ones. + +Given a list of 0 or 1. Return the maximal number of 1s that can be obtained after exactly one move. + +Example 1 +Input: +[1, 0, 0, 0, 1, 0, 0, 0] +Output: +7 +''' + +from typing import List + +class Solution(object): + def solve(self, l:List[int]) -> int: + current_ones = sum(l) + max_ones = 0 + for i in range(len(l)): + for j in range(i, len(l)): + flipped = l[i:j+1] # Flipping the segment from i to j + if flipped.count(1) == len(flipped): # If all are 1 + new_ones = current_ones - len(flipped) # Flipping all 1s to 0s + new_ones = current_ones - sum(flipped) + len(flipped) - sum(flipped) # Flipping 0s to 1s and 1s to 0s + max_ones = max(max_ones, new_ones) + return max_ones + +s = Solution() +print(s.solve([1, 0, 0, 0, 1, 0, 0, 0])) # Output: 7 +print(s.solve([1, 1, 1, 1, 1, 1, 1, 1])) # Output: 8 +print(s.solve([0, 0, 0, 0, 0, 0, 0, 0])) # Output: 8 + +''' + def solve_optimized(self, l: List[int]) -> int: + n = len(l) + current_ones = sum(l) + max_diff = float('-inf') + current_diff = 0 + + for i in range(n): + if l[i] == 1: + current_diff -= 1 + else: + current_diff += 1 + + if current_diff < 0: + current_diff = 0 + + max_diff = max(max_diff, current_diff) + + return current_ones + max_diff if max_diff != float('-inf') else current_ones + +''' + diff --git a/CodeChallenge_3.py b/CodeChallenge_3.py new file mode 100644 index 0000000..1c599ee --- /dev/null +++ b/CodeChallenge_3.py @@ -0,0 +1,28 @@ +''' +Given an array of three arrays of triples of integers, return the missing triple of integers to make them all add up to 0 coordinatewise + +Example 1 +Input: +[[1, 2, 3], [9, -2, 8], [17, 2, 50]] +Output: +[-27, -2, -61] + +''' +from typing import List + +class Solution(object): + def solve(self, nums:List[List[int]]) -> List[int]: + print(f"nums: {nums}") + # Initialize the result triple + result = [0, 0, 0] + # Iterate through each array + for arr in nums: + # Add the values coordinatewise + for i in range(3): + result[i] += arr[i] + # The missing triple is the negative of twice the result + return [-2*x for x in result] + +arrays = [[1,-2, 3], [9, -2, 8], [27, 2, 50]] +solution = Solution() +print(solution.solve(arrays)) \ No newline at end of file diff --git a/CodeChallenge_30.py b/CodeChallenge_30.py new file mode 100644 index 0000000..aad4b73 --- /dev/null +++ b/CodeChallenge_30.py @@ -0,0 +1,34 @@ +''' +Given a binary array consisting of only 0s and 1s, return the length of the longest segment of consecutive 0s (also referred to as a blank space) in the array. + +Example 1 +Input: +[1, 0, 0, 1, 0] +Output: +2 +Example 2 +Input: +[1, 1, 1] +Output: +0 +''' + +from typing import List + +class Solution(object): + def solve(self, a:List[int]) -> int: + max_length = 0 + current_length = 0 + for num in a: + if num == 0: + current_length += 1 + max_length = max(max_length, current_length) + else: + current_length = 0 + return max_length + +s = Solution() +print(s.solve([1, 0, 0, 1, 0])) +# Output: 2 +print(s.solve([1, 1, 1])) +# Output: 0 \ No newline at end of file diff --git a/CodeChallenge_31.py b/CodeChallenge_31.py new file mode 100644 index 0000000..b39f70d --- /dev/null +++ b/CodeChallenge_31.py @@ -0,0 +1,34 @@ +''' +A young girl named Emily is learning how to subtract one from a number, but she has a unique way of doing it when the number has two or more digits. + +Emily follows these steps: +If the last digit of the number is not zero, she simply subtracts one from the number. +If the last digit of the number is zero, she divides the number by 10 (effectively removing the last digit). +You are given an integer number n. Emily will perform this subtraction process k times. Your task is to determine the final result after all k subtractions. It is guaranteed that the result will always be a positive integer. + +Example 1 +Input: +n = 512, k = 4 +Output: +50 +Explanation: +512→511→510→51→50 +''' + +class Solution(object): + def solve(self, n:int, k:int) -> int: + for _ in range(k): + if n % 10 != 0: + n -= 1 + else: + n //= 10 + return n + + +# Example usage: +if __name__ == "__main__": + solution = Solution() + print(solution.solve(512, 4)) # Output: 50 + print(solution.solve(100, 3)) # Output: 10 + print(solution.solve(12345, 5)) # Output: 12340 + print(solution.solve(10, 1)) # Output: 1 \ No newline at end of file diff --git a/CodeChallenge_32.py b/CodeChallenge_32.py new file mode 100644 index 0000000..1682bb1 --- /dev/null +++ b/CodeChallenge_32.py @@ -0,0 +1,33 @@ +''' +A string consisting only of the characters b, d and w is painted on a glass window of a store. Alex walks past the store, standing directly in front of the glass +window, and observes string s. Alex then heads inside the store, looks directly at the same glass window, and observes string r. +Alex gives you string s. Your task is to find and output string r. + +Example 1 +Input: +dwd +Output: +bwb +Example 2 +Input: +bbwwwddd +Output: +bbbwwwdd +''' +class Solution(object): + def solve(self, s:str) -> str: + r = [] + s = s[::-1] #reverse the string + # Create a translation table for characters + for char in s: + trans = str.maketrans({'b':'d','d':'b','w':'w'}) + return s.translate(trans) + +# Example usage: +if __name__ == "__main__": + solution = Solution() + print(solution.solve("dwd")) # Output: "bwb" + print(solution.solve("bbwwwddd")) # Output: "bbbwwwdd" + print(solution.solve("bwd")) # Output: "dwb" + print(solution.solve("d")) # Output: "b" + print(solution.solve("billyjoebob")) #Output: "dodeojyllid" \ No newline at end of file diff --git a/CodeChallenge_33.py b/CodeChallenge_33.py new file mode 100644 index 0000000..7b11fcd --- /dev/null +++ b/CodeChallenge_33.py @@ -0,0 +1,31 @@ +''' +Given a ticket string consisting of six digits, return YES if its lucky and NO in the opposite case. A ticket is considered lucky if the sum of the first +three digits is equal to the sum of the last three digits, even when there are leading zeroes. + +Example 1 +Input: +213132 +Output: +YES +Example 2 +Input: +973894 +Output: +NO +''' +class Solution(object): + def solve(self,ticket:str)->str: + first_half = ticket[:3] + second_half = ticket[3:] + if sum(int(digit) for digit in first_half) == sum(int(digit) for digit in second_half): + return "YES" + return "NO" + +# Example usage: +if __name__ == "__main__": + solution = Solution() + print(solution.solve("213132")) # Output: YES + print(solution.solve("973894")) # Output: NO + print(solution.solve("123321")) # Output: YES + print(solution.solve("000000")) # Output: YES + print(solution.solve("123456")) # Output: NO \ No newline at end of file diff --git a/CodeChallenge_34.py b/CodeChallenge_34.py new file mode 100644 index 0000000..e4e847b --- /dev/null +++ b/CodeChallenge_34.py @@ -0,0 +1,40 @@ +''' +Sometimes, certain words like optimization or kubernetes are so lengthy that writing them repeatedly in a single text becomes quite tedious. + +Let’s define a word as too long if its length is strictly greater than 7 characters. All such words should be replaced with a special abbreviation. + +The abbreviation is created as follows: +Write the first and last letter of the word, and between them, insert the number of letters that appear between the first and last letters. This number is +written in decimal format and should not contain any leading zeros. + +Your task is to automate the process of abbreviating words. Replace all too long words with their abbreviations, while leaving shorter words unchanged. + +Example 1 +Input: +optimization +Output: +o10n +Example 2 +Input: +kubernetes +Output: +k8s +Example 3 +Input: +word +Output: +word +''' +class Solution(object): + def solve(self, s:str) -> str: + if len(s) > 7: + return f"{s[0]}{len(s) - 2}{s[-1]}" + return s + +solution = Solution() +print(solution.solve("optimization")) # Output: "o10n" +print(solution.solve("kubernetes")) # Output: "k8s" +print(solution.solve("word")) # Output: "word" +print(solution.solve("hello")) # Output: "hello" +print(solution.solve("supercalifragilisticexpialidocious")) # Output: "s30s" +print(solution.solve("bergermeisterblindarmentzuntuntoperationschwierigkeiten")) # Output: "b56n" \ No newline at end of file diff --git a/CodeChallenge_35.py b/CodeChallenge_35.py new file mode 100644 index 0000000..710721a --- /dev/null +++ b/CodeChallenge_35.py @@ -0,0 +1,35 @@ +''' +There is a game called Mario Adventures, consisting of n levels. Bill and his friend Bob are addicted to the game. Each of them wants to pass the whole game. +Bill can complete certain levels on his own and Bob can complete certain levels on his own. If they combine their skills, can they complete all levels together? + +Given an integer n - the total number of levels, list of integers bill_levels - the number of levels Bill can complete and Another list of integers +bob_levels - the number of levels Bob can complete. Return string I become the hero! If they can complete all levels together, in the opposite case Oh, no! +The castle is locked! + +Example 1 +Input: +n = 5; bill_levels = [3, 1, 2, 3]; bob_levels = [2, 2, 4] +Output: +Oh, no! The castle is locked! +''' + +from typing import List + +class Solution(object): + def solve(self, n:int, bill_levels: List[int], bob_levels: List[int]) -> str: + print(f"n: {n}, bill_levels: {bill_levels} bob_levels: {bob_levels}") + total_levels = set(bill_levels + bob_levels) + print(f"Total levels combined: {total_levels}") + if len(total_levels) == n: + return "I become the hero!" + else: + return "Oh, no! The castle is locked!" + +# Example usage +if __name__ == "__main__": + solution = Solution() + n = 5 + bill_levels = [3, 1, 2, 3] + bob_levels = [2, 2, 4] + result = solution.solve(n, bill_levels, bob_levels) + print(result) # Output: Oh, no! The castle is locked! \ No newline at end of file diff --git a/CodeChallenge_36.py b/CodeChallenge_36.py new file mode 100644 index 0000000..53125de --- /dev/null +++ b/CodeChallenge_36.py @@ -0,0 +1,34 @@ +''' +Bob enjoys relaxing after a long day of work. Like many programmers, he's a fan of the famous drink Fantastic, which is sold at various stores around the city. The price of one bottle in store i is xi coins. Bob plans to buy the drink for q consecutive days, and for each day, he knows he will have mi coins to spend. On each day, Bob wants to know how many different stores he can afford to buy the drink from. + +You are given two arrays: + +An array of prices in the shops: prices = [x1, x2, x3, ..., xn] where each xi is the price of one bottle in store i. +An array of coins Bob can spend each day: coins = [m1, m2, m3, ..., mq] where each mi represents the coins Bob can spend on the i-th day. +Return number of shops where Bob will be able to buy a bottle of the drink on the i-th day. + +Example 1 +Input: +prices = [3,10,8,6,11]; coins = [1, 10, 3, 11] +Output: +[0, 4, 1, 5] +''' + +from typing import List + +class Solution(object): + def solve(self,prices:List[int], coins:List[int])->List[int]: + result = [] + for m in coins: + count = sum(1 for x in prices if x <= m) + result.append(count) + return result + + +# Example usage: +if __name__ == "__main__": + prices = [868,987,714,168,123] + coins = [424,192,795,873] + solution = Solution() + print(solution.solve(prices, coins)) + \ No newline at end of file diff --git a/CodeChallenge_37.py b/CodeChallenge_37.py new file mode 100644 index 0000000..4efaaae --- /dev/null +++ b/CodeChallenge_37.py @@ -0,0 +1,49 @@ +''' +Alex loves lucky numbers. Lucky numbers are positive integers that contain only the digits 4 and 7 in their decimal representation. + +For example, numbers like 47, 744, and 4 are lucky, while numbers like 5, 17, and 467 are not. + +Alex calls a number almost lucky if it could be evenly divided by some lucky number. Help him find out if the given number n is almost lucky, +return YES if its almost lucky and NO in the opposite case. + +Example 1 +Input: +47 +Output: +YES +Example 2 +Input: +16 +Output: +YES +Example 3 +Input: +78 +Output: +NO +''' + +class Solution(object): + def solve(self, n): + # Function to check if a number is lucky + def is_lucky(num): + return all(digit in '47' for digit in str(num)) + + # Generate lucky numbers up to n + lucky_numbers = [i for i in range(1, n + 1) if is_lucky(i)] + + # Check if n is almost lucky + for lucky in lucky_numbers: + if n % lucky == 0: + return "YES" + + return "NO" + + +if __name__ == "__main__": + n = int(input()) + solution = Solution() + print(solution.solve(n)) # Output: YES or NO based on the input number n + +# Example usage: +# n = 47 \ No newline at end of file diff --git a/CodeChallenge_38.py b/CodeChallenge_38.py new file mode 100644 index 0000000..97949a5 --- /dev/null +++ b/CodeChallenge_38.py @@ -0,0 +1,34 @@ +''' +You are given an integer n. In one move, you can either: Multiply n by 2, or Divide n by 6 (only if it is divisible by 6 without a remainder). +Return the minimum number of moves needed to obtain 1 from n, or return -1 if it's impossible to do so. + +Example 1 +Input: +1 +Output: +0 +Example 2 +Input: +2 +Output: +-1 +''' + +class Solution(object): + def solve(self, n: int) -> int: + moves = 0 + while n != 1: + if n % 6 == 0: + n //= 6 + elif n % 3 == 0: + n *= 2 + else: + return -1 + moves += 1 + return moves + +# Usage +s = Solution() +print(s.solve(108)) + + \ No newline at end of file diff --git a/CodeChallenge_39.py b/CodeChallenge_39.py new file mode 100644 index 0000000..ab432b5 --- /dev/null +++ b/CodeChallenge_39.py @@ -0,0 +1,61 @@ +''' +You have gifts, and each gift contains a certain number of candies and oranges. Your goal is to make all gifts identical in terms of the number of candies +and oranges. You are allowed to perform the following operations on any gift: + +Remove one candy. +Remove one orange. +Remove one candy and one orange at the same time. +You cannot remove more than what is available in a gift (no negative values). +After performing some moves, all gifts must have the same number of candies and the same number of oranges (though candies and oranges do not need to be equal +to each other). Your task is to find the minimum number of moves required to achieve this. + +Example 1 +Input: +candies = [3, 5, 6]; oranges = [3, 2, 3] +Output: +6 +''' + +from typing import List + +class Solution(object): + def solve(self, candies:List[int], oranges:List[int]) -> int: + """ + Calculates the minimum number of moves required to equalize the number of candies and oranges in all gifts. + + In each move, you can either: + - Remove one candy from a gift, + - Remove one orange from a gift, + - Or remove one candy and one orange from the same gift simultaneously. + + Args: + candies (List[int]): A list of integers representing the number of candies in each gift. + oranges (List[int]): A list of integers representing the number of oranges in each gift. + + Returns: + int: The minimum number of moves required to make all gifts have the same number of candies and oranges. + """ + # Find the minimum candies and oranges in all gifts + min_candies = min(candies) + min_oranges = min(oranges) + moves = 0 + for c, o in zip(candies, oranges): + # Calculate the extra candies and oranges to remove + extra_candies = c - min_candies + extra_oranges = o - min_oranges + # The minimum of the two can be removed together + both = min(extra_candies, extra_oranges) + moves += both + # Remove the rest individually + moves += (extra_candies - both) + (extra_oranges - both) + return moves + +# usage example + +s = Solution() +candies = [1, 2, 3, 4, 5] +oranges = [5, 4, 3, 2, 1] +print(s.solve(candies, oranges)) + + + \ No newline at end of file diff --git a/CodeChallenge_4.py b/CodeChallenge_4.py new file mode 100644 index 0000000..5d45aff --- /dev/null +++ b/CodeChallenge_4.py @@ -0,0 +1,34 @@ +''' +One cozy afternoon, Lily and her friend Noah decided to buy a large cake from their favorite bakery. They chose the most decadent one, layered with rich frosting and +fresh berries. After purchasing, the cake was weighed, showing a total weight of n grams. Excited to share it, they hurried home but soon realized they faced a tricky +problem. Lily and Noah are big fans of even numbers, so they want to divide the cake in such a way that each of the two portions weighs an even number of grams. The +portions don’t need to be equal, but each must have a positive weight. Since they’re both tired and eager to enjoy the cake, you need to help them determine if it’s +possible to split it the way they want. Given an integer number n - the weight of cake bought by Lily and Noah, return a string YES, if Lily and Noah can divide the +cake into two parts, each of them weighing an even number of grams and NO in the opposite case. + +Example 1 +Input: +120 +Output: +YES + +Example 2 +Input: +155 +Output: +NO + +''' + +class Solution(object): + def solve(self, n: int) -> str: + print(f"n: {n}") + # Check if n is even and greater than 2 + if n % 2 == 0 and n > 2: + return "YES" + else: + return "NO" + +s = Solution() +print(s.solve(120)) # Output: YES +print(s.solve(155)) # Output: NO \ No newline at end of file diff --git a/CodeChallenge_5.py b/CodeChallenge_5.py new file mode 100644 index 0000000..35bb1c3 --- /dev/null +++ b/CodeChallenge_5.py @@ -0,0 +1,27 @@ +''' +Bill and Bob have recently joined the Codefinity University for Cool Engineers. They are now moving into a dormitory and want to share the same room. The dormitory has n rooms in total. Each room has a current occupancy and a maximum capacity. Your task is to determine how many rooms have enough space for both Bill and Bob to move in. + +Given a list of n sublists, where each sublist contains two integers c (number of people currently living in the room) and m (room's maximum capacity), return the number of rooms where Bill and Bob can move in together. + +Example 1 +Input: +[[2, 2], [1, 10], [3, 5], [0, 2]] +Output: +3 + +''' +from typing import List + + +class Solution(object): + def solve(self, rooms: List[List[int]]) -> int: + print("Input rooms:", rooms) + count = 0 + for c, m in rooms: + if m - c >= 2: + count += 1 + return count + +s = Solution() +print(s.solve([[2, 2], [1, 10], [3, 5], [0, 2]])) # Output: 3 +print(s.solve([[1, 1], [2, 3], [4, 5], [0, 1], [3, 6]])) # Output: 1 diff --git a/CodeChallenge_6.py b/CodeChallenge_6.py new file mode 100644 index 0000000..97c3f2c --- /dev/null +++ b/CodeChallenge_6.py @@ -0,0 +1,25 @@ +''' +Bear Bill wants to become the largest of bears, or at least to become larger than his brother Bob. Right now, Bill and Bob weigh a and b +respectively. It's guaranteed that Bill's weight is smaller than or equal to his brother's weight. Bill eats a lot and his weight is tripled +after every year, while Bob's weight is doubled after every year. After how many full years will Bill become strictly heavier than Bob? + +Example 1 +Input: +a = 4; b = 7 +Output: +2 +''' + +class Solution(object): + def solve(self, a: int, b: int) -> int: + print("Initial weights - Bill:", a, "Bob:", b) + years = 0 + while a <= b: + a *= 3 + b *= 2 + years += 1 + print(f"After year {years}: Bill's weight = {a}, Bob's weight = {b}") + return years + +s = Solution() +print(s.solve(4, 8)) # Output: 2 diff --git a/CodeChallenge_7.py b/CodeChallenge_7.py new file mode 100644 index 0000000..04e63a7 --- /dev/null +++ b/CodeChallenge_7.py @@ -0,0 +1,19 @@ +class Solution: + def solve(self, n:int) -> int: + print(f"n: {n}") + ''' + find how many (a, b) are possible where a + b = n + n = 3 -> (1, 2), (2, 1) + n = 4 -> (1, 3), (2, 2), (3, 1) + ''' + a = 1 + count = 0 + while n - a > 0: + a += 1 + count += 1 + return count + +s = Solution() +print(s.solve(3)) # Output: 2 +print(s.solve(4)) # Output: 3 +print(s.solve(5)) # Output: 4 \ No newline at end of file diff --git a/CodeChallenge_8.py b/CodeChallenge_8.py new file mode 100644 index 0000000..bf51232 --- /dev/null +++ b/CodeChallenge_8.py @@ -0,0 +1,33 @@ +''' +Given an alphabetic string s, return a string where all vowels are removed and a . is inserted before each remaining letter, and make everything lowercase. + +Vowels are letters A, O, Y, E, U, I, and the rest are consonants. + +Example 1 +Input: +hello +Output: +.h.l.l + +Example 2 +Input: +Codefinity +Output: +.c.d.f.n.t + +''' +class Solution(object): + def solve(self, s:str) -> str: + print(f"s: {s}") + s_lower = s.lower() + vowels = ("aeiouy") + result = "" + for c in s_lower: + if c not in vowels: + result += '.' + c + return result + +s = Solution() +# Example usage +print(s.solve("HeLlo")) # Output: .h.l.l +print(s.solve("Codefinity")) # Output: .c.d.f.n.t \ No newline at end of file diff --git a/CodeChallenge_9.py b/CodeChallenge_9.py new file mode 100644 index 0000000..75ebbc9 --- /dev/null +++ b/CodeChallenge_9.py @@ -0,0 +1,21 @@ +''' +Given a string as a+b expression, where a and b are integers, return a sum of a and b as an integer. + +Example 1 +Input: +4+2 +Output: +6 +''' +class Solution(object): + def solve(self, expression:str) -> int: + print(f"expression: {expression}") + left, right = expression.split('+') + int_left = int(left) + int_right = int(right) + sum = int_left + int_right + return sum + +s = Solution() +print(s.solve("4+2")) # Output: 6 +print(s.solve("10+20")) # Output: 30 diff --git a/Code_Challenge_medium_1.py b/Code_Challenge_medium_1.py new file mode 100644 index 0000000..f85f110 --- /dev/null +++ b/Code_Challenge_medium_1.py @@ -0,0 +1,53 @@ +''' +We know that prime numbers are positive integers that have exactly two distinct positive divisors. Similarly, we define a positive integer t as a T-prime +if it has exactly three distinct positive divisors. + +Given an array of positive integers, return an array of True or False for each integer if it T-prime + +Example 1 +Input: +[4, 5, 6] +Output: +[True, False, False] +''' + +from typing import List + + +class Solution(object): + def solve(self, nums:List[int]) -> List[bool]: + """ + :type nums: List[int] + :rtype: List[bool] + """ + def is_t_prime(n): + if n < 4: + return False + root = int(n**0.5) + return root * root == n and self.is_prime(root) + + self.is_prime = self.sieve_of_eratosthenes(max(nums)) + return [is_t_prime(num) for num in nums] + + def sieve_of_eratosthenes(self, n): + """ + Returns a function that checks if a number is prime using the Sieve of Eratosthenes. + """ + is_prime = [True] * (n + 1) + is_prime[0] = is_prime[1] = False + + for i in range(2, int(n**0.5) + 1): + if is_prime[i]: + for j in range(i * i, n + 1, i): + is_prime[j] = False + + return lambda x: is_prime[x] if x <= n else False + +# Example usage: +if __name__ == "__main__": + solution = Solution() + print(solution.solve([4, 5, 6])) # Output: [True, False, False] + print(solution.solve([9, 25, 49])) # Output: [True, True, True] + print(solution.solve([1, 2, 3, 10])) # Output: [False, False, False, False] + + \ No newline at end of file diff --git a/Context_Managers.py b/Context_Managers.py new file mode 100644 index 0000000..d3b2832 --- /dev/null +++ b/Context_Managers.py @@ -0,0 +1,5 @@ +with open('notes.txt', 'w') as file: + file.write("This is a note.") + +print("File has been written and closed automatically.") + diff --git a/Hello_Python_World.py b/Hello_Python_World.py new file mode 100644 index 0000000..9ae3c15 --- /dev/null +++ b/Hello_Python_World.py @@ -0,0 +1 @@ +print("Hello Python World") diff --git a/Hello_Python_World_Alternative.py b/Hello_Python_World_Alternative.py new file mode 100644 index 0000000..d58d76a --- /dev/null +++ b/Hello_Python_World_Alternative.py @@ -0,0 +1,5 @@ +message = "Hello Python World" +print(message) + +message = "Hello Python Crash Course World. What's next for us in Python Programming?" +print(message) diff --git a/Lambda_funcs.py b/Lambda_funcs.py new file mode 100644 index 0000000..9e15722 --- /dev/null +++ b/Lambda_funcs.py @@ -0,0 +1,24 @@ +# Define a function that takes a function and a value as arguments +def apply_function(func, value): + return func(value) + +# Call the function with a lambda function as the first argument +result = apply_function(lambda x: x * x, 25) + +print(result) + +# Define a function that applies a given function to each element in a list +def apply_to_list(numbers, func): + """Applies the given function to each element in the numbers list.""" + return [func(x) for x in numbers] + +# List of numbers +numbers = [1, 2, 3, 4, 5] + +# Using a lambda function to add 10 to each number +result_add = apply_to_list(numbers, lambda x: x + 10) +print("Adding 10:", result_add) + +# Using a lambda function to multiply each number by 2 +result_multiply = apply_to_list(numbers, lambda x: x * 2) +print("Multiplying by 2:", result_multiply) \ No newline at end of file diff --git a/Lists_In_Functions.py b/Lists_In_Functions.py new file mode 100644 index 0000000..3d16122 --- /dev/null +++ b/Lists_In_Functions.py @@ -0,0 +1,14 @@ +def add_strawberry(original_list): + list_copy = original_list.copy() # Create a copy of the original list + list_copy.append("Strawberry") # Modify the copied list + return list_copy + +# Original list +fruits = ["Apple", "Banana", "Cherry"] + +# Call the function +new_fruits = add_strawberry(fruits) + +# Check the results +print("Original list:", fruits) # ['Apple', 'Banana', 'Cherry'] +print("Modified list:", new_fruits) # ['Apple', 'Banana', 'Cherry', 'Strawberry'] \ No newline at end of file diff --git a/Projects.code-workspace b/Projects.code-workspace new file mode 100644 index 0000000..aecd6d4 --- /dev/null +++ b/Projects.code-workspace @@ -0,0 +1,15 @@ +{ + "folders": [ + { + "path": "../../../home/datapioneer/Projects" + }, + { + "path": "." + } + ], + "settings": { + "files.exclude": { + "**/.git": false + } + } +} \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..e69de29 diff --git a/README_GITEA_PUSH.md b/README_GITEA_PUSH.md new file mode 100644 index 0000000..a24c0a6 --- /dev/null +++ b/README_GITEA_PUSH.md @@ -0,0 +1,90 @@ +# Quick Start: Push Local Repo to Gitea + +## 1. Create repo on Gitea +- Log in → **`+` → New Repository** +- Enter repo name → click **Create Repository** + +--- + +## 2. Initialize your local repo +```bash +cd ~/projects/myproject +git init +git add . +git commit -m "Initial commit" +``` + +--- + +## 3. Add the remote +Copy the HTTPS or SSH URL from Gitea: +```bash +git remote add origin https://gitcenter.dancalloway.com/dancalloway/Python_Projects.git +``` +(or SSH: `git@gitcenter.dancalloway.com:dancalloway/Python_Projects.git`) + +--- + +## 4. Push your branch +If your branch is `main`: +```bash +git push -u origin main +``` + +If your branch is `Main`: [Our branch is Main -uppercase M] +```bash +git push -u origin Main +``` + +--- + +## 5. Done +- `git push` → send changes up +- `git pull` → fetch changes down +- Repeat `add` + `commit` + `push` as you work + +--- + +⚠️ **Important**: +- Repos **must be created on Gitea first**. Pushing to a non-existent repo won’t work (push-to-create is disabled). +- Branch names are **case-sensitive** (`main` ≠ `Main`). + +--- + +# 🛠️ Troubleshooting Common Git Errors + +**1. Error: `fatal: remote origin already exists`** +👉 You already added a remote. Fix with: +```bash +git remote set-url origin https://gitcenter.dancalloway.com/dancalloway/Python_Projects.git +``` + +--- + +**2. Error: `non-fast-forward` (push rejected)** +👉 Your local branch is behind the remote. Update first: +```bash +git pull --rebase origin main +git push +``` + +--- + +**3. Error: `push to create not enabled`** +👉 You tried pushing to a repo that doesn’t exist. Create it on Gitea first, then retry. + +--- + +**4. Error: `authentication failed`** +👉 Check your username/password or SSH key. +- For HTTPS: use your **Gitea username + password (or token)**. +- For SSH: ensure your public key is added under **Profile → Settings → SSH / GPG Keys**. + +--- + +**5. Wrong branch pushed (e.g. `Main` vs `main`)** +👉 Branch names are case-sensitive. Rename if needed: +```bash +git branch -m Main main +git push -u origin main +``` diff --git a/RMD_Calculator.py b/RMD_Calculator.py new file mode 100644 index 0000000..7d0c2fc --- /dev/null +++ b/RMD_Calculator.py @@ -0,0 +1,34 @@ +def calculate_rmd(balance, age): + """ + Calculates the Required Minimum Distribution (RMD) + using the IRS Uniform Lifetime Table. + + Parameters: + - balance (float): IRA balance on Dec 31 of the prior year + - age (int): age as of the distribution year + + Returns: + - rmd (float): calculated RMD + """ + + # Life expectancy factors from the IRS Uniform Lifetime Table (selected ages) + uniform_lifetime_table = { + 73: 26.5, 74: 25.5, 75: 24.6, 76: 23.7, 77: 22.9, + 78: 22.0, 79: 21.1, 80: 20.2, 81: 19.4, 82: 18.5, + 83: 17.7, 84: 16.8, 85: 16.0 + # Add more ages if needed + } + + if age not in uniform_lifetime_table: + raise ValueError(f"No factor found for age {age}. Please check IRS table.") + + factor = uniform_lifetime_table[age] + rmd = balance / factor + return round(rmd, 2) + +# Example usage +ira_balance = 100000 # Replace with actual Dec 31 balance for the prior year +age = 73 # Replace with your age as of the distribution year + +rmd_amount = calculate_rmd(ira_balance, age) +print(f"Your RMD for age {age} is: ${rmd_amount}") \ No newline at end of file diff --git a/URLSuffixHash.py b/URLSuffixHash.py new file mode 100644 index 0000000..f00d8ef --- /dev/null +++ b/URLSuffixHash.py @@ -0,0 +1,106 @@ +''' +I need to shorten 10,000 URLs by taking the URL number and perform repeated divisions by 62, using the remainder to map to a character set. The character set +consists of lowercase letters, uppercase letters, and digits. The process continues until the number is reduced to zero. +# This will print shortened URLs for numbers 1 to 10,000 +# You can replace the range with any number to generate a specific shortened URL. +# Note: The function `shorten_url` can be called with any integer to get its shortened URL representation. + +# The above code will generate a unique shortened URL for each number from 1 to 10,000. +# The output will be a string of characters that can be used as a URL suffix. + +# The character set used is: +# - Lowercase letters: a-z +# - Uppercase letters: A-Z +# - Digits: 0-9 +# The total character set size is 62, allowing for a wide range of unique URL suffixes. +# The function `shorten_url` can be used to convert any integer into a unique URL suffix based on the specified character set. +# The function handles the conversion by repeatedly dividing the number by 62 and using the remainder to index into the character set. +# The output will be a string that can be appended to a base URL to create a shortened URL. +# The function is efficient and can handle large numbers, generating unique suffixes for each input number. +# The function can be used in various applications where URL shortening is required, such as in web applications, APIs, or any system that needs to generate short links. +# The function `shorten_url` can be used to generate unique URL suffixes for any integer input, making it versatile for various applications. +# The function can be easily integrated into a larger system where URL shortening is needed, providing a simple and effective way to create unique identifiers for resources. +# The function can be tested with various inputs to ensure it generates the expected shortened URLs. +# The function can be modified to handle edge cases or specific requirements as needed, such as handling negative numbers or zero. +# The function is designed to be straightforward and easy to understand, making it accessible for developers of all skill levels. +# The function can be optimized further if needed, but it is already efficient for the purpose of generating unique URL suffixes. +# The function can be used in conjunction with a database or other storage system to map shortened URLs back to their original forms, enabling full URL shortening functionality. +# The function can be extended to include additional features, such as tracking usage statistics or expiration dates for shortened URLs. +# The function can be used in a variety of contexts, such as social media platforms, content management systems, or any application that requires URL shortening. +# The function can be easily adapted to different character sets or base sizes if needed, providing flexibility for different use cases. +# The function can be used to generate unique identifiers for resources, making it suitable for applications that require unique keys or tokens. +# The function can be tested with a wide range of inputs to ensure robustness and reliability in generating unique URL suffixes. +# The function can be integrated into a web service or API to provide URL shortening capabilities for users or applications. +# The function can be used to create a simple URL shortening service, allowing users to generate short links for long URLs. +# The function can be used in conjunction with a web framework to create a complete URL shortening application, providing both the shortening and redirection functionalities. +# The function can be used to generate unique URL suffixes for any integer input, making it versatile for various applications. +# The function can be used to create a simple URL shortening service, allowing users to generate short links for long URLs. +# The function can be used in conjunction with a web framework to create a complete URL shortening application, providing both the shortening and redirection functionalities. +# The function can be used to generate unique identifiers for resources, making it suitable for applications that require unique keys or tokens. +# The function can be extended to include additional features, such as tracking usage statistics or expiration dates +# for shortened URLs. +# The function can be used in a variety of contexts, such as social media platforms, content management systems, or any application that requires URL shortening. +# The function can be easily adapted to different character sets or base sizes if needed, providing flexibility for different use cases. +# The function can be used to generate unique URL suffixes for any integer input, making it versatile for various applications. +# The function can be tested with a wide range of inputs to ensure robustness and reliability in generating unique URL suffixes. +# The function can be integrated into a web service or API to provide URL shortening capabilities for users or applications. +# The function can be used to create a simple URL shortening service, allowing users to generate short +# links for long URLs. +# The function can be used in conjunction with a web framework to create a complete URL shortening application, providing both the shortening and redirection functionalities. +# The function can be used to generate unique identifiers for resources, making it suitable for applications that require unique keys or tokens. + +# The function can be extended to include additional features, such as tracking usage statistics or expiration dates for shortened URLs. +# The function can be used in a variety of contexts, such as social media platforms, content +# management systems, or any application that requires URL shortening. +# The function can be easily adapted to different character sets or base sizes if needed, providing flexibility for different use cases. +# The function can be used to generate unique URL suffixes for any integer input, making it versatile for various applications. +# The function can be tested with a wide range of inputs to ensure robustness and reliability in generating + +# unique URL suffixes. +# The function can be integrated into a web service or API to provide URL shortening capabilities for users or applications. +# The function can be used to create a simple URL shortening service, allowing users to generate short links for long URLs. +# The function can be used in conjunction with a web framework to create a complete URL shortening application +# providing both the shortening and redirection functionalities. +# The function can be used to generate unique identifiers for resources, making it suitable for applications that require unique keys or tokens. +# The function can be extended to include additional features, such as tracking usage statistics or expiration dates +# for shortened URLs. +# The function can be used in a variety of contexts, such as social media platforms, content management systems, or any application that requires URL shortening. +# The function can be easily adapted to different character sets or base sizes if needed, providing flexibility +# for different use cases. +# The function can be used to generate unique URL suffixes for any integer input, making it +# versatile for various applications. + +# The function can be tested with a wide range of inputs to ensure robustness and reliability in generating unique URL suffixes. +# The function can be integrated into a web service or API to provide URL shortening capabilities for users or applications. +# The function can be used to create a simple URL shortening service, allowing users to generate short links for long URLs. +# The function can be used in conjunction with a web framework to create a complete URL shortening application, providing both the shortening and redirection functionalities. +# The function can be used to generate unique identifiers for resources, making it suitable for applications that require unique keys or tokens. +# The function can be extended to include additional features, such as tracking usage statistics or expiration dates for shortened URLs. + +''' + +import string + +class URLSuffixHash: + @staticmethod + + def shorten_url(url_number): + characters = string.ascii_lowercase + string.ascii_uppercase + string.digits + base = len(characters) + short_url = [] + + while url_number > 0: + url_number -= 1 + remainder = url_number % base + short_url.append(characters[remainder]) + url_number //= base + + return 'mydomain.com/' + ''.join(reversed(short_url)) + + +s = URLSuffixHash() +# Example usage +for i in range(1500000, 2050001): + print(s.shorten_url(i)) + # This will print shortened URLs for numbers 150000 to 205000 + diff --git a/activations.py b/activations.py new file mode 100644 index 0000000..a4af1f5 --- /dev/null +++ b/activations.py @@ -0,0 +1,22 @@ +import numpy as np + + +class ReLU: + def __call__(self, x): + return np.maximum(0, x) + + def derivative(self, x): + return (x > 0).astype(float) + + +class Sigmoid: + def __call__(self, x): + return 1 / (1 + np.exp(-x)) + + def derivative(self, x): + sig = self.__call__(x) + return sig * (1 - sig) + + +relu = ReLU() +sigmoid = Sigmoid() diff --git a/alien.py b/alien.py new file mode 100644 index 0000000..af6f4d6 --- /dev/null +++ b/alien.py @@ -0,0 +1,7 @@ +alien_0 = {'color': 'green', 'points': 5 } +#print(f" The color of the alien is: {alien_0 ['color']}") +#print(f" The number of points on the alien is: {alien_0 ['points']}") +print(alien_0) +alien_0['x-position'] = 0 +alien_0['y-position'] = 25 +print(alien_0) \ No newline at end of file diff --git a/alien1.py b/alien1.py new file mode 100644 index 0000000..0be56db --- /dev/null +++ b/alien1.py @@ -0,0 +1,4 @@ +alien_1 = {} +alien_1['color'] = 'green' +alien_1['points'] = 5 +print(alien_1) diff --git a/alien2.py b/alien2.py new file mode 100644 index 0000000..e5de19b --- /dev/null +++ b/alien2.py @@ -0,0 +1,4 @@ +alien_2 = {'color': 'green'} +print(f"The alien is {alien_2['color']}") +alien_2 = {'color': 'yellow'} +print(f"The alien is now {alien_2['color']}") diff --git a/alien3.py b/alien3.py new file mode 100644 index 0000000..7735739 --- /dev/null +++ b/alien3.py @@ -0,0 +1,14 @@ +alien_3 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'} +print(f"Original position {alien_3['x_position']}") +# Determine how far to move the alien based on its current speed +if alien_3['speed'] == 'slow': + x_increment = 1 +elif alien_3['speed'] == 'medium': + x_increment = 2 +else: + # This must be a fast alien + x_increment = 3 +# The new position is the old position plus the increment +alien_3['x_position'] = alien_3['x_position'] + x_increment +print(f"New position: {alien_3['x_position']}") + diff --git a/alien4.py b/alien4.py new file mode 100644 index 0000000..e06b3c7 --- /dev/null +++ b/alien4.py @@ -0,0 +1,6 @@ +alien_4 = {'color': 'green', 'points': 5} +print(alien_4) +# Delete the second key:value pair from alien_4 +del(alien_4['points']) +print(alien_4) + diff --git a/alien5.py b/alien5.py new file mode 100644 index 0000000..af6f4d6 --- /dev/null +++ b/alien5.py @@ -0,0 +1,7 @@ +alien_0 = {'color': 'green', 'points': 5 } +#print(f" The color of the alien is: {alien_0 ['color']}") +#print(f" The number of points on the alien is: {alien_0 ['points']}") +print(alien_0) +alien_0['x-position'] = 0 +alien_0['y-position'] = 25 +print(alien_0) \ No newline at end of file diff --git a/alien5a.py b/alien5a.py new file mode 100644 index 0000000..6a7ed73 --- /dev/null +++ b/alien5a.py @@ -0,0 +1,3 @@ +alien_5 = {'color': 'green', 'speed': 'slow'} +point_value = alien_5.get('points', 'No point value assigned.') +print(point_value) diff --git a/alien5get_method.py b/alien5get_method.py new file mode 100644 index 0000000..6a7ed73 --- /dev/null +++ b/alien5get_method.py @@ -0,0 +1,3 @@ +alien_5 = {'color': 'green', 'speed': 'slow'} +point_value = alien_5.get('points', 'No point value assigned.') +print(point_value) diff --git a/aliens.py b/aliens.py new file mode 100644 index 0000000..6847036 --- /dev/null +++ b/aliens.py @@ -0,0 +1,7 @@ +alien_0 = {'color': 'green', 'points': 5} +alien_1 = {'color': 'yellow', 'points': 10} +alien_2 = {'color': 'red', 'points': 15} +aliens = [alien_0, alien_1, alien_2] +for alien in aliens: + print(alien) + \ No newline at end of file diff --git a/amusement_park.py b/amusement_park.py new file mode 100644 index 0000000..e37c76c --- /dev/null +++ b/amusement_park.py @@ -0,0 +1,9 @@ +age = 12 +if age < 4: + print('Your admission price is $0.') +elif age < 18: + print('Your admission price is $25.') +else: + print('Your admission price is $40.') + + diff --git a/amusement_park_alternate.py b/amusement_park_alternate.py new file mode 100644 index 0000000..1f17976 --- /dev/null +++ b/amusement_park_alternate.py @@ -0,0 +1,11 @@ +age = 12 +if age < 4: + price = 0 +elif age < 18: + price = 25 +else: + price = 40 +print(f"Your admission price is ${price}") + + + diff --git a/animal_talk.py b/animal_talk.py new file mode 100644 index 0000000..3804e83 --- /dev/null +++ b/animal_talk.py @@ -0,0 +1,75 @@ + + +""" + This module defines an abstract base class `Animal` and its subclasses `Dog` and `Cat`, + demonstrating object-oriented principles such as inheritance, abstraction, and polymorphism. + Classes: + Animal: + Abstract base class representing a generic animal. + Methods: + speak(): Abstract method to be implemented by subclasses for animal sound. + move(): Abstract method to be implemented by subclasses for animal movement. + Dog(Animal): + Represents a dog with breed, name, and age attributes. + Methods: + speak(): Returns the sound a dog makes ("Woof!"). + move(): Returns a description of how a dog moves ("runs energetically"). + Cat(Animal): + Represents a cat with breed, name, age, and color attributes. + Methods: + speak(): Returns the sound a cat makes ("Meow!"). + move(): Returns a description of how a cat moves ("walks gracefully"). + Usage: + Demonstrates polymorphism by creating instances of Dog and Cat and invoking their + respective speak and move methods. + """ + +class Animal: # Abstract Base Class (Not to be instantiated directly) + def __init__(self): + pass + + def speak(self): + raise NotImplementedError("Subclasses must implement this method") + + def move(self): + raise NotImplementedError("Subclasses must implement this method") + +class Dog(Animal): # Subclass of Animal with 3 attributes + def __init__(self, breed, name, age): + super().__init__() + self.breed = breed + self.name = name + self.age = age + + def speak(self): # Implementation of abstract method + return "Woof!" + + def move(self): # Implementation of abstract method + return "runs energetically" + +class Cat(Animal): # Subclass of Animal with 4 attributes + def __init__(self, breed, name, age, color): + super().__init__() + self.breed = breed + self.name = name + self.age = age + self.color = color + + def speak(self): # Implementation of abstract method + return "Meow!" + + def move(self): # Implementation of abstract method + return "walks gracefully" + + +# Creating instances of Dog and Cat +my_dog = Dog("Collie","Buddy", 9) +my_cat = Cat("Simese","Whiskers", 3, "White") +my_other_dog = Dog("Snouser","Max", 5) + +# Demonstrating polymorphism +print(f"My {my_dog.breed} dog, {my_dog.name}, age {my_dog.age} says {my_dog.speak()} and {my_dog.move()}") +print(f"My {my_cat.color} {my_cat.breed} cat, {my_cat.name}, age {my_cat.age} says {my_cat.speak()} and {my_cat.move()}") +print(f"My {my_other_dog.breed} dog, {my_other_dog.name}, age {my_other_dog.age} says {my_other_dog.speak()} and {my_other_dog.move()}") + + \ No newline at end of file diff --git a/apostrophe.py b/apostrophe.py new file mode 100644 index 0000000..fb25c22 --- /dev/null +++ b/apostrophe.py @@ -0,0 +1,2 @@ +message = "One of python's strengths is its diverse community." +print(message) diff --git a/areaOfTriangle.py b/areaOfTriangle.py new file mode 100644 index 0000000..2a02592 --- /dev/null +++ b/areaOfTriangle.py @@ -0,0 +1,16 @@ +# Python Program to find the area of triangle + +A = 5 +B = 6 +C = 7 + +"""Uncomment below to take inputs from the user""" +# A = float(input('Enter first side: ')) +# B = float(input('Enter second side: ')) +# C = float(input('Enter third side: ')) + +"""calculate the semi-perimeter""" +S = (A + B + C) / 2 +"""Calculating the area""" +AREA = (S*(S-A)*(S-B)*(S-C)) ** 0.5 +print('The area of the triangle is %0.2f' %AREA) \ No newline at end of file diff --git a/args_and_kargs_in_func.py b/args_and_kargs_in_func.py new file mode 100644 index 0000000..7378256 --- /dev/null +++ b/args_and_kargs_in_func.py @@ -0,0 +1,19 @@ +def new_func(a, b=0, *args, **kwargs): + print(f"a = {a}, b = {b}, args = {args}, kwargs = {kwargs}") + +""" + A function that demonstrates the use of positional, default, variable positional (*args), and variable keyword (**kwargs) arguments. + Parameters: + a (Any): The first positional argument. + b (Any, optional): The second argument with a default value of 0. + *args: Additional positional arguments. + **kwargs: Additional keyword arguments. + Prints: + The values of 'a', 'b', 'args', and 'kwargs' in a formatted string. + Returns: + None + +""" +# Example usage of the new_func function +new_func(1, 2, "Love", "Hope", name="Anna", age=20) + diff --git a/args_and_optionals.py b/args_and_optionals.py new file mode 100644 index 0000000..ec2684e --- /dev/null +++ b/args_and_optionals.py @@ -0,0 +1,33 @@ +def add(a=0, b=0, *args): + total = a + b + for num in args: + total += num + return total + +""" + Adds two or more numbers together. + + Parameters: + a (int or float, optional): The first number to add. Defaults to 0. + b (int or float, optional): The second number to add. Defaults to 0. + *args (int or float): Additional numbers to add. + + Returns: + int or float: The sum of all provided numbers. + """ + +print(add(1, 2)) # Output: 3 +print(add(1, 2, 3, 4)) # Output: 10 +print(add(1)) # Output: 1 +print(add(1, 2, 3, 4, 5, 6)) # Output: 21 +print(add()) # Output: 0 + +# Function to calculate the average mark of a student +# It takes the student's name and a variable number of marks as arguments. +def average_mark(name, *args): + mark = round(sum(args)/len(args), 2) # average value rounded to the 2 num after the dot + print(f"{name} got {mark}") + +average_mark("Tom", 4.0, 3.5, 3.0, 3.3, 3.8) +average_mark("Dick", 2.5, 3.8) +average_mark("Harry", 4.0, 4.5, 3.8, 4.2, 4.0, 3.9) \ No newline at end of file diff --git a/array_boolean_indexing.py b/array_boolean_indexing.py new file mode 100644 index 0000000..fb32966 --- /dev/null +++ b/array_boolean_indexing.py @@ -0,0 +1,10 @@ +import numpy as np +# Creating an array of integers from 1 to 10 inclusive +array = np.arange(1, 11) +# Creating a boolean array based on a condition +boolean_array = array > 5 +print(boolean_array) + +# Creating an array of integers from 1 to 10 inclusive +array = np.arange(1, 11) +print(array[array > 5]) \ No newline at end of file diff --git a/array_comparisons.py b/array_comparisons.py new file mode 100644 index 0000000..d9cc0e4 --- /dev/null +++ b/array_comparisons.py @@ -0,0 +1,18 @@ +import numpy as np +# Creating an array of integers from 1 to 10 inclusive +array = np.arange(1, 11) +# Retrieving elements greater than or equal to 5 AND less than 9 +print(array[(array >= 5) & (array < 9)]) +# Retrieving elements less than or equal to 4 AND not equal to 2 +print(array[(array != 2) & (array <= 4)]) +# Retrieving elements less than 3 OR equal to 8 +print(array[(array < 3) | (array == 8)]) +# Retrieving elements between 2 inclusive AND 5 inclusive OR equal to 9 +print(array[(array >= 2) & (array <= 5) | (array == 9)]) + +''' +If both conditions are true, | returns True, otherwise returns False. +If either condition is true, & returns True, otherwise returns False. +The & operator is used for element-wise logical AND, while | is used for element-wise logical OR. +The parentheses around conditions are necessary to ensure correct precedence of operations. +''' \ No newline at end of file diff --git a/array_copying.py b/array_copying.py new file mode 100644 index 0000000..e61a325 --- /dev/null +++ b/array_copying.py @@ -0,0 +1,18 @@ +import numpy as np +""" +This script demonstrates how to copy and modify NumPy arrays for simulated sales data. + +- Imports NumPy for array manipulation. +- Defines `sales_data_2021` as a 2D NumPy array representing quarterly sales for two products in 2021. +- Creates a deep copy of `sales_data_2021` named `sales_data_2022` to simulate sales for the next year. +- Updates the last two quarters' sales for the first product in `sales_data_2022` with new values (390 and 370). +- Prints both the original and modified sales data arrays for comparison. +""" +# Simulated quarterly sales data for two products in 2021 +sales_data_2021 = np.array([[350, 420, 380, 410], [270, 320, 290, 310]]) +# Create a copy of sales_data_2021 +sales_data_2022 = np.copy(sales_data_2021) +# Assign the NumPy array with elements 390 and 370 to the correct slice +sales_data_2022[0, -2:] = np.array([390, 370]) +print(f'Quarterly sales in 2021:\n{sales_data_2021}') +print(f'Quarterly sales in 2022:\n{sales_data_2022}') \ No newline at end of file diff --git a/array_creation_functions.py b/array_creation_functions.py new file mode 100644 index 0000000..9f0b4ed --- /dev/null +++ b/array_creation_functions.py @@ -0,0 +1,25 @@ +import numpy as np +# Сreating a 1D array of zeros with 5 elements +zeros_1d = np.zeros(5) +print(zeros_1d) +# Сreating a 1D array of zeros with specifying dtype +zeros_1d_int = np.zeros(5, dtype=np.int8) +print(zeros_1d_int) +# Сreating a 2D array of zeros of shape 5x3 +zeros_2d = np.zeros((5, 3)) +print(zeros_2d) + +# Create an array of zeros of size 5 +zeros_array_1d = np.zeros(5) +# Create an array of zeros of shape 2x4 +zeros_array_2d = np.zeros((2, 4)) +# Create an array of ones of size 3 +ones_array_1d = np.ones(3) +# create an array of ones of shape 2x3 +ones_array_2d = np.ones((2, 3)) +# Create an array of sevens of shape 2x2 +sevens_array_2d = np.full((2, 2), 7) +print(f'1D zeros array: {zeros_array_1d}, 1D ones array: {ones_array_1d}') +print(f'2D zeros array:\n{zeros_array_2d}') +print(f'2D ones array:\n{ones_array_2d}') +print(f'2D sevens array:\n{sevens_array_2d}') \ No newline at end of file diff --git a/array_indexing.py b/array_indexing.py new file mode 100644 index 0000000..5fbb0ea --- /dev/null +++ b/array_indexing.py @@ -0,0 +1,25 @@ +import numpy as np +array = np.array([9, 6, 4, 8, 10]) +# Accessing the first element (positive index) +print(f'The first element (positive index): {array[0]}') +# Accessing the first element (negative index) +print(f'The first element (negative index): {array[-5]}') +# Accessing the last element (positive index) +print(f'The last element (positive index): {array[4]}') +# Accessing the last element (negative index) +print(f'The last element (negative index): {array[-1]}') +# Accessing the third element (positive index) +print(f'The third element (positive index): {array[2]}') +# Accessing the third element (negative index) +print(f'The third element (negative index): {array[-3]}') + + +array = np.array([9, 6, 4, 8, 10]) +# Finding the average between the first and the last element +print((array[0] + array[-1]) / 2) + + +arr = np.array([8, 18, 9, 16, 7, 1, 3]) +# Calculate an average of the first, fourth and last elements +average = (arr[0] + arr[3] + arr[-1]) / 3 +print(average) \ No newline at end of file diff --git a/array_manipulation.py b/array_manipulation.py new file mode 100644 index 0000000..3e61678 --- /dev/null +++ b/array_manipulation.py @@ -0,0 +1,18 @@ +import numpy as np +""" +This script demonstrates basic NumPy array manipulation: +- Updates product prices by assigning a value of 20 to all prices greater than 10. +- Modifies product ratings for two categories over three criteria by setting the last two criteria of the first category to 9. +- Prints the updated prices and ratings arrays. +""" +# Product prices +prices = np.array([15, 8, 22, 7, 12, 5]) +# Assign 20 to every price greater than 10 +prices[prices > 10] = 20 + +# Product ratings for two categories over three criteria +ratings = np.array([[6, 8, 9], [7, 5, 10]]) + +ratings[0, 1:] = np.array([9, 9]) +print(prices) +print(ratings) \ No newline at end of file diff --git a/array_scalar_operations.py b/array_scalar_operations.py new file mode 100644 index 0000000..d5d1fcc --- /dev/null +++ b/array_scalar_operations.py @@ -0,0 +1,62 @@ +import numpy as np +""" +Demonstrates array and scalar operations using NumPy, including: +- Creating 1D and 2D arrays. +- Performing scalar addition and multiplication on arrays. +- Element-wise addition, multiplication, and exponentiation between arrays of the same shape. +- Broadcasting for element-wise operations between arrays of different shapes. +- Simulating quarterly sales revenue data for two products over two years. +- Calculating and rounding quarterly revenue growth percentages for each product. +Prints intermediate and final results for illustration. +""" + +array = np.array([1, 2, 3, 4]) +print(f'Array 1D: {array}') +# Creating a 2D array with 1 row +array_2d = np.array([[1, 2, 3, 4]]) + +# Scalar addition +result_add_scalar = array + 2 # Adding 2 to each element +print(f'\nScalar addition: {result_add_scalar}') +# Scalar multiplication +result_mul_scalar = array * 3 # Multiplying each element by 3 + +arr1 = np.array([1, 2, 3, 4]) +arr2 = np.array([5, 6, 7, 8]) +print(f'\nArray 1: {arr1}') +print(f'Array 2: {arr2}') +# Element-wise addition +result_add = arr1 + arr2 # Adding corresponding elements +print(f'\nElement-wise addition: {result_add}') +# Element-wise multiplication +result_mul = arr1 * arr2 # Multiplying corresponding elements +print(f'Element-wise multiplication: {result_mul}') +# Element-wise exponentiation (raising to power) +result_power = arr1 ** arr2 # Raising each element of arr1 to the power of corresponding element in arr2 +print(f'Element-wise exponentiation: {result_power}') + + +arr1 = np.array([[1, 2, 3], [4, 5, 6]]) +arr2 = np.array([5, 6, 7]) +print(f'\nArray 1:\n{arr1}') +print(f'Array 2:\n{arr2}') +# Element-wise addition +result_add = arr1 + arr2 # Broadcasting arr2 to match the shape of arr1 +print(f'\nElement-wise addition: {result_add}') +# Element-wise multiplication +result_mul = arr1 * arr2 # Broadcasting arr2 to match the shape of arr1 +print(f'Element-wise multiplication: {result_mul}') +# Element-wise exponentiation (raising to power) +result_power = arr1 ** arr2 # Broadcasting arr2 to match the shape of arr1 +print(f'Element-wise exponentiation:\n{result_power}') + +#Task: +# Simulated quarterly sales revenue data for two products in 2021 and 2022 +sales_data_2021 = np.array([[350, 420, 380, 410], [270, 320, 290, 310]]) +sales_data_2022 = np.array([[360, 440, 390, 430], [280, 330, 300, 320]]) +# Calculate the quarterly revenue growth for each product in percents +revenue_growth = (sales_data_2022 - sales_data_2021) / sales_data_2021 * 100 +# Rounding each of the elements to 2 decimal places +revenue_growth = np.round(revenue_growth, 2) +print(f'\nRevenue growth by quarter for each product:\n{revenue_growth}') + diff --git a/array_statistical_operations.py b/array_statistical_operations.py new file mode 100644 index 0000000..3e7eff1 --- /dev/null +++ b/array_statistical_operations.py @@ -0,0 +1,72 @@ +import numpy as np +""" +This script demonstrates various statistical operations on NumPy arrays, including mean, median, variance, and standard deviation calculations for both 1D and 2D arrays. +Features: +- Calculates mean and median for samples with odd and even numbers of elements. +- Sorts arrays for display purposes. +- Computes sample variance (using Bessel's correction) and standard deviation. +- Performs mean calculations on 2D arrays, both flattened and along specific axes. +- Simulates exam scores for two students and computes per-student mean, overall median, variance, and standard deviation. +Dependencies: +- numpy +Usage: +Run the script to see printed outputs of statistical calculations for various sample arrays and a simulated exam scores dataset. +""" + +sample = np.array([10, 25, 15, 30, 20, 10, 2]) +print(f'Original sample: {sample}, Odd # of elements:') +# Calculating the mean +sample_mean = np.mean(sample) +print(f'Sorted sample: {np.sort(sample)}') +# Calculating the median +sample_median = np.median(sample) +print(f'Mean: {sample_mean}, median: {sample_median}') + + +sample = np.array([1, 2, 8, 10, 15, 20, 25, 30]) +print(f'\nOriginal sample: {sample}, Even # of elements:') +sample_mean = np.mean(sample) +sample_median = np.median(sample) +# Sorting the sample +print(f'Sorted sample: {np.sort(sample)}') +print(f'Mean: {sample_mean}, median: {sample_median}') + + +sample = np.array([10, 25, 15, 30, 20, 10, 2]) +print(f'\nOriginal sample: {sample}, Odd # of elements:') +# Calculating the variance +sample_variance = np.var(sample, ddof=1) +# Calculating the standard deviation +sample_std = np.std(sample) +print(f'Variance: {sample_variance}, Standard Deviation: {sample_std}') + +#Higher dimensional array calculations +array_2d = np.array([[1, 2, 3], [4, 5, 6]]) +print(f'\n2D Array:\n{array_2d}') +# Calculating the mean in a flattened array +print(f'Mean (flattened): {np.mean(array_2d)}') +# Calculating the mean along axis 0 +print(f'Mean (axis 0): {np.mean(array_2d, axis=0)}') +# Calculating the mean along axis 1 +print(f'Mean (axis 1): {np.mean(array_2d, axis=1)}') + +# Task: Simulated test scores of 2 students for five different exams +exam_scores = np.array([[85, 90, 78, 92, 88], [72, 89, 65, 78, 92]]) +print(f'\nExam Scores:\n{exam_scores}') + +# Calculate the mean score for each student +mean_scores = np.mean(exam_scores, axis=1) +print(f'Mean score for each student: {mean_scores}') +# Calculate the median score of all scores +median_score = np.median(exam_scores) +print(f'Median score of all exams: {median_score}') + +# Calculate the median score of all scores +median_score = np.median(exam_scores) +print(f'Median score for all scores: {median_score}') +# Calculate the variance of all scores +scores_variance = np.var(exam_scores) +print(f'Variance for all scores: {scores_variance}') +# Calculate the standard deviation of all scores +scores_std = np.std(exam_scores) +print(f'Standard deviation for all scores: {scores_std}') \ No newline at end of file diff --git a/assigning_values_to_indexed_elements.py b/assigning_values_to_indexed_elements.py new file mode 100644 index 0000000..e1007b6 --- /dev/null +++ b/assigning_values_to_indexed_elements.py @@ -0,0 +1,44 @@ +import numpy as np + +array_1d = np.array([1, 4, 6, 2]) +# Assigning 10 to the first element of array_1d +array_1d[0] = 10 +print(array_1d) +array_2d = np.array([[1, 2, 3], [4, 5, 6]]) + + +# Assigning 8 to the element in the second row and column of array_2d +array_2d[1, 1] = 8 +print(array_2d) + +# Assigning a float value to an integer indexed element in a 1D array +array_1d = np.array([1, 4, 6, 2]) +# Assigning 10.2 to the first element of array_1d +array_1d[0] = 10.2 +print(array_1d) + +# assigning values to indexed subarrays +array_2d = np.array([[1, 2, 3], [4, 5, 6]]) +# Assigning a subarray to the first row of array_2d +array_2d[0] = np.array([7, 8, 9]) +print(array_2d) + +# more examples of assigning values to indexed subarrays +array_1d_1 = np.array([1, 4, 6, 2, 9]) +# Assigning an array to the slice of array_1d +array_1d_1[1:-1] = np.array([3, 5, 7]) +print(array_1d_1) +# Assigning a scalar to the slice of array_1d +array_1d_1[1:-1] = 5 +print(array_1d_1) +array_2d_1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) +# Assigning a 2D array to the slice of array_2d +array_2d_1[1:3, 1:] = np.array([[20, 21], [40, 41]]) +print(array_2d_1) +# Assigning a 1D array to the slice of array_2d +array_2d_1[1:3, 1:] = [50, 51] +print(array_2d_1) +# Assigning a scalar to the slice of array_2d +array_2d_1[1:3, 1:] = 30 +print(array_2d_1) + diff --git a/banned_users.py b/banned_users.py new file mode 100644 index 0000000..b236498 --- /dev/null +++ b/banned_users.py @@ -0,0 +1,5 @@ +banned_users = ['carolina', 'andrew', 'david'] +user = 'marie' +if user not in banned_users: + print(f"{user.title()}, you can post a response if you wish.") + diff --git a/bicycles.py b/bicycles.py new file mode 100644 index 0000000..edd61b9 --- /dev/null +++ b/bicycles.py @@ -0,0 +1,10 @@ +bicycles = ['trek', 'cannondale', 'redline', 'specialized'] +#print(bicycles) +#print(bicycles[0]) +#print(bicycles[0].title()) +#print(bicycles[-1].title()) +print(f"My first bicycle was a {bicycles[0].title()}") + + + + diff --git a/broadcasting_arrays.py b/broadcasting_arrays.py new file mode 100644 index 0000000..2aad302 --- /dev/null +++ b/broadcasting_arrays.py @@ -0,0 +1,34 @@ +import numpy as np +""" +Demonstrates NumPy broadcasting rules with arrays of different shapes. +Examples included: +- Adding a (2, 3) array to a (1, 3) array using broadcasting. +- Adding a (2, 3) array to a (3,) array using broadcasting. +- Adding a scalar to a (2, 3) array using broadcasting. +Prints the shapes of the arrays and the results of the element-wise additions. +""" +array_1 = np.array([[1, 2, 3], [4, 5, 6]]) +print(array_1.shape) +# Creating a 2D array with 1 row +array_2 = np.array([[11, 12, 13]]) +print(array_2.shape) +# Broadcasting and element-wise addition +result = array_1 + array_2 +print(result) + + +array_1 = np.array([[1, 2, 3], [4, 5, 6]]) +print(array_1.shape) +# Creating a 1D array +array_2 = np.array([11, 12, 13]) +print(array_2.shape) +# Broadcasting and element-wise addition +result = array_1 + array_2 +print(result) + + +array = np.array([[1, 2, 3], [4, 5, 6]]) +print(array.shape) +# Broadcasting and element-wise addition +result = array + 10 +print(result) diff --git a/cars.py b/cars.py new file mode 100644 index 0000000..c0c4534 --- /dev/null +++ b/cars.py @@ -0,0 +1,25 @@ +# sorting a list alphabetically; original list is permanently changed + +#cars = ['bmw', 'audi', 'toyota', 'subaru'] +#print(cars) +#cars.sort() +#print(cars) +#print("\n") + +# sorting a list in reverse-alphabetical order; original list is permanently +# changed + +#cars = ['bmw', 'audi', 'toyota', 'subaru'] +#print(cars) +#cars.sort(reverse=True) +#print(cars) + +# sorting a list but maintaining the original list + +cars = ['bmw', 'audi', 'toyota', 'subaru'] +print("Here is the original list:") +print(cars) +print("\n Here is the sorted list:") +print(sorted(cars)) +print("\n Here is the original list again:") +print(cars) diff --git a/cars2.py b/cars2.py new file mode 100644 index 0000000..fb9730e --- /dev/null +++ b/cars2.py @@ -0,0 +1,7 @@ +cars = ['audi', 'bmw', 'suburu', 'toyota'] +for car in cars: + if car == 'bmw': + print(car.upper()) + else: + print(car.title()) + diff --git a/class_Pet.py b/class_Pet.py new file mode 100644 index 0000000..26b57ea --- /dev/null +++ b/class_Pet.py @@ -0,0 +1,25 @@ +class Pet: + def __init__(self, name, species): + self.name = name + self.species = species + + def __str__(self): + return f"{self.name} is a {self.species}." + + def make_sound(self, sound): + return f"{self.name} says {sound}." + + def get_info(self): + return f"Name: {self.name}, Species: {self.species}" + +# Example usage: +if __name__ == "__main__": + my_pet = Pet("Buddy", "dog") + print(my_pet) # Output: Buddy is a dog. + print(my_pet.make_sound("Woof")) # Output: Buddy says Woof' + print(my_pet.get_info()) # Output: Name: Buddy, Species: dog + + my_other_pet = Pet("Max", "cat") + print(my_other_pet) # Output: Max is a cat. + print(my_other_pet.make_sound("Meow")) # Output: Max says Meow' + print(my_other_pet.get_info()) # Output: Name: Max, Species: cat diff --git a/class_inheritance.py b/class_inheritance.py new file mode 100644 index 0000000..bac727a --- /dev/null +++ b/class_inheritance.py @@ -0,0 +1,25 @@ +class MyClass: + def __init__(self, value): + self.value = value + + def display_value(self): + print(f"Value: {self.value}") + +my_class_instance = MyClass(10) +my_class_instance.display_value() + + +class MySubClass(MyClass): + def __init__(self, value, extra): + super().__init__(value) + self.extra = extra + + def display_extra(self): + print(f"Extra: {self.extra}") + +my_subclass_instance = MySubClass(20, "Hello") +my_subclass_instance.display_value() +my_subclass_instance.display_extra() + + + \ No newline at end of file diff --git a/class_user_def_context_mgr.py b/class_user_def_context_mgr.py new file mode 100644 index 0000000..8428d63 --- /dev/null +++ b/class_user_def_context_mgr.py @@ -0,0 +1,22 @@ +class ManagedFile: # A user-defined context manager for text files + def __init__(self, filename): + self.filename = filename + self.file = None + + def __enter__(self): + self.file = open(self.filename, 'w') + print('File opened and written') + return self.file + + def __exit__(self, exc_type, exc_value, traceback): + if self.file: + self.file.close() + print('Exception:', exc_type, exc_value, traceback) + +with ManagedFile('managed_file.txt') as file: # Using the user-defined context manager + note = input("Write some text and Press Enter to continue...\n ") + file.write(note) + +print("Managed file has been written and closed automatically.") + +# The file is automatically closed after the with block, even if an exception occurs. \ No newline at end of file diff --git a/classes_fundamentals.py b/classes_fundamentals.py new file mode 100644 index 0000000..8d1e089 --- /dev/null +++ b/classes_fundamentals.py @@ -0,0 +1,63 @@ +class Car(): + def __init__(self, make: str, model: str, year: int) -> None: + self.make = make + self.model = model + self.year = year + + def __str__(self) -> str: + return f"{self.year} {self.make} {self.model}" + + def __repr__(self) -> str: + return f"Car(make={self.make}, model={self.model}, year={self.year})" + + def __eq__(self, value): + if not isinstance(value, Car): + return NotImplemented + return (self.make, self.model, self.year) == (value.make, value.model, value.year) + +Honda: Car = Car("Honda", "Civic", 2020) +Toyota: Car = Car("Toyota", "Corolla", 2021) + +# Instance creation and string representation +class ElectricCar(Car): + def __init__(self, make: str, model: str, year: int, battery_size: int) -> None: + super().__init__(make, model, year) + self.battery_size = battery_size + + def __str__(self) -> str: + return f"{self.year} {self.make} {self.model} with a {self.battery_size}-kWh battery" + + def __repr__(self) -> str: + return f"ElectricCar(make={self.make}, model={self.model}, year={self.year}, battery_size={self.battery_size})" + + def __eq__(self, value): + if not isinstance(value, ElectricCar): + return NotImplemented + return (self.make, self.model, self.year, self.battery_size) == (value.make, value.model, value.year, value.battery_size) + +# use the classes +Tesla: ElectricCar = ElectricCar("Tesla", "Model 3", 2022, 75) +myHybridCar: ElectricCar = ElectricCar("Nissan", "Leaf", 2021, 40) +print(myHybridCar == Tesla) # Output: False +print(repr(Tesla)) # Output: ElectricCar(make=Tesla, model=Model 3, year=2022, battery_size=75) +print(str(Tesla)) # Output: 2022 Tesla Model 3 with a 75-kWh battery +print(Honda == Tesla) # Output: False +print(Tesla == ElectricCar("Tesla", "Model 3", 2022, 75)) # Output: True +print(Tesla == ElectricCar("Tesla", "Model S", 2022, 100)) # Output: False + +#inheritance and method overriding +class HybridCar(ElectricCar): + def __init__(self, make: str, model: str, year: int, battery_size: int, fuel_type: str) -> None: + super().__init__(make, model, year, battery_size) + self.fuel_type = fuel_type + + def __str__(self) -> str: + return f"{self.year} {self.make} {self.model} with a {self.battery_size}-kWh battery runs on {self.fuel_type}" + + def __repr__(self) -> str: + return f"HybridCar(make={self.make}, model={self.model}, year={self.year}, battery_size={self.battery_size}, fuel_type={self.fuel_type})" + +myHybridCar: HybridCar = HybridCar("Toyota", "Prius", 2021, 1.3, "Gasoline") +print(myHybridCar) # Output: 2021 Toyota Prius with a 1.3-kWh battery runs on Gasoline +print(repr(myHybridCar)) # Output: HybridCar(make=Toyota, model=Prius, year=2021, battery_size=1.3, fuel_type=Gasoline) +print(str(myHybridCar)) # Output: 2021 Toyota Prius with a 1.3-kWh battery and runs on Gasoline diff --git a/complex_class.py b/complex_class.py new file mode 100644 index 0000000..8232a96 --- /dev/null +++ b/complex_class.py @@ -0,0 +1,73 @@ +class Complex: + def __init__(self, real=0.0, imag=0.0): + self.real = real + self.imag = imag + + def __add__(self, other): + if isinstance(other, Complex): + return Complex(self.real + other.real, self.imag + other.imag) + return NotImplemented + + def __sub__(self, other): + if isinstance(other, Complex): + return Complex(self.real - other.real, self.imag - other.imag) + return NotImplemented + + def __mul__(self, other): + if isinstance(other, Complex): + return Complex( + self.real * other.real - self.imag * other.imag, + self.real * other.imag + self.imag * other.real + ) + return NotImplemented + + def __truediv__(self, other): + if isinstance(other, Complex): + denom = other.real ** 2 + other.imag ** 2 + if denom == 0: + raise ZeroDivisionError("division by zero") + return Complex( + (self.real * other.real + self.imag * other.imag) / denom, + (self.imag * other.real - self.real * other.imag) / denom + ) + return NotImplemented + + def __str__(self): + return f"{self.real} + {self.imag}i" + + def __repr__(self): + return f"Complex({self.real}, {self.imag})" + + def conjugate(self): + return Complex(self.real, -self.imag) + + def magnitude(self): + return (self.real ** 2 + self.imag ** 2) ** 0.5 + + def phase(self): + import math + return math.atan2(self.imag, self.real) + + def __eq__(self, other): + if isinstance(other, Complex): + return self.real == other.real and self.imag == other.imag + return NotImplemented + + def __ne__(self, other): + return not self.__eq__(other) + +if __name__ == "__main__": + c1 = Complex(3, 4) + c2 = Complex(1, 2) + + print("c1:", c1) + print("c2:", c2) + print("c1 + c2:", c1 + c2) + print("c1 - c2:", c1 - c2) + print("c1 * c2:", c1 * c2) + print("c1 / c2:", c1 / c2) + print("Conjugate of c1:", c1.conjugate()) + print("Magnitude of c1:", c1.magnitude()) + print("Phase of c1:", c1.phase()) + print("Are c1 and c2 equal?", c1 == c2) + \ No newline at end of file diff --git a/concatenating_arrays.py b/concatenating_arrays.py new file mode 100644 index 0000000..70710cd --- /dev/null +++ b/concatenating_arrays.py @@ -0,0 +1,38 @@ +import numpy as np +""" +This script demonstrates how to concatenate NumPy arrays using `np.concatenate` for both 1D and 2D arrays. +Examples included: +- Concatenating two 1D arrays along their only axis. +- Concatenating two 2D arrays along axis 0 (rows) and axis 1 (columns). +- Combining simulated quarterly sales data for two products across two years by concatenating along columns. +Variables: +- array1, array2: Example arrays for demonstration. +- concatenated_array: Result of concatenating 1D arrays. +- concatenated_array_rows: Result of concatenating 2D arrays along rows. +- concatenated_array_columns: Result of concatenating 2D arrays along columns. +- sales_data_2021, sales_data_2022: Simulated sales data arrays. +- combined_sales_by_product: Combined sales data for both years by product. +Prints the results of each concatenation operation. +""" +array1 = np.array([1, 2, 3]) +array2 = np.array([4, 5, 6]) +# Concatenating 1D arrays along their only axis 0 +concatenated_array = np.concatenate((array1, array2)) +print(concatenated_array) + + +array1 = np.array([[1, 2], [3, 4]]) +array2 = np.array([[5, 6], [7, 8]]) +# Concatenating along the axis 0 (rows) +concatenated_array_rows = np.concatenate((array1, array2)) +print(f'Axis = 0:\n{concatenated_array_rows}') +# Concatenating along the axis 1 (columns) +concatenated_array_columns = np.concatenate((array1, array2), axis=1) +print(f'Axis = 1:\n{concatenated_array_columns}') + +# Simulated data for quarterly sales of two products in 2021 and 2022 +sales_data_2021 = np.array([[350, 420, 380, 410], [270, 320, 290, 310]]) +sales_data_2022 = np.array([[370, 430, 400, 390], [280, 330, 300, 370]]) +# Concatenate the sales data for both products by columns +combined_sales_by_product = np.concatenate((sales_data_2021, sales_data_2022), axis=1) +print(f'Combined sales by product:\n{combined_sales_by_product}') \ No newline at end of file diff --git a/console_print_with_function.py b/console_print_with_function.py new file mode 100644 index 0000000..7657733 --- /dev/null +++ b/console_print_with_function.py @@ -0,0 +1,7 @@ +# Prices of items sold today +prices = [12.99, 23.50, 4.99, 8.75, 15.00] + +def total_sales(prices): + print(f"Today's total sales: $", sum(prices)) + +total_sales(prices) \ No newline at end of file diff --git a/cylinder_max.py b/cylinder_max.py new file mode 100644 index 0000000..c7d21d8 --- /dev/null +++ b/cylinder_max.py @@ -0,0 +1,43 @@ +''' +You must manufacture a closed cylindrical can (top and bottom included). You have a fixed amount of material so the total surface area 𝐴 of the can is fixed. +Find the radius 𝑟 and height ℎ of the cylinder that maximize the enclosed volume 𝑉. What is the relation between ℎ and 𝑟 at the optimum? What is the maximal +volume 𝑉 sub(max) expressed in terms of the fixed surface area 𝐴? +''' + +import numpy as np +from scipy.optimize import minimize + +# Fixed surface area +A_fixed = 2000 # You can change this value + +# Volume function to maximize (we'll minimize the negative) +def volume(params): + r, h = params + return -np.pi * r**2 * h # Negative for maximization + +# Constraint: surface area must equal A_fixed +def surface_area_constraint(params): + r, h = params + return 2 * np.pi * r**2 + 2 * np.pi * r * h - A_fixed + +# Initial guess +initial_guess = [1.0, 1.0] + +# Bounds: radius and height must be positive +bounds = [(0.0001, None), (0.0001, None)] + +# Define constraint dictionary +constraints = {'type': 'eq', 'fun': surface_area_constraint} + +# Run optimization +result = minimize(volume, initial_guess, bounds=bounds, constraints=constraints) + +# Extract optimal values +if result.success: + r_opt, h_opt = result.x + V_max = np.pi * r_opt**2 * h_opt + print(f"Optimal radius: {r_opt:.4f}") + print(f"Optimal height: {h_opt:.4f}") + print(f"Maximum volume: {V_max:.4f}") +else: + print("Optimization failed:", result.message) diff --git a/decorator_add.py b/decorator_add.py new file mode 100644 index 0000000..283a071 --- /dev/null +++ b/decorator_add.py @@ -0,0 +1,47 @@ +def verbose(func): + def wrapper(*args, **kwargs): + print(f"Arguments were: {args}, {kwargs}") + return func(*args, **kwargs) + return wrapper + +@verbose +def add(a, b): + return a + b + +print(add(3, 4)) + +''' +How it works: +# The decorator 'verbose' prints the arguments passed to the function 'add' before executing it. +# The function 'add' then returns the sum of the two arguments. The decorator is applied using the '@' syntax. + +''' + +def layer1(func): + def wrapper(*args, **kwargs): + print("layer 1") + func(*args, **kwargs) + print("layer 1") + return wrapper + +def layer2(func): + def wrapper(*args, **kwargs): + print("layer 2") + func(*args, **kwargs) + print("layer 2") + return wrapper + +def layer3(func): + def wrapper(*args, **kwargs): + print("layer 3") + func(*args, **kwargs) + print("layer 3") + return wrapper + +@layer1 +@layer2 +@layer3 +def print_hi(message): + print(message) + +print_hi("Hi there!") \ No newline at end of file diff --git a/decorator_chaining.py b/decorator_chaining.py new file mode 100644 index 0000000..88c1f2c --- /dev/null +++ b/decorator_chaining.py @@ -0,0 +1,33 @@ + +def decorator_one(func): + def wrapper(): + print("Decorator one start") + func() + print("Decorator one end") + return wrapper + +def decorator_two(func): + def wrapper(): + print("Decorator two start") + func() + print("Decorator two end") + return wrapper + +@decorator_one +@decorator_two +def greet(): + print("Hello!") + +greet() + +''' +How it works: +1. The `decorator_one` function is defined, which takes a function `func` as an argument. +2. Inside `decorator_one`, a `wrapper` function is defined that prints messages before and after calling `func`. +3. The `wrapper` function is returned from `decorator_one`. + +4. The `decorator_two` function is defined in a similar way. +5. The `greet` function is decorated with both `@decorator_one` and `@decorator_two`. +6. When `greet` is called, it goes through both decorators, printing messages from each. + +''' \ No newline at end of file diff --git a/decorator_exercise.py b/decorator_exercise.py new file mode 100644 index 0000000..9da34c7 --- /dev/null +++ b/decorator_exercise.py @@ -0,0 +1,33 @@ +import time + +# Step 2: Define the decorator +def time_it(func): + def wrapper(*args, **kwargs): + start_time = time.time() # Start time + result = func(*args, **kwargs) # Call the function + end_time = time.time() # End time + print(f"{func.__name__} took {end_time - start_time} seconds") + return result + return wrapper + +# Step 4: Apply the decorator +@time_it +def factorial(n): + """Function to compute factorial of a number""" + return 1 if n == 0 else n * factorial(n - 1) + +# Step 5: Test the decorator +print(factorial(20)) # Replace with any number to test + +''' How this code works: +This code defines a decorator indicate and three functions avg_two, avg_three, and avg_many_kwargs , each decorated with indicate. Here's a brief description of each component: + +Decorator time_it(func) function: +- Adds functionality to factorial to calculate the difference between the time before and after executing function factorial. +- wrapper takes arguments *args and **kwargs and passes them to the func call (factorial). +- The *args allows the wrapper() function to accept any number of positional arguments as a tuple. +- The **kwargs allows the wrapper() function to accept any number of keyword arguments as a dictionary. +The @time_it decorator is applied to the function: +- factorial(n): Computes the factorial of a number, with timing information displayed due to the decorator. +- The decorator prints the time taken to execute the factorial function. +''' \ No newline at end of file diff --git a/decorator_validation.py b/decorator_validation.py new file mode 100644 index 0000000..590cffb --- /dev/null +++ b/decorator_validation.py @@ -0,0 +1,17 @@ +def validate_decorator(func): + def wrapper(number): + if not isinstance(number, int) or number < 0: + raise ValueError("Input must be a non-negative integer") + return func(number) + return wrapper + +@validate_decorator +def factorial(n): + if n == 0: + return 1 + else: + return n * factorial(n - 1) + +# Usage +print(factorial(2)) +# factorial(-1) # This will raise an error \ No newline at end of file diff --git a/def decode_permissions(permissions):.py b/def decode_permissions(permissions):.py new file mode 100644 index 0000000..ab02c57 --- /dev/null +++ b/def decode_permissions(permissions):.py @@ -0,0 +1,47 @@ +def decode_permissions(permissions): + if len(permissions) != 10: + return "Invalid permissions string." + + file_type = permissions[0] + owner_permissions = permissions[1:4] + group_permissions = permissions[4:7] + others_permissions = permissions[7:10] + + file_type_dict = { + 'd': "Directory", + '-': "File" + } + + owner_permissions_dict = { + 'r': "Read", + 'w': "Write", + 'x': "Execute", + '-': "No permission" + } + + owner_permissions_str = " ".join(owner_permissions_dict[p] for p in owner_permissions) + + group_permissions_dict = { + 'r': "Read", + 'w': "Write", + 'x': "Execute", + 's': "Set Group ID (SGID) bit set", + '-': "No permission" + } + + group_permissions_str = " ".join(group_permissions_dict[p] for p in group_permissions) + + others_permissions_dict = { + 'r': "Read", + 'w': "Write", + 'x': "Execute", + 's': "Set Group ID (SGID) bit set for others", + '-': "No permission" + } + + others_permissions_str = " ".join(others_permissions_dict[p] for p in others_permissions) + + return f"{file_type_dict[file_type]} - Owner: {owner_permissions_str}, Group: {group_permissions_str}, Others: {others_permissions_str}" + +file_permissions = "drwxrwsrwx+" +print(decode_permissions(file_permissions)) # Output: Directory - Owner: Read Write Execute, Group: Read Write Set Group ID (SGID) bit set, Others: Read Write Execute \ No newline at end of file diff --git a/default_func_parameters.py b/default_func_parameters.py new file mode 100644 index 0000000..a71789a --- /dev/null +++ b/default_func_parameters.py @@ -0,0 +1,12 @@ +# Define a function with a default `discount` argument +def apply_discount(price, discount=0.10): + discounted_price = price * (1 - discount) + return discounted_price + +# Call the function without providing a `discount`, using the default value +default_discount_price = apply_discount(100) +print(f"Price after applying the default discount: ${default_discount_price}") + +# Call the function with a custom `discount` value +custom_discount_price = apply_discount(100, 0.20) +print(f"Price after applying a custom discount: ${custom_discount_price}") \ No newline at end of file diff --git a/dict_merge.py b/dict_merge.py new file mode 100644 index 0000000..79461bf --- /dev/null +++ b/dict_merge.py @@ -0,0 +1,6 @@ +# Merging two dictionaries in Python +dict_a = {'a': 1, 'b': 2} +dict_b = {'c': 3, 'd': 4} + +my_dict = {**dict_a, **dict_b} +print(my_dict) diff --git a/digital_to_binary.py b/digital_to_binary.py new file mode 100644 index 0000000..7566b94 --- /dev/null +++ b/digital_to_binary.py @@ -0,0 +1,23 @@ +def digital_to_binary(digital_number): + """ + Convert a digital number to its binary representation. + + Parameters: + digital_number (int): The digital number to convert. + + Returns: + str: The binary representation of the digital number. + """ + if not isinstance(digital_number, int) or digital_number < 0: + raise ValueError("Input must be a non-negative integer.") + + return bin(digital_number)[2:] + +# Example usage: +if __name__ == "__main__": + try: + number = 1078 # Example digital number + binary_representation = digital_to_binary(number) + print(f"The binary representation of {number} is {binary_representation}") + except ValueError as e: + print(e) \ No newline at end of file diff --git a/digital_to_hexidecimal.py b/digital_to_hexidecimal.py new file mode 100644 index 0000000..0abd6ba --- /dev/null +++ b/digital_to_hexidecimal.py @@ -0,0 +1,23 @@ +def digital_to_hexidecimal(digital_number): + """ + Convert a digital number to its hexadecimal representation. + + Parameters: + digital_number (int): The digital number to convert. + + Returns: + str: The hexadecimal representation of the digital number. + """ + if not isinstance(digital_number, int) or digital_number < 0: + raise ValueError("Input must be a non-negative integer.") + + return hex(digital_number)[2:].upper() + +# Example usage: +if __name__ == "__main__": + try: + number = 1500 # Example digital number + hex_representation = digital_to_hexidecimal(number) + print(f"The hexadecimal representation of {number} is {hex_representation}") + except ValueError as e: + print(e) \ No newline at end of file diff --git a/dimensions.py b/dimensions.py new file mode 100644 index 0000000..85c6580 --- /dev/null +++ b/dimensions.py @@ -0,0 +1,35 @@ +# example of the immutable tuple + +# dimensions = (200, 50) +# print(dimensions) +# print(dimensions[0]) +# print(dimensions[1]) + +# attempting to change the first element in the tuple + +#dimensions = (200, 50) +#dimensions[0] = 250 + +# example of a one-element tuple + +#my_tuple = (3,) +#print(my_tuple) + +# looping through the elements of a tuple + +# dimensions = (200, 50) +#for dimension in dimensions: +# print(dimension) + +# writing over a tuple + +dimensions = (200, 50) +print("Original dimensions:") +for dimension in dimensions: + print(dimension) + +dimensions = (400, 50) +print("\nModified dimensions") +for dimension in dimensions: + print(dimension) + diff --git a/discounted_list_prices.py b/discounted_list_prices.py new file mode 100644 index 0000000..a7e7a8b --- /dev/null +++ b/discounted_list_prices.py @@ -0,0 +1,14 @@ +# List of product prices +product_prices = [1.50, 2.50, 3.00, 0.99, 2.30] + +def apply_discount(prices): + prices_copy = product_prices.copy() + for index in range(len(prices_copy)): + if prices_copy[index] > 2.00: + prices_copy[index] *= .90 + return prices_copy + +# Call the function and store the updated prices +updated_prices = apply_discount(product_prices) + +print(f"Updated product prices: {updated_prices}") \ No newline at end of file diff --git a/enhanced_decorators.py b/enhanced_decorators.py new file mode 100644 index 0000000..7ddeff3 --- /dev/null +++ b/enhanced_decorators.py @@ -0,0 +1,42 @@ +def simple_decorator(func): + def wrapper(): + print("Something is happening before the function is called.") + func() + print("Something is happening after the function is called.") + return wrapper + +@simple_decorator +def say_hello(): + print("Hello!") + +say_hello() + +# Now, the enhanced decorator +def decorator_with_args(arg1, arg2): + def decorator(func): + def wrapper(*args, **kwargs): + print(f"Decorator args: {arg1}, {arg2}") + return func(*args, **kwargs) + return wrapper + return decorator + +@decorator_with_args("hello", 42) +def print_numbers(a, b): + print(a + b) + +print_numbers(10, 5) + +''' +How it works: +1. The `simple_decorator` function is defined, which takes a function `func` as an argument. +2. Inside `simple_decorator`, a `wrapper` function is defined that prints messages before and after calling `func`. +3. The `wrapper` function is returned from `simple_decorator`. + +4. The `decorator_with_args` function is defined, which takes two arguments `arg1` and `arg2`. +5. Inside `decorator_with_args`, a `decorator` function is defined that takes a function `func` as an argument. +6. Inside `decorator`, a `wrapper` function is defined that prints the decorator arguments and then calls `func`. +7. The `wrapper` function is returned from `decorator`, and `decorator` is returned from `decorator_with_args`. + +8. The `print_numbers` function is decorated with `@decorator_with_args("hello", 42")`. +9. When `print_numbers` is called, it prints the sum of its arguments and the decorator arguments. +''' \ No newline at end of file diff --git a/even_numbers.py b/even_numbers.py new file mode 100644 index 0000000..9737c28 --- /dev/null +++ b/even_numbers.py @@ -0,0 +1,2 @@ +even_numbers = list(range(2, 11, 2)) +print(even_numbers) diff --git a/famous_quote.py b/famous_quote.py new file mode 100644 index 0000000..419c81f --- /dev/null +++ b/famous_quote.py @@ -0,0 +1,3 @@ +name = "albert einstein" +print(f"{name.title()} once said, \"A person who never made a mistake never") +print("\btried anything new.\"") diff --git a/famous_quote_2.py b/famous_quote_2.py new file mode 100644 index 0000000..a2bdf1c --- /dev/null +++ b/famous_quote_2.py @@ -0,0 +1,4 @@ +famous_person = "Albert Einstein" +print(f"{famous_person} once said, \"A person who never made a mistake") +print("\bnever tried anything new.\"") + diff --git a/favorite_language_values.py b/favorite_language_values.py new file mode 100644 index 0000000..33df4ee --- /dev/null +++ b/favorite_language_values.py @@ -0,0 +1,11 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +print('The following languages have been mentioned:') +for language in favorite_languages.values(): + print(language.title()) + + \ No newline at end of file diff --git a/favorite_languages.py b/favorite_languages.py new file mode 100644 index 0000000..2db6b80 --- /dev/null +++ b/favorite_languages.py @@ -0,0 +1,10 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +language = favorite_languages['sarah'].title() +print(f"Sarah's favorite language is {language}.") +# Asking for Sarah's favorite language +favorite_languages['sarah'] diff --git a/favorite_languages2.py b/favorite_languages2.py new file mode 100644 index 0000000..a905798 --- /dev/null +++ b/favorite_languages2.py @@ -0,0 +1,9 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +for name, language in favorite_languages.items(): + print(f"{name.title()}'s favorite language is {language.title()}.") + \ No newline at end of file diff --git a/favorite_languages3.py b/favorite_languages3.py new file mode 100644 index 0000000..b9d03f6 --- /dev/null +++ b/favorite_languages3.py @@ -0,0 +1,8 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +for name in favorite_languages.keys(): + print(name.title()) diff --git a/favorite_languages4.py b/favorite_languages4.py new file mode 100644 index 0000000..350005c --- /dev/null +++ b/favorite_languages4.py @@ -0,0 +1,12 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +friends = ['phil', 'sarah'] +for name in favorite_languages.keys(): + print(f"Hi, {name.title()}.") + if name in friends: + language = favorite_languages[name].title() + print(f"\t{name.title()}, I see you love {language}!") diff --git a/favorite_languages_in_set.py b/favorite_languages_in_set.py new file mode 100644 index 0000000..64ea684 --- /dev/null +++ b/favorite_languages_in_set.py @@ -0,0 +1,11 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +print('The following languages have been mentioned:') +for language in set(favorite_languages.values()): + print(language.title()) + + \ No newline at end of file diff --git a/favorite_languages_modified.py b/favorite_languages_modified.py new file mode 100644 index 0000000..843a646 --- /dev/null +++ b/favorite_languages_modified.py @@ -0,0 +1,12 @@ +favorite_languages = { + 'jen': ['python', 'rust'], + 'sarah': ['c'], + 'edward': ['rust', 'go'], + 'phil': ['python', 'haskell'], + +} +for name, languages in favorite_languages.items(): + print(f"\n{name.title()}'s favorite languages are:") + for language in languages: + print(f"\t{language.title()}") + diff --git a/favorite_languages_sorted.py b/favorite_languages_sorted.py new file mode 100644 index 0000000..f83a3cf --- /dev/null +++ b/favorite_languages_sorted.py @@ -0,0 +1,9 @@ +favorite_languages = { + 'jen': 'python', + 'sarah': 'c', + 'edward': 'rust', + 'phil': 'python', + } +for name in sorted(favorite_languages.keys()): + print(f"{name.title()}, thank you for taking the poll.") + \ No newline at end of file diff --git a/file_extension.py b/file_extension.py new file mode 100644 index 0000000..b88d42b --- /dev/null +++ b/file_extension.py @@ -0,0 +1,2 @@ +filename = "filename.txt" +print(filename.removesuffix(".txt")) diff --git a/first_numbers.py b/first_numbers.py new file mode 100644 index 0000000..de4cbe9 --- /dev/null +++ b/first_numbers.py @@ -0,0 +1,5 @@ +#for value in range(1, 5): + #print(value) + +numbers = list(range(1, 6)) +print(numbers) diff --git a/flattening_arrays.py b/flattening_arrays.py new file mode 100644 index 0000000..fca5df2 --- /dev/null +++ b/flattening_arrays.py @@ -0,0 +1,27 @@ +import numpy as np +""" +This script demonstrates three different methods to flatten a NumPy array: +1. `flatten()`: Returns a copy of the array collapsed into one dimension. +2. `reshape(-1)`: Reshapes the array into a one-dimensional array. +3. `ravel()`: Returns a flattened array; returns a view whenever possible. +The script uses a simulated exam scores array for three students across three subjects. +It prints the results of each flattening method and shows that modifying the copy returned by `flatten()` does not affect the original array. +""" +# Simulated exam scores for three students in three subjects +exam_scores = np.array([[75, 82, 90], [92, 88, 78], [60, 70, 85]]) +# Use the flatten() method for flattening +flattened_exam_scores = exam_scores.flatten() +print(flattened_exam_scores) + +# Use the reshape() method for flattening +exam_scores_reshaped = exam_scores.reshape(-1) +print(exam_scores_reshaped) + +# Use the ravel() method for flattening +exam_scores_raveled = exam_scores.ravel() +print(exam_scores_raveled) + +# Set the first element of the flattened copy to 100 +flattened_exam_scores[0] = 100 +print(flattened_exam_scores) +print(exam_scores) # Original array remains unchanged \ No newline at end of file diff --git a/flexible_decorators.py b/flexible_decorators.py new file mode 100644 index 0000000..c6ca4c0 --- /dev/null +++ b/flexible_decorators.py @@ -0,0 +1,49 @@ +def indicate(func): + def wrapper(*args, **kwargs): + print("=" * 15) + print("Taken arguments:", *args, kwargs) + result = func(*args, **kwargs) + print("=" * 15) + return result + return wrapper + + +@indicate +def avg_two(a, b): + """Calculate the average of two numbers""" + return round((a + b) / 2, 1) + +@indicate +def avg_three(a, b, c): + """Calculate the average of three numbers""" + return round((a + b + c) / 3, 1) + +@indicate +def avg_many_kwargs(**kwargs): + """Calculate the average of multiple numbers in a dictionary""" + keys = 0 + total = 0 + + for value in kwargs.values(): + keys += 1 + total += value + + return round(total / keys, 1) + +print("Returned:", avg_two(14, 21), "\n") +print("Returned:", avg_three(225, 12, 11), "\n") +print("Returned:", avg_many_kwargs(first=51, second=11, third=47, fourth=93)) + +''' How this code works: +This code defines a decorator indicate and three functions avg_two, avg_three, and avg_many_kwargs , each decorated with indicate. Here's a brief description of each component: + +Decorator indicate(func) function: +- Adds functionality to print arguments and a separator before and after executing a function. +- wrapper takes arguments *args and **kwargs and pass them to the func call. +- The *args allows the wrapper() function to accept any number of positional arguments as a tuple. +- The **kwargs allows the wrapper() function to accept any number of keyword arguments as a dictionary. +The @indicate decorator is applied to three functions: +- avg_two(a, b): Calculates and returns the average of two numbers, displaying additional information due to the decorator. +- avg_three(a, b, c): Computes the average of three numbers, with additional prints from the decorator. +- avg_many_kwargs(**kwargs): Finds the average of multiple numbers passed as keyword arguments, also showing argument details through the decorator. +''' \ No newline at end of file diff --git a/foods.py b/foods.py new file mode 100644 index 0000000..a4ebacc --- /dev/null +++ b/foods.py @@ -0,0 +1,30 @@ +#my_foods = ['pizza', 'falafal', 'carrot cake'] +#friends_foods = my_foods[:] +#print("My favorite foods are:") +#print(my_foods) +#print("\nMy friend's favorite foods are:") +#print(friends_foods) + +# Now, we add an item to each list and check to see if each list is correct + +my_foods = ['pizza', 'falafal', 'carrot cake'] +friends_foods = ['pizza', 'falafal' 'carrot cake'] + +# This doesn't work + +#friends_foods = my_foods + +# Instead, use the slice when copying the lists + +friends_foods = my_foods[:] + +my_foods.append('cannoli') +friends_foods.append('ice cream') + +print("My favorite foods are:") +print(my_foods) + +print("\nMy friend's favorite foods are:") +print(friends_foods) + + diff --git a/full_name.py b/full_name.py new file mode 100644 index 0000000..2b1bce0 --- /dev/null +++ b/full_name.py @@ -0,0 +1,6 @@ +first_name = "ada" +last_name = "lovelace" +full_name = f"{first_name} {last_name}" +print(f"Hello, {full_name.title()}!") + + diff --git a/func_calls_func.py b/func_calls_func.py new file mode 100644 index 0000000..44722b4 --- /dev/null +++ b/func_calls_func.py @@ -0,0 +1,25 @@ +# Dictionary representing the current stock of products +inventory = { + "apples": 17, + "bananas": 75, + "oranges": 2, + "grapes": 50 +} + +# Function to restock items that have low stock levels by adding a specified amount +def restock(product, inventory, restock_amount): + inventory[product] += restock_amount + print(f"Restock order placed for {product}. New stock level: {inventory[product]} units.") + +# Function to check which items are below the stock threshold and trigger the `restock` function +def check_stock_levels(inventory, threshold): + for product, quantity in inventory.items(): + if quantity < threshold: + # If the stock is below the threshold, call the `restock` function to add 50 units + restock(product, inventory, 50) + +# Checking the stock levels for all products in the inventory with a threshold of 30 units +check_stock_levels(inventory, 30) + +# Display the final inventory after restocking +print("Final inventory status:", inventory) \ No newline at end of file diff --git a/generators.py b/generators.py new file mode 100644 index 0000000..d9a9512 --- /dev/null +++ b/generators.py @@ -0,0 +1,63 @@ +import time + +def my_generator(): + yield 3 + yield 2 + yield 1 + +for value in my_generator(): + print(value) + + +# Using next() to manually iterate through the generator +g = my_generator() +print(next(g)) # Output: 1 +print(next(g)) # Output: 2 +print(next(g)) # Output: 3 + +print(sum(my_generator())) # Output: 6 +print(sorted(my_generator())) # Output: [1, 2, 3] + +def countdown(n): + while n > 0: + yield n + n -= 1 + +for number in countdown(4): + print(number) + time.sleep(1) # Pause for 1 second between numbers + +# Example of a generator function to yield first n numbers +def firstn(n): + num = 0 + while num < n: + yield num + num += 1 + +# calling firstn(): +for number in firstn(10): + print(number) + + +print(sum(firstn(100))) # Output: 4950 + + +# Example of a generator expression +squared = (x * x for x in range(10)) +for num in squared: + print(num) + +# Fibonacci sequence generator +def fibonacci(n): + a, b = 0, 1 + for _ in range(n): + yield a + a, b = b, a + b + +for num in fibonacci(30): + print(num) + +print(list(fibonacci(30))) # Output: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] + + + \ No newline at end of file diff --git a/global_variables.py b/global_variables.py new file mode 100644 index 0000000..e5df3d5 --- /dev/null +++ b/global_variables.py @@ -0,0 +1,47 @@ + + +""" +This script demonstrates the use of global variables and the `global` keyword in Python functions. +Global Variables: +- `age`: An integer representing a person's age. +Functions: +- birthday_greet(): + - First definition: Prints a birthday greeting using the global `age` variable, incremented by 1 (without modifying the global variable). + - Second definition: Uses the `global` keyword to modify the global `age` variable by incrementing it by 1, then prints a birthday greeting. +- birthday_greet_global(): + - First definition: Prints a birthday greeting using the global `age` variable, incremented by 5 (without modifying the global variable). + - Second definition: Uses the `global` keyword to modify the global `age` variable by incrementing it by 5, then prints a birthday greeting. +Demonstrates: +- The difference between accessing and modifying global variables inside functions. +- The effect of the `global` keyword on variable scope and assignment. +""" +age = 24 + +def birthday_greet(): + print(f"Happy B-Day! You are {age + 1}! (local message)") + +birthday_greet() # Call the local function +print("Global message", age) # Print the global variable + +def birthday_greet_global(): + print(f"Happy B-Day! You are {age + 5}! (global message)") +birthday_greet_global() # Call the global function + + + +age = 20 + +def birthday_greet(): + global age # Added 'global' keyword + age += 1 + print(f"Happy B-Day! You are {age}! (local message)") + +birthday_greet() +print("Global message", age) + +def birthday_greet_global(): + global age # Added 'global' keyword + age += 5 + print(f"Happy B-Day! You are {age}! (global message)") + +birthday_greet_global() # Call the global function \ No newline at end of file diff --git a/high-order_functions.py b/high-order_functions.py new file mode 100644 index 0000000..6dad97f --- /dev/null +++ b/high-order_functions.py @@ -0,0 +1,50 @@ +# File: OneDrive/Documents/Python%20Code/using_kwargs.py +# Using map to apply a function to each item in an iterable +def square(x): + return x * x + +numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # List of numbers from 1 to 10 +squared_numbers = map(square, numbers) + +# Convert the map object to a list +squared_numbers_list = list(squared_numbers) +print(squared_numbers_list) + +# Using map to cube numbers +def cube(x): + return x * x * x + +cubed_numbers = map(cube, numbers) +cubed_numbers_list = list(cubed_numbers) +print(cubed_numbers_list) + +# Using filter to filter out even numbers +def is_even(x): + return x % 2 == 0 + +even_numbers = filter(is_even, numbers) +even_numbers_list = list(even_numbers) +print(even_numbers_list) +# Using filter to filter out odd numbers +def is_odd(x): + return x % 2 != 0 + +odd_numbers = filter(is_odd, numbers) +odd_numbers_list = list(odd_numbers) +print(odd_numbers_list) + +# Step 1: Define the list of temperatures in Celsius +temp_celsius = [-40, 0, 25, 30, 40, 100] + +# Step 2: Define a custom function to convert Celsius to Fahrenheit +def celsius_to_fahrenheit(celsius): + """Convert temperature from Celsius to Fahrenheit.""" + fahrenheit = (celsius * 9/5) + 32 + return fahrenheit + +# Step 3: Use map() with the custom function +temp_fahrenheit = map(celsius_to_fahrenheit, temp_celsius) + +# Step 4: Convert the map object to a list and print +temp_fahrenheit_list = list(temp_fahrenheit) +print(temp_fahrenheit_list) diff --git a/item_class.py b/item_class.py new file mode 100644 index 0000000..5e70709 --- /dev/null +++ b/item_class.py @@ -0,0 +1,170 @@ +class item: + def __init__(self, name: str, price: float, quantity=0): + # Run validations to the received arguments + assert price >= 0, f"Price {price} is not greater than or equal to zero!" + assert quantity >= 0, f"Quantity {quantity} is not greater than or equal to zero!" + + # Assign to self object + self.name = name + self.price = price + self.quantity = quantity + + def calculate_total_price(self): + return self.price * self.quantity + + def apply_discount(self, discount): + self.price = self.price * (1 - discount) + assert self.price >= 0, f"Price {self.price} is not greater than or equal to zero!" + return self.price + + def __repr__(self): + return f"item('{self.name}', {self.price}, {self.quantity})" + + def __str__(self): + return f"Item: {self.name}, Price: {self.price}, Quantity: {self.quantity}" + + @property + def name(self): + return self._name + + @property + def price(self): + return self._price + + @property + def quantity(self): + return self._quantity + @name.setter + def name(self, value): + if len(value) > 10: + raise Exception("The name is too long!") + else: + self._name = value + + @price.setter + def price(self, value): + if value < 0: + raise Exception("Price cannot be negative!") + else: + self._price = value + + @quantity.setter + def quantity(self, value): + if value < 0: + raise Exception("Quantity cannot be negative!") + else: + self._quantity = value + + @classmethod + def instantiate_from_csv(cls, filename): + import csv + with open(filename, 'r') as f: + reader = csv.DictReader(f) + items = list(reader) + for item in items: + item['price'] = float(item['price']) + item['quantity'] = int(item['quantity']) + return [cls(**item) for item in items] + @staticmethod + def is_integer(num): + # We will count out the floats that are point zero + if isinstance(num, float): + # Count out the floats that are point zero + return num.is_integer() + elif isinstance(num, int): + return True + else: + return False + def __add__(self, other): + if isinstance(other, item): + return self.quantity + other.quantity + else: + raise Exception("You cannot add these two objects") + def __radd__(self, other): + return self.__add__(other) + def __mul__(self, other): + if isinstance(other, (int, float)): + return self.price * other + else: + raise Exception("You cannot multiply these two objects") + def __rmul__(self, other): + return self.__mul__(other) + def __eq__(self, other): + if isinstance(other, item): + return self.price == other.price and self.quantity == other.quantity + else: + return False + def __lt__(self, other): + if isinstance(other, item): + return self.price < other.price + else: + raise Exception("You cannot compare these two objects") + def __le__(self, other): + if isinstance(other, item): + return self.price <= other.price + else: + raise Exception("You cannot compare these two objects") + def __gt__(self, other): + if isinstance(other, item): + return self.price > other.price + else: + raise Exception("You cannot compare these two objects") + def __ge__(self, other): + if isinstance(other, item): + return self.price >= other.price + else: + raise Exception("You cannot compare these two objects") + + def __ne__(self, other): + if isinstance(other, item): + return self.price != other.price or self.quantity != other.quantity + else: + return True + def __hash__(self): + return hash((self.name, self.price, self.quantity)) + def __bool__(self): + return self.quantity > 0 + def __len__(self): + return len(self.name) + def __getitem__(self, index): + return self.name[index] + def __setitem__(self, index, value): + name_list = list(self.name) + name_list[index] = value + self.name = ''.join(name_list) + def __delitem__(self, index): + name_list = list(self.name) + del name_list[index] + self.name = ''.join(name_list) + def __contains__(self, item): + return item in self.name + def __dir__(self): + return ['name', 'price', 'quantity', 'calculate_total_price', 'apply_discount', 'instantiate_from_csv', 'is_integer'] + def __format__(self, format_spec): + if format_spec == 'name': + return self.name + elif format_spec == 'price': + return f"{self.price:.2f}" + elif format_spec == 'quantity': + return str(self.quantity) + else: + return str(self) + def __getstate__(self): + return self.__dict__ + def __setstate__(self, state): + self.__dict__.update(state) + def __copy__(self): + return item(self.name, self.price, self.quantity) + def __deepcopy__(self, memo): + from copy import deepcopy + return item(deepcopy(self.name, memo), deepcopy(self.price, memo), deepcopy(self.quantity, memo)) + def __reversed__(self): + return item(self.name[::-1], self.price, self.quantity) + # The following methods are already defined above, so they should not be duplicated. + # Remove the duplicate definitions to avoid syntax errors and keep only one implementation. + + # (No code needed here, as the correct implementations are already present earlier in the class.) +example = item("Example", 10.0, 5) +print(example) # Output: Item: Example, Price: 10.0, Quantity: 5 +print(repr(example)) # Output: item('Example', 10.0, 5) +print(example.calculate_total_price()) # Output: 50.0 \ No newline at end of file diff --git a/kargs_in_dynamic_funcs.py b/kargs_in_dynamic_funcs.py new file mode 100644 index 0000000..4334477 --- /dev/null +++ b/kargs_in_dynamic_funcs.py @@ -0,0 +1,21 @@ +def personal_info(name, **kwargs): + print(f"Name: {name}") + for key, value in kwargs.items(): + print(f"{key.capitalize()}: {value}") + + + """ + Prints personal information including a required name and any number of additional keyword arguments. + Args: + name (str): The person's name. + **kwargs: Arbitrary keyword arguments representing additional personal information (e.g., surname, son, cats, breed). + kwargs.key is capitalized in the output. + Returns: + None + """ +# Example usage of the personal_info function +personal_info("Sarah", surname="Conor", son="John") +personal_info("Natalie", cats="3", breed="Maine Coon") +personal_info("John", surname="Doe", age=30, city="New York", occupation="Engineer") +personal_info("Alice", hobbies="reading, hiking", favorite_color="blue") + diff --git a/keyword_arguments_in_func_exercise.py b/keyword_arguments_in_func_exercise.py new file mode 100644 index 0000000..929a394 --- /dev/null +++ b/keyword_arguments_in_func_exercise.py @@ -0,0 +1,18 @@ +def apply_discount(price, discount=0.05): + discounted_price = price * (1 - discount) + return discounted_price + +def apply_tax(price, tax=0.07): + price_with_tax = price * (1 + tax) + return price_with_tax + +def calculate_total(price, discount=0.05, tax=0.07): + discounted_price = apply_discount(price, discount) + discounted_price_with_tax = apply_tax(discounted_price, tax) + return discounted_price_with_tax + +total_price_with_defaults = calculate_total(120) +total_price_with_custom_values = calculate_total(100, discount=0.10, tax=0.08) + +print(f"Total cost with default discount and tax: ${total_price_with_defaults}") +print(f"Total cost with custom discount and tax: ${total_price_with_custom_values}") \ No newline at end of file diff --git a/keyword_arguments_in_func_solution.py b/keyword_arguments_in_func_solution.py new file mode 100644 index 0000000..ec84ddf --- /dev/null +++ b/keyword_arguments_in_func_solution.py @@ -0,0 +1,28 @@ +# Task 1: Define a function to apply a discount with a default discount value of 5% +def apply_discount(price, discount=0.05): + # Calculate and return the discounted price + return price * (1 - discount) + +# Task 2: Define a function to apply tax with a default tax rate of 7% +def apply_tax(price, tax=0.07): + # Calculate and return the price with tax + return price * (1 + tax) + +# Task 3: Define a function to calculate the total price by applying both discount and tax +def calculate_total(price, discount=0.05, tax=0.07): + # Apply the discount first + discounted_price = apply_discount(price, discount) + + # Apply tax on the discounted price + final_price = apply_tax(discounted_price, tax) + + # Return the final total price + return final_price + +# Task 4: Call `calculate_total` using only the default discount and tax values +total_price_default = calculate_total(120) +print(f"Total cost with default discount and tax: ${total_price_default}") + +# Task 5: Call `calculate_total` with a custom discount of 10% and a custom tax of 8% +total_price_custom = calculate_total(100, discount=0.10, tax=0.08) +print(f"Total cost with custom discount and tax: ${total_price_custom}") \ No newline at end of file diff --git a/keyword_arguments_in_funcs.py b/keyword_arguments_in_funcs.py new file mode 100644 index 0000000..92b52fe --- /dev/null +++ b/keyword_arguments_in_funcs.py @@ -0,0 +1,8 @@ +# Function where `tax` has a default value +def calculate_total(price, discount, tax=0.05): + total = price * (1 + tax) * (1 - discount) + return total + +# Calling the function using keyword arguments +total_cost = calculate_total(price=100, discount=0.15) +print(f"Total cost after applying discount: ${total_cost}") \ No newline at end of file diff --git a/lambda_funcs_with_built-ins.py b/lambda_funcs_with_built-ins.py new file mode 100644 index 0000000..c78e17c --- /dev/null +++ b/lambda_funcs_with_built-ins.py @@ -0,0 +1,46 @@ +numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + +# Using a lambda function to filter out odd numbers +even_numbers = filter(lambda x: x % 2 == 0, numbers) + +# Convert the filter object to a list +even_numbers_list = list(even_numbers) +print(even_numbers_list) + + +tuples = [(1, 'banana'), (2, 'apple'), (3, 'orange'), (4, 'grape')] + +# Using a lambda function to sort a list of tuples in descending order by the second element +sorted_tuples = sorted(tuples, key=lambda x: x[1], reverse=True) +print(sorted_tuples) + + +# Using a lambda function to sort a list of tuples in ascending order by the second element +sorted_tuples = sorted(tuples, key=lambda x: x[1], reverse=False) +print(sorted_tuples) + + +# Using a lambda function to sort a list of tuples in descending order by the first element +sorted_tuples = sorted(tuples, key=lambda x: x[0], reverse=True) +print(sorted_tuples) + + +# Step 1: Define the list of books +books = [ + {"title": "Harry Potter and the Deathly Hallows", "pages": 640}, + {"title": "Rich Dad Poor Dad", "pages": 336}, + {"title": "The Great Gatsby", "pages": 160}, + {"title": "The Hobbit", "pages": 400} +] + +# Step 2: Create a custom function +def has_many_pages(book, min_pages=350): + """Check if the book has more than min_pages.""" + return book["pages"] > min_pages + +# Step 3: Use filter() with the custom function +filtered_books = filter(lambda book: has_many_pages(book), books) + +# Convert the filter object to a list and print +filtered_books_list = list(filtered_books) +print(filtered_books_list) diff --git a/lambda_with_lists.py b/lambda_with_lists.py new file mode 100644 index 0000000..c11d7a2 --- /dev/null +++ b/lambda_with_lists.py @@ -0,0 +1,10 @@ +def apply_func(func, list_of_lists): + return [func(*args) for args in zip(*list_of_lists)] + +# Example usage: +if __name__ == "__main__": + list1 = [1, 2, 3] + list2 = [4, 5, 6] + result = apply_func(lambda x, y: x + y, [list1, list2]) + print(result) + diff --git a/layers.py b/layers.py new file mode 100644 index 0000000..dee2463 --- /dev/null +++ b/layers.py @@ -0,0 +1,46 @@ +import numpy as np + +np.random.seed(10) + + +class ReLU: + def __call__(self, x): + return np.maximum(0, x) + + def derivative(self, x): + return (x > 0).astype(float) + + +class Sigmoid: + def __call__(self, x): + return 1 / (1 + np.exp(-x)) + + def derivative(self, x): + sig = self.__call__(x) + return sig * (1 - sig) + + +class Layer: + def __init__(self, n_inputs, n_neurons, activation_function): + self.inputs = np.zeros((n_inputs, 1)) + self.outputs = np.zeros((n_neurons, 1)) + self.weights = np.random.uniform(-1, 1, (n_neurons, n_inputs)) + self.biases = np.random.uniform(-1, 1, (n_neurons, 1)) + self.activation = activation_function + + def forward(self, inputs): + self.inputs = np.array(inputs).reshape(-1, 1) + self.outputs = np.dot(self.weights, self.inputs) + self.biases + return self.activation(self.outputs) + + +relu = ReLU() +sigmoid = Sigmoid() + +input_size = 2 +hidden_size = 3 +output_size = 1 + +hidden_1 = Layer(input_size, hidden_size, relu) +hidden_2 = Layer(hidden_size, hidden_size, relu) +output_layer = Layer(hidden_size, output_size, sigmoid) diff --git a/layers.py.py b/layers.py.py new file mode 100644 index 0000000..dee2463 --- /dev/null +++ b/layers.py.py @@ -0,0 +1,46 @@ +import numpy as np + +np.random.seed(10) + + +class ReLU: + def __call__(self, x): + return np.maximum(0, x) + + def derivative(self, x): + return (x > 0).astype(float) + + +class Sigmoid: + def __call__(self, x): + return 1 / (1 + np.exp(-x)) + + def derivative(self, x): + sig = self.__call__(x) + return sig * (1 - sig) + + +class Layer: + def __init__(self, n_inputs, n_neurons, activation_function): + self.inputs = np.zeros((n_inputs, 1)) + self.outputs = np.zeros((n_neurons, 1)) + self.weights = np.random.uniform(-1, 1, (n_neurons, n_inputs)) + self.biases = np.random.uniform(-1, 1, (n_neurons, 1)) + self.activation = activation_function + + def forward(self, inputs): + self.inputs = np.array(inputs).reshape(-1, 1) + self.outputs = np.dot(self.weights, self.inputs) + self.biases + return self.activation(self.outputs) + + +relu = ReLU() +sigmoid = Sigmoid() + +input_size = 2 +hidden_size = 3 +output_size = 1 + +hidden_1 = Layer(input_size, hidden_size, relu) +hidden_2 = Layer(hidden_size, hidden_size, relu) +output_layer = Layer(hidden_size, output_size, sigmoid) diff --git a/len.py b/len.py new file mode 100644 index 0000000..2eaa623 --- /dev/null +++ b/len.py @@ -0,0 +1,4 @@ +cars = ["audi", "BMW", "Toyota", "Fiat"] +print(f"{len(cars)}") + + diff --git a/linear_algebra.py b/linear_algebra.py new file mode 100644 index 0000000..d96ca97 --- /dev/null +++ b/linear_algebra.py @@ -0,0 +1,59 @@ +import numpy as np +""" +This script demonstrates basic linear algebra operations using NumPy, including: +1. Matrix transposition. +2. Dot product of vectors using both np.dot() and the @ operator. +3. Matrix multiplication using both np.dot() and the @ operator. +4. Calculation of weighted final scores for students based on exam scores and subject coefficients. +Sections: +- Matrix and vector creation and display. +- Transposing matrices. +- Dot product and matrix multiplication. +- Application example: computing weighted final scores for students. +Variables: +- matrix: 2D NumPy array representing a matrix. +- transposed_matrix: Transposed version of 'matrix'. +- vector_1, vector_2: 1D NumPy arrays representing vectors. +- matrix_1, matrix_2: 2D NumPy arrays for matrix multiplication. +- exams_scores: 2D NumPy array of students' exam scores. +- coefficients: 1D NumPy array of subject weights. +- final_scores: 1D NumPy array of weighted final scores for each student. +""" + +matrix = np.array([[1, 2, 3], [4, 5, 6]]) +print(f'Original matrix:\n{matrix}') +# Transposing a matrix +transposed_matrix = matrix.T +print(f'\nTransposed matrix:\n{transposed_matrix}') + + +vector_1 = np.array([1, 2, 3]) +print(f'\nVector 1: {vector_1}') +vector_2 = np.array([4, 5, 6]) +print(f'Vector 2: {vector_2}') +# Dot product using the dot() function +print(f'\nDot product (dot function): {np.dot(vector_1, vector_2)}') +# Dot product using the @ operator +print(f'Dot product (@ operator): {vector_1 @ vector_2}') +matrix_1 = np.array([[1, 2, 3], [4, 5, 6]]) +print(f'\nMatrix 1:\n{matrix_1}') +matrix_2 = np.array([[7, 10], [8, 11], [9, 12]]) +print(f'\nMatrix 2:\n{matrix_2}') +# Matrix multiplication using the dot() function +print(f'\nMatrix multiplication (dot function):\n{np.dot(matrix_1, matrix_2)}') +# Matrix multiplication using the @ operator +print(f'\nMatrix multiplication (@ operator):\n{matrix_1 @ matrix_2}') + + +# Task: Simulated exams scores of three students from three subjects +exams_scores = np.array([[100, 82, 95], [56, 70, 90], [45, 98, 66]]) +print +coefficients = np.array([0.5, 0.3, 0.2]) +print(f'\nExams scores:\n{exams_scores}') +print(f'Coefficients:\n{coefficients}') +# Calculate the dot product between exam_scores and coefficients +final_scores = np.dot(exams_scores, coefficients) +print(f'\nFinal scores (dot function):\n{final_scores}') + +final_scores = (exams_scores @ coefficients) +print(f'\nFinal scores (@ operator):\n{final_scores}') \ No newline at end of file diff --git a/magic_number.py b/magic_number.py new file mode 100644 index 0000000..df0bf46 --- /dev/null +++ b/magic_number.py @@ -0,0 +1,4 @@ +answer = 17 +if answer != 42: + print('That is not the correct answer. Please try again!') + diff --git a/magicians.py b/magicians.py new file mode 100644 index 0000000..655d030 --- /dev/null +++ b/magicians.py @@ -0,0 +1,6 @@ +magicians = ["david", "alice", "carolina"] +for magician in magicians: + #print(magician) + print(f"{magician.title()}, that was a great trick!") + print(f"I can't wait to see your next trick, {magician.title()}. \n") +print("Thank you, everyone, that was a great magic show!") \ No newline at end of file diff --git a/many_users.py b/many_users.py new file mode 100644 index 0000000..3338b95 --- /dev/null +++ b/many_users.py @@ -0,0 +1,26 @@ +users = { + 'aeinstein': { + 'first': 'albert', + 'last': 'einstein', + 'location': 'princeton', + }, + + 'mcurie': { + 'first': 'marie', + 'last': 'curie', + 'location': 'paris', + }, + + 'datapioneer': { + 'first': 'Dan', + 'last': 'Calloway', + 'location': 'Asheville', + }, +} + +for username, user_info in users.items(): + print(f"\nUsername: {username}") + full_name = f"{user_info['first']} {user_info['last']}" + location = user_info['location'] + print(f"\tFull Name: {full_name.title()}") + print(f"\tLocation: {location.title()}") \ No newline at end of file diff --git a/matrix_class.py b/matrix_class.py new file mode 100644 index 0000000..e7a101e --- /dev/null +++ b/matrix_class.py @@ -0,0 +1,73 @@ +import numpy as np + +class Matrix: + def __init__(self, rows, cols): + self.rows = rows + self.cols = cols + self.data = [[0] * cols for _ in range(rows)] + + def set_value(self, row, col, value): + if 0 <= row < self.rows and 0 <= col < self.cols: + self.data[row][col] = value + else: + raise IndexError("Index out of bounds") + + def get_value(self, row, col): + if 0 <= row < self.rows and 0 <= col < self.cols: + return self.data[row][col] + else: + raise IndexError("Index out of bounds") + + def __str__(self): + return '\n'.join([' '.join(map(str, row)) for row in self.data]) + + def __mul__(self, other): + if self.cols != other.rows: + raise ValueError("Cannot multiply: incompatible dimensions") + result = Matrix(self.rows, other.cols) + for i in range(self.rows): + for j in range(other.cols): + for k in range(self.cols): + result.data[i][j] += self.data[i][k] * other.data[k][j] + return result + + +myMatrix = Matrix(3, 4) +myOtherMatrix = Matrix(4, 3) + # This will raise an error since multiplication is not defined +multMatrix = myMatrix * myOtherMatrix +print(multMatrix) +# Output: 1 0 0 0 +# 0 2 0 0 +# 0 0 3 0 + +matrix_2d = np.full((3, 3), 5) +print(f'3x3 matrix filled with 5:\n{matrix_2d}') + +# Create a 5x5 identity matrix +matrix_identity = np.eye(5) +print(f'5x5 identity matrix:\n{matrix_identity}') + +#create a 5x1 column vector +column_vector = np.full((5, 1), 3) +print(f'5x1 column vector:\n{column_vector}') + +def __multiply__(matrix1, matrix2): + return matrix1 * matrix2 +# Creating a 2D matrix using the Matrix class +myMatrix = Matrix(2, 2) +# Setting values in the matrix +myMatrix.set_value(0, 0, 1) +myMatrix.set_value(0, 1, 4) +myMatrix.set_value(1, 0, -3) +myMatrix.set_value(1, 1, 2) + +myOtherMatrix = Matrix(2, 2) +myOtherMatrix.set_value(0, 0, -5) +myOtherMatrix.set_value(0, 1, 6) +myOtherMatrix.set_value(1, 0, 7) +myOtherMatrix.set_value(1, 1, -8) + +# Example usage of the Matrix multiply class +result = __multiply__(myMatrix, myOtherMatrix) +print(f'Result of multiplying myMatrix and myOtherMatrix:\n{result}') diff --git a/merge_arrays.py b/merge_arrays.py new file mode 100644 index 0000000..cb7da07 --- /dev/null +++ b/merge_arrays.py @@ -0,0 +1,13 @@ +def merge_arrays(arr1, arr2): + # 1. Merge the two arrays + # 2. Remove duplicates + # 3. Sort the list in ascending order + return sorted(set(arr1 + arr2)) + + +a = list(range(0, 10, 2)) +b = list(range(2, 21, 3)) +print(a) +print(b) +print(merge_arrays(a, b)) + diff --git a/modify_data_structure.py b/modify_data_structure.py new file mode 100644 index 0000000..12d057d --- /dev/null +++ b/modify_data_structure.py @@ -0,0 +1,25 @@ +# Define the function that adjusts inventory levels +def update_inventory(inventory, items_sold): + # Iterate over each item in the dictionary + for product, quantity_sold in items_sold.items(): + # Decrease the inventory by the quantity sold for each product + inventory[product] -= quantity_sold + +# Inventory dictionary +inventory = { + "apples": 50, + "bananas": 75, + "oranges": 100 +} + +# Items sold dictionary +items_sold = { + "apples": 5, + "oranges": 15 +} + +# Update the inventory based on items sold +update_inventory(inventory, items_sold) + +# Display the updated inventory +print("Updated inventory:", inventory) \ No newline at end of file diff --git a/modify_global_var_in_func.py b/modify_global_var_in_func.py new file mode 100644 index 0000000..d37d93d --- /dev/null +++ b/modify_global_var_in_func.py @@ -0,0 +1,8 @@ +global_var = 10 + +def modify_global(): + global global_var + global_var += 5 + +modify_global() +print("Modified global variable:", global_var) \ No newline at end of file diff --git a/modifying_a_tuple.py b/modifying_a_tuple.py new file mode 100644 index 0000000..e499aa0 --- /dev/null +++ b/modifying_a_tuple.py @@ -0,0 +1,11 @@ +dimensions = (200, 50) +print("Original dimensions:") +for dimension in dimensions: + print(dimension) + +dimensions = (400, 50) +print("\nModified dimensions") +for dimension in dimensions: + print(dimension) + + \ No newline at end of file diff --git a/motorcycles.py b/motorcycles.py new file mode 100644 index 0000000..2125928 --- /dev/null +++ b/motorcycles.py @@ -0,0 +1,75 @@ +# creating a list of motorcycles, then printing the list + +#motorcycles = ['honda', 'yamaha', 'suzuki'] +#print(motorcycles) + +# printing the first element in the list + +#motorcycles[0] = 'ducati' +#print(motorcycles) + +# appending a new item to the list + +#motorcycles.append('ducati') +#print(motorcycles) + +# starting with an empty list, then adding to it using a series of append +# statements + +#motorcycles = [] +#motorcycles.append('honda') +#motorcycles.append('yamaha') +#motorcycles.append('suzuki') +#print(motorcycles) + +# inserting an element at the beginning of a list + +#motorcycles = ['honda', 'yamaha', 'suzuki'] +#motorcycles.insert(0, 'ducati') +#print(motorcycles) + +# deleting an element from a list; in the example below, we're deleting the 2nd element from the list of motorcycles + +#motorcycles = ['honda', 'yamaha', 'suzuki'] +#del motorcycles[1] +#print(motorcycles) + +# popping an element from the end of a list, then being able to use that element afterwards + +#motorcycles = ['honda', 'yamaha', 'suzuki'] +#print(motorcycles) +#popped_motorcycles = motorcycles.pop() +#print(popped_motorcycles) + +# printing the last-owned motorcycle as a statement + +#motorcycles = ['honda', 'yamaha', 'suzuki'] +#last_owned = motorcycles.pop() +#print(f"The last motorcycle I owned was a {last_owned}.") + + +# printing the first-owned motorcycle as a statement + +#motorcycles = ['honda', 'yamaha', 'suzuki'] +#first_owned = motorcycles.pop(0) +#print(f"The first motorcycle I owned was a {first_owned}.") + +# removing an item from a list based on its value rather than its position + +#motorcycles = ['honda', 'yamaha', 'ducati', 'suzuki'] +#print(motorcycles) +#motorcycles.remove('ducati') +#print(motorcycles) + +# printing a statement about a particular element of a motorcycle list that's too expensive for the owner + +motorcycles = ['honda', 'yamaha', 'ducati', 'suzuki'] +print(motorcycles) +too_expensive = 'ducati' +motorcycles.remove(too_expensive) +print(motorcycles) +print(f"\nThe {too_expensive.title()} is just too expensive for me.") + + + + diff --git a/mult.py b/mult.py new file mode 100644 index 0000000..842af4a --- /dev/null +++ b/mult.py @@ -0,0 +1,25 @@ +# Multiprocessing: Sharing data between processes (a Value or Array memory share must be created as processes do not share data by default + +from multiprocessing import Process, Value, Array, Lock +import os +import time + +def add_100(number, lock): + for _ in range(100): + time.sleep(0.01) + with lock: + number.value += 1 + print(f'Process {os.getpid()} has finished execution.') + +if __name__ == "__main__": + lock = Lock() + shared_number = Value('i', 0) + + print('Number at the beginning is: ', shared_number.value) + p1 = Process(target=add_100, args=(shared_number, lock)) + p2 = Process(target=add_100, args=(shared_number, lock)) + p1.start() + p2.start() + p1.join() + p2.join() + print('Number at the end is: ', shared_number.value) \ No newline at end of file diff --git a/mult_array.py b/mult_array.py new file mode 100644 index 0000000..efe429d --- /dev/null +++ b/mult_array.py @@ -0,0 +1,25 @@ +# Multiprocessing: Sharing data between processes (a Value or Array memory share must be created as processes do not share data by default) +from multiprocessing import Process, Value, Array, Lock +import os +import time + +def add_100(numbers, lock): + for _ in range(100): + time.sleep(0.01) + for i in range(len(numbers)): + with lock: + numbers[i] += 1 + print(f'Process {os.getpid()} has finished execution.') + +if __name__ == "__main__": + lock = Lock() + shared_array = Array('d', [0.0, 100.0, 200.0, 300.0, 400.0]) + + print('Array at the beginning is: ', list(shared_array)) + p1 = Process(target=add_100, args=(shared_array, lock)) + p2 = Process(target=add_100, args=(shared_array, lock)) + p1.start() + p2.start() + p1.join() + p2.join() + print('Array at the end is: ', list(shared_array)) \ No newline at end of file diff --git a/mult_with_pool.py b/mult_with_pool.py new file mode 100644 index 0000000..1da34af --- /dev/null +++ b/mult_with_pool.py @@ -0,0 +1,17 @@ +# Multiprocessing: Sharing data between processes (a Value or Array memory share must be created as processes do not share data by default) +from multiprocessing import Pool + +def cube(number): + return number * number * number + + +if __name__ == "__main__": + + # pool methods most often used: map, apply, close, join + pool = Pool() + + numbers = range(21) + results = pool.map(cube, numbers) + pool.close() + pool.join() + print('Cubed results: ', results) diff --git a/mult_with_queue.py b/mult_with_queue.py new file mode 100644 index 0000000..b3b6819 --- /dev/null +++ b/mult_with_queue.py @@ -0,0 +1,30 @@ +# Multiprocessing: Sharing data between processes (a Value or Array memory share must be created as processes do not share data by default) +from multiprocessing import Process, Value, Array, Lock +from multiprocessing import Queue +import os +import time + +def add_100(numbers, lock, queue): + for _ in range(100): + time.sleep(0.01) + for i in range(len(numbers)): + with lock: + numbers[i] += 1 + queue.put(list(numbers)) + print(f'Process {os.getpid()} has finished execution.') + +if __name__ == "__main__": + lock = Lock() + shared_array = Array('d', [0.0, 100.0, 200.0, 300.0, 400.0]) + queue = Queue() + + print('Array at the beginning is: ', list(shared_array)) + p1 = Process(target=add_100, args=(shared_array, lock, queue)) + p2 = Process(target=add_100, args=(shared_array, lock, queue)) + p1.start() + p2.start() + p1.join() + p2.join() + print('Array at the end is: ', list(shared_array)) + while not queue.empty(): + print('Process output: ', queue.get()) \ No newline at end of file diff --git a/multi-layer-perceptron.py b/multi-layer-perceptron.py new file mode 100644 index 0000000..4ac043c --- /dev/null +++ b/multi-layer-perceptron.py @@ -0,0 +1,56 @@ +import numpy as np +import os + +from activations import relu, sigmoid + +# Fix the seed for reproducibility +np.random.seed(10) + +class Layer: + def __init__(self, n_inputs, n_neurons, activation_function): + self.inputs = np.zeros((n_inputs, 1)) + self.outputs = np.zeros((n_neurons, 1)) + # 1. Initialize the weight matrix and the bias vector with random values + self.weights = np.random.uniform(-1, 1, (n_neurons, n_inputs)) + self.biases = np.random.uniform(-1, 1, (n_neurons, 1)) + self.activation = activation_function + + def forward(self, inputs): + self.inputs = np.array(inputs).reshape(-1, 1) + # 2. Compute the raw output values of the neurons + self.outputs = np.dot(self.weights, self.inputs) + self.biases + # 3. Apply the activation function + return self.activation(self.outputs) + +class Perceptron: + def __init__(self, layers): + self.layers = layers + +input_size = 2 +hidden_size = 6 +output_size = 1 + + +# 4. Define three layers: 2 hidden layers and 1 output layer +hidden_1 = Layer(input_size, hidden_size, relu) +hidden_2 = Layer(hidden_size, hidden_size, relu) +output_layer = Layer(hidden_size, output_size, sigmoid) + +layers = [hidden_1, hidden_2, output_layer] +perceptron = Perceptron(layers) + +print("Weights of the third neuron in the second hidden layer:") +print(np.round(perceptron.layers[1].weights[2], 2)) + +print("Weights of the neuron in the output layer:") +print(np.round(perceptron.layers[2].weights[0], 2)) + +''' +How it works: +# The perceptron consists of multiple layers, each with its own weights and biases. The forward method computes the output of each +# layer by applying the activation function to the weighted sum of inputs. The weights and biases are initialized randomly, and +# the perceptron can be used to process inputs through its layers. +# The output of the second hidden layer and the output layer can be accessed through the perceptron's layers attribute. +# The weights of the third neuron in the second hidden layer and the output layer are printed, showing how the perceptron is structured. + +''' \ No newline at end of file diff --git a/multi_layer_network.py b/multi_layer_network.py new file mode 100644 index 0000000..55ad550 --- /dev/null +++ b/multi_layer_network.py @@ -0,0 +1,27 @@ +import numpy as np +import os +os.system('wget https://codefinity-content-media.s3.eu-west-1.amazonaws.com/f9fc718f-c98b-470d-ba78-d84ef16ba45f/section_2/layers.py 2>/dev/null') +from layers import hidden_1, hidden_2, output_layer + +# Fix the seed of the "random" library, so it will be easier to test our code +np.random.seed(10) + +class Perceptron: + def __init__(self, layers): + self.layers = layers + + def forward(self, inputs): + x = inputs + # 1. Iterate over the layers + for layer in self.layers: + # 2. Pass x layer by layer + x = layer.forward(x) + # 3. Return the result + return x + +layers = [hidden_1, hidden_2, output_layer] +perceptron = Perceptron(layers) +# Testing the perceptron with two inputs: 1 and 0 +inputs = [1, 0] +print(f'Inputs: {inputs}') +print(f'Outputs: {perceptron.forward(inputs)[0, 0]:.2f}') \ No newline at end of file diff --git a/multiple_aliens.py b/multiple_aliens.py new file mode 100644 index 0000000..3c63788 --- /dev/null +++ b/multiple_aliens.py @@ -0,0 +1,14 @@ +# Make an empty list for storing aliens +aliens = [] +# Make 30 green aliens +for alien_number in range(30): + new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'} + aliens.append(new_alien) + # Show the first 5 aliens +for alien in aliens[:5]: + print(alien) +print('...') + +# Show how many aliens have been created +print(f"\nThe total number of aliens is {len(aliens)}") + diff --git a/multiple_aliens_modified.py b/multiple_aliens_modified.py new file mode 100644 index 0000000..73de24b --- /dev/null +++ b/multiple_aliens_modified.py @@ -0,0 +1,27 @@ +# Make an empty list for storing aliens +aliens = [] +# Make 30 green aliens +for alien_number in range(30): + new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'} + aliens.append(new_alien) +# Change the characteristics of green aliens +for alien in aliens[:3]: + if alien['color'] == 'green': + alien['color'] = 'yellow' + alien['speed'] = 'medium' + alien['points'] = 10 +for alien in aliens[0:3]: + if alien['color'] == 'green': + alien['color'] = 'yellow' + alien['speed'] = 'medium' + alien['points'] = 10 + elif alien['color'] == 'yellow': + alien['color'] = 'red' + alien['speed'] = 'fast' + alien['points'] = 15 + +# Show the first 5 aliens +for alien in aliens[:5]: + print(alien) + + \ No newline at end of file diff --git a/myCode_1.py b/myCode_1.py new file mode 100644 index 0000000..10bc4cf --- /dev/null +++ b/myCode_1.py @@ -0,0 +1,26 @@ +# Enter a sentence containing only letters of the alphabet and numbers 0-9 and output the morse code equivalent. + +class MorseCode + morse_code: (text) -> + morse_code_map = + a: '.-', b: '-...', c: '-.-.', d: '-..', e: '.' + f: '..-.', g: '--.', h: '....', i: '..', j: '.---' + k: '-.-', l: '.-..', m: '--', n: '-.', o: '---' + p: '.--.', q: '--.-', r: '.-.', s: '...', t: '-' + u: '..-', v: '...-', w: '.--', x: '-..-', y: '-.--' + z: '--..' + '0': '-----', '1': '.----', '2': '..---', '3': '...--' + '4': '....-', '5': '.....', '6': '-....', '7': '--...' + '8': '---..', '9': '----.' + result = [] + for char in text.toLowerCase() + if morse_code_map[char]? + result.push morse_code_map[char] + else if char is ' ' + result.push ' / ' + result.join '' + +s = new MorseCode() +console.log s.morse_code "To be or not to be" + + \ No newline at end of file diff --git a/myCode_2.py b/myCode_2.py new file mode 100644 index 0000000..fdcc9b2 --- /dev/null +++ b/myCode_2.py @@ -0,0 +1,21 @@ +""" +Translate a string of text: letter a becomes z, b becomes y, ..., z becomes a. +""" + +class Translate: + def translation(self, text: str) -> str: + # Create translation table for a-z + import string + table = str.maketrans( + string.ascii_lowercase, + string.ascii_lowercase[::-1] + ) + return text.translate(table) + +# Example usage +if __name__ == "__main__": + t = Translate() + sentence = "Tobeornottobethatisthequestion" + print(t.translation("sentence")) # Output: zyxcba + + \ No newline at end of file diff --git a/name.py b/name.py new file mode 100644 index 0000000..3e77c01 --- /dev/null +++ b/name.py @@ -0,0 +1,7 @@ +name = "ada lovelace" +print(name.title()) + +print(name.upper()) + +print(name.lower()) + diff --git a/name_case.py b/name_case.py new file mode 100644 index 0000000..f3a0b2a --- /dev/null +++ b/name_case.py @@ -0,0 +1,5 @@ +name = "albert einstein" +print(name.upper()) +print(name.lower()) +print(name.title()) + diff --git a/nested_functions.py b/nested_functions.py new file mode 100644 index 0000000..1ca27e0 --- /dev/null +++ b/nested_functions.py @@ -0,0 +1,19 @@ + + +def count_percent(num1, num2, num3): + def inner(num): + return num * 30 / 100 + return (inner(num1), inner(num2), inner(num3)) + +print(count_percent(700, 300, 1000)) + + + +def apply_function(func, *args): + args = (x for x in args) + return map(func, args) + +result = apply_function(lambda x: x * 30 / 100, 700.7, 300.6, 1000.0, 2000.0, 3000.0, 3500.0) +list_result = list(result) +print(list_result) + diff --git a/neural_network_example.py b/neural_network_example.py new file mode 100644 index 0000000..2cbb9f5 --- /dev/null +++ b/neural_network_example.py @@ -0,0 +1,36 @@ +import torch +import torch.nn as nn +import torch.optim as optim + +# Synthetic input and target data +inputs = torch.randn(100, 10) # 100 samples, 10 features each +targets = torch.randn(100, 1) # 100 target values + +class TinyModel(nn.Module): + def __init__(self): + super().__init__() + self.layer1 = nn.Linear(10, 5) + self.relu = nn.ReLU() + self.layer2 = nn.Linear(5, 1) + + def forward(self, x): + x = self.layer1(x) + x = self.relu(x) + x = self.layer2(x) + return x + + model = TinyModel() +loss_fn = nn.MSELoss() +optimizer = optim.SGD(model.parameters(), lr=0.01) + +for epoch in range(200): + outputs = model(inputs) + loss = loss_fn(outputs, targets) + + optimizer.zero_grad() + loss.backward() + optimizer.step() + + if epoch % 20 == 0: + print(f"Epoch {epoch}: Loss = {loss.item():.4f}") + diff --git a/non_local_variables.py b/non_local_variables.py new file mode 100644 index 0000000..f1b4503 --- /dev/null +++ b/non_local_variables.py @@ -0,0 +1,12 @@ +def outer_function(): + outer_var = 10 + + def inner_function(): + nonlocal outer_var # Declare outer_var as nonlocal to modify it + outer_var += 5 + print("Nonlocal variable in inner function:", outer_var) + + inner_function() + print("Nonlocal variable in outer function:", outer_var) + +outer_function() \ No newline at end of file diff --git a/numpy_2D_matrices.py b/numpy_2D_matrices.py new file mode 100644 index 0000000..d7eb458 --- /dev/null +++ b/numpy_2D_matrices.py @@ -0,0 +1,7 @@ +import numpy as np +# Creating a 2x2 identity matrix +identity_matrix = np.eye(2) +print(f'2x2 identity matrix:\n{identity_matrix}') +# Creating a 4x3 matrix with np.eye() +rectangular_matrix = np.eye(4, 3, dtype=np.int8) +print(f'4x3 matrix:\n{rectangular_matrix}') \ No newline at end of file diff --git a/numpy_array.py b/numpy_array.py new file mode 100644 index 0000000..4736237 --- /dev/null +++ b/numpy_array.py @@ -0,0 +1,44 @@ +import numpy as np +# Creating an array from list +array_from_list = np.array([1, 2, 3, 2, 6, 1]) +# Creating an array from tuple +array_from_tuple = np.array((1, 2, 3, 2, 6, 1)) +print(f'Array from list: {array_from_list}') +print(f'Array from tuple: {array_from_tuple}') + +# Explicitly specifying data type +array_with_dtype = np.array([1.5, 2, 3, 2, 6, 1], dtype=float) +print(f'Array with specified dtype: {array_with_dtype.dtype.name}') + +#Higher dimensional arrays +array_2d = np.array([[1, 2, 3], [4, 5, 6]]) +print(f'2D Array:\n{array_2d}') + +#3d array +import numpy as np +# Creating a 3D array +array_3d = np.array([ + [[1, 2, 3], [4, 5, 6], [7, 8, 9]], + [[10, 11, 12], [13, 14, 15], [16, 17, 18]], + [[19, 20, 21], [22, 23, 24], [25, 26, 27]] +]) +print(f'3-dimensional array: \n{array_3d}') + +#arange function +array_arange = np.arange(10) # Creates an array with values from 0 to 9 +print(f'Array using arange: {array_arange}') + +array_arange = np.arange(0, 30, 3) # Creates an array with values from 0 to 29 with step 3 +print(f'Array using arange: {array_arange}') + +# Creating an array of integers from 0 to 10 exclusive with step=1 +array_1 = np.arange(11) +print(array_1) +# Creating an array of integers from 1 to 10 exclusive with step=1 +array_2 = np.arange(1, 11) +print(array_2) +# Creating an array of integers from 0 to 20 exclusive with step=2 +array_3 = np.arange(0, 21, 2) +print(array_3) + + diff --git a/numpy_linspace_function.py b/numpy_linspace_function.py new file mode 100644 index 0000000..d84f8cf --- /dev/null +++ b/numpy_linspace_function.py @@ -0,0 +1,27 @@ +import numpy as np +# Generating 5 equally spaced values between 0 and 1 (inclusive) +array_1 = np.linspace(0, 1, 5) +print('Example 1:', array_1) +# Generating 7 equally spaced values between -1 and 1 (inclusive) +array_2 = np.linspace(-1, 1, 7) +print('Example 2:', array_2) + +array_2 = np.linspace(-1, 1, 7) +print(f"Example 2:", {array_2.dtype.name}) + +#setting endpoint to False +array_3 = np.linspace(0, 1, 5, endpoint=False) + +# Generating 5 equally spaced values between 0 and 1 (inclusive) +array_inclusive = np.linspace(0, 1, 5) +print('Endpoint = True:', array_inclusive) +# Generating 5 equally spaced values between 0 and 1 (exclusive) +array_exclusive = np.linspace(0, 1, 5, endpoint=False) +print('Endpoint = False:', array_exclusive) + +# Create an array of even numbers from 2 to 21 exclusive +even_numbers = np.arange(2, 21, 2) +# Create an array of 10 equally spaced numbers between 5 and 6 exclusive +samples = np.linspace(5, 6, 10, endpoint=False) +print(even_numbers) +print(samples) \ No newline at end of file diff --git a/orbital.py b/orbital.py new file mode 100644 index 0000000..4d26eaf --- /dev/null +++ b/orbital.py @@ -0,0 +1,51 @@ +import numpy as np + +import matplotlib.pyplot as plt + + + +# Constants +G = 6.67430e-11 # Gravitational constant (m^3 kg^-1 s^-2) +M = 5.972e24 # Mass of Earth (kg) +R = 6.371e6 # Radius of Earth (m) + +# Initial conditions +r0 = R + 400e3 # Initial distance from Earth's center (400 km altitude) +v0 = np.sqrt(G * M / r0) # Circular orbit velocity + +# Simulation parameters +dt = 10 # Time step (s) +num_steps = 10000 + +# Arrays to store position +x = np.zeros(num_steps) +y = np.zeros(num_steps) +vx = np.zeros(num_steps) +vy = np.zeros(num_steps) + +# Initial position and velocity +x[0] = r0 +y[0] = 0 +vx[0] = 0 +vy[0] = v0 + +for i in range(1, num_steps): + r = np.sqrt(x[i-1]**2 + y[i-1]**2) + ax = -G * M * x[i-1] / r**3 + ay = -G * M * y[i-1] / r**3 + vx[i] = vx[i-1] + ax * dt + vy[i] = vy[i-1] + ay * dt + x[i] = x[i-1] + vx[i] * dt + y[i] = y[i-1] + vy[i] * dt + +# Plotting +plt.figure(figsize=(6,6)) +earth = plt.Circle((0, 0), R, color='b', alpha=0.3) +plt.gca().add_patch(earth) +plt.plot(x, y, label='Orbit') +plt.xlabel('x (m)') +plt.ylabel('y (m)') +plt.title('Orbital Mechanics Demonstration') +plt.axis('equal') +plt.legend() +plt.show() \ No newline at end of file diff --git a/packing-unpacking.py b/packing-unpacking.py new file mode 100644 index 0000000..60f22f0 --- /dev/null +++ b/packing-unpacking.py @@ -0,0 +1,7 @@ +# unpacking +a, b, c = (1, 2, 3) # a = 1, b = 2, c = 3 +print(f"a = {a}, b = {b}, c = {c}") + +# packing +a, b, *c = 1, 2, 3, 4, 5 # a = 1, b = 2, c = [3, 4, 5] +print(f"a = {a}, b = {b}, c = {c}") \ No newline at end of file diff --git a/packing.py b/packing.py new file mode 100644 index 0000000..bcf5997 --- /dev/null +++ b/packing.py @@ -0,0 +1,138 @@ +# string +a, b, c = "123" # a = "1", b = "2", c ="3" +# list +a, b, c = [1, 2, 3] # a = 1, b = 2, c = 3 +# range +a, b, c = range(3) # a = 0, b = 1, c = 2 +# set +a, b, c = {1, 2, 3} # a = 1, b = 2, c = 3 +a, b, c = {3, 2, 1} # a = 1, b = 2, c = 3 + +# dict +dict_num = {"one": 1, "two": 2, "three": 3} +a, b, c = dict_num # a = "one", b = "two", c = "three" +a, b, c = dict_num.values() # a = 1, b = 2, c = 3 +a, b, c = dict_num.items() # a = ("one", 1), b = ("two", 2), c = ("three", 3) + +# assignment to the list +[a, b, c] = 1, 2, 3 # a = 1, b = 2, c = 3 +[a, b, c] = "123" # a = "1", b = "2", c ="3" + +# Examples: + +my_tuple = ("Anna", 27, "Python Developer") + +name, age, career = my_tuple + +print(name, age, career) + +# Using starred variables +# *a, *b = 1, 2, 3, 4 # Error: Only one starred expression is allowed +a, *b = 1, 2, 3, 4 # a = 1, b = [2, 3, 4] +print(a, b) + +# *a, *b, *c = 1, 2, 3 # Error: Only one starred expression is allowed + +# Practice +# Unpacking a tuple +my_tuple = (1, 2, 3) +a, b, c = my_tuple # a = 1, b = 2, c = 3 +print(a, b, c) +# Unpacking a list + +my_list = [4, 5, 6] +d, e, f = my_list # d = 4, e = 5, f = 6 +print(d, e, f) + +# Unpacking a string +my_string = "abc" +x, y, z = my_string # x = "a", y = "b", z = "c" +print(x, y, z) + +# Unpacking a set +my_set = {7, 8, 9} +a, b, c = my_set # a = 7, b = 8, c = 9 +print(a, b, c) + +# Unpacking a dictionary values +my_dict = {"name": "John", "age": 30, "city": "New York"} +name, age, city = my_dict.values() +print(name, age, city) + +# Unpacking a dictionary items +my_dict = {"name": "John", "age": 30, "city": "New York"} +name, age, city = my_dict.items() # name = ("name", "John"), age = ("age", 30), city = ("city", "New York") +print(name, age, city) + +# Unpacking a dictionary vaules into a list +name_list = [name[1], age[1], city[1]] +print(name_list) + +# Unpacking a dictionary values into a list using list comprehension +name_list = [name[1] for name in my_dict.items()] # Extracting names from the dictionary items +print(name_list) + +# Unpacking a dictionary items into a list +item_list = [item for item in my_dict.items()] +print(item_list) + +my_list = list(my_dict.items()) # Converting dictionary items to a list of tuples +print(my_list) + +my_list = list(my_dict.values()) # Converting dictionary values to a list +print(my_list) + +# Dropping unneeded variables +# Unpacking with an underscore to ignore variables +my_tuple = (1, 2, 3, 4) +a, b, _, d = my_tuple # a = 1, b = 2, d = 4 +print(a, b, d) + +# Unpacking with an underscore to ignore variables in a list +my_list = [5, 6, 7, 8] +e, f, _, g = my_list # e = 5, f = 6, g = 8 +print(e, f, g) + +# Unpacking with an underscore to ignore variables in a string +my_string = "xyz" +x, y, _ = my_string # x = "x", y = "y" +print(x, y) + +# Unpacking with an underscore to ignore variables in a set +my_set = {10, 11, 12} +a, b, _ = my_set # a = 10, b = 11 +print(a, b) + +# Unpacking with an underscore to ignore variables in a dictionary +my_dict = {"key1": "value1", "key2": "value2", "key3": "value3"} +key1, key2, _ = my_dict # key1 = "key1", key2 = "key2" +print(key1, key2) + +# Unpacking with an underscore to ignore variables in a dictionary values +my_dict = {"name": "Alice", "age": 25, "city": "Wonderland"} +name, age, _ = my_dict.values() # name = "Alice", age = 25 +print(name, age) + +# Unpacking with an underscore to ignore variables in a dictionary items +my_dict = {"name": "Bob", "age": 30, "city": "Atlantis"} +name, age, _ = my_dict.items() # name = ("name", "Bob"), age = ("age", 30) +print(name, age) + +# Using unpacking to create a new dictionary from an existing one +my_dict = {"name": "Bob", "age": 30, "city": "Atlantis"} +name, age, _ = my_dict.items() # name = ("name", "Bob"), age = ("age", 30) tuple +my_new_dict = {name[0]: name[1], age[0]: age[1]} # Creating a new dictionary +print(my_new_dict) + +# Using unpacking to create a new dictionary from an existing one using dict +my_dict = {"name": "Bob", "age": 30, "city": "Atlantis"} +name, age, _ = my_dict.items() # name = ("name", "Bob"), age = ("age", 30) tuple +my_new_dict = dict(name=name[1], age=age[1]) # Creating a new dictionary +print(my_new_dict) + + +a, *b, c = 1, 2, 3, 4, 5 # a = 1, b = [2, 3, 4], c = 5 +print(a, b, c) + +a, _, b, *_ = 1, 2, 3, 4, 5 # a = 1, b = 2, _ = 3, *_ = [4, 5] +print(f"a={a}, b={b}") diff --git a/personal_message.py b/personal_message.py new file mode 100644 index 0000000..99e9962 --- /dev/null +++ b/personal_message.py @@ -0,0 +1,2 @@ +name = "Eric" +print(f"Hello {name}, would you like to learn some python today?") \ No newline at end of file diff --git a/pizza.py b/pizza.py new file mode 100644 index 0000000..a1deb91 --- /dev/null +++ b/pizza.py @@ -0,0 +1,11 @@ +# Store information about a pizza being ordered +pizza = { + 'crust': 'thick', + 'toppings': ['mushrooms', 'extra cheese'], +} + +# Summarize the order +print(f"You ordered a {pizza['crust']}-crust pizza with the following toppings: ") +"with the following toppings:" +for topping in pizza['toppings']: + print(f"\t{topping}") diff --git a/players.py b/players.py new file mode 100644 index 0000000..502747f --- /dev/null +++ b/players.py @@ -0,0 +1,27 @@ +players = ['charles', 'martina', 'michael', 'florence', 'eli'] + +# slice the list beginning with the first index element through the 2nd index +# element; thus 3 elements + +#print(players[0:3]) + +# slice the list starting with index[0] and stopping at index[3] + +#print(players[:4]) + +# slice the list beginning at index[2] or 3rd element and ending at the end of +# the list + +#print(players[2:]) + +# if you want to slice the list and print the last 3 elements in the list, use +# this + +print(players[-3:]) + +# printing the first three players on my team in title case + +print("Here are the first three players on my team:") +for player in players[:3]: + print(player.title()) + diff --git a/playing_cards.py b/playing_cards.py new file mode 100644 index 0000000..f343d89 --- /dev/null +++ b/playing_cards.py @@ -0,0 +1,81 @@ +class Card: + def __init__(self, suit: str, rank: str) -> None: + self.suit = suit + self.rank = rank + + def __str__(self) -> str: + return f"{self.rank} of {self.suit}" + + def __repr__(self) -> str: + return f"Card(suit={self.suit}, rank={self.rank})" + + def __eq__(self, other): + if not isinstance(other, Card): + return NotImplemented + return (self.suit, self.rank) == (other.suit, other.rank) + + +class Deck: + def __init__(self) -> None: + self.cards = [] + suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] + ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace'] + for suit in suits: + for rank in ranks: + self.cards.append(Card(suit, rank)) + + def __str__(self) -> str: + return ', '.join(str(card) for card in self.cards) + + def __repr__(self) -> str: + return f"Deck(cards={self.cards})" + + def shuffle(self): + import random + random.shuffle(self.cards) + + def deal(self, num_cards: int) -> list[Card]: + if num_cards > len(self.cards): + raise ValueError("Not enough cards in the deck to deal.") + dealt_cards = self.cards[:num_cards] + self.cards = self.cards[num_cards:] + return dealt_cards + def remaining_cards(self) -> int: + return len(self.cards) + + +class Hand: + def __init__(self, cards: list[Card]) -> None: + self.cards = cards + + def __str__(self) -> str: + return ', '.join(str(card) for card in self.cards) + + def __repr__(self) -> str: + return f"Hand(cards={self.cards})" + + def add_card(self, card: Card): + self.cards.append(card) + + def clear(self): + self.cards.clear() + +# Example usage: +if __name__ == "__main__": + #print("Unshuffled deck of cards...") + deck = Deck() + #print(deck) + deck.shuffle() + #print("Shuffled deck:") + #print(deck) + dealt = deck.deal(5) + player1_hand = Hand(dealt) + print("Dealt cards:") + for card in player1_hand.cards: + print(card) + print(f"Remaining cards in the deck: {deck.remaining_cards()}") + + player1_hand.add_card(Card('Hearts', 'Ace')) + print("Player 1's hand after adding an Ace of Hearts:") + for card in player1_hand.cards: + print(card) diff --git a/poker.py b/poker.py new file mode 100644 index 0000000..978e2cb --- /dev/null +++ b/poker.py @@ -0,0 +1,66 @@ +import random + +SUITS = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] +RANKS = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] +RANK_VALUES = {rank: i for i, rank in enumerate(RANKS, 2)} + +def create_deck(): + return [(rank, suit) for suit in SUITS for rank in RANKS] + +def deal_hand(deck, num=5): + hand = random.sample(deck, num) + for card in hand: + deck.remove(card) + return hand + +def hand_rank(hand): + ranks = sorted([RANK_VALUES[card[0]] for card in hand], reverse=True) + suits = [card[1] for card in hand] + rank_counts = {r: ranks.count(r) for r in ranks} + is_flush = len(set(suits)) == 1 + is_straight = all(ranks[i] - 1 == ranks[i+1] for i in range(len(ranks)-1)) + counts = sorted(rank_counts.values(), reverse=True) + if is_straight and is_flush: + return (8, ranks) # Straight flush + elif counts[0] == 4: + return (7, ranks) # Four of a kind + elif counts[0] == 3 and counts[1] == 2: + return (6, ranks) # Full house + elif is_flush: + return (5, ranks) # Flush + elif is_straight: + return (4, ranks) # Straight + elif counts[0] == 3: + return (3, ranks) # Three of a kind + elif counts[0] == 2 and counts[1] == 2: + return (2, ranks) # Two pair + elif counts[0] == 2: + return (1, ranks) # One pair + else: + return (0, ranks) # High card + +def show_hand(hand): + return '\n '.join([f"{rank} of {suit}" for rank, suit in hand]) + +def main(): + deck = create_deck() + random.shuffle(deck) + player1 = deal_hand(deck) + player2 = deal_hand(deck) + print("Player 1's hand:\n", show_hand(player1)) + print() + print("Player 2's hand:\n", show_hand(player2)) + rank1 = hand_rank(player1) + rank2 = hand_rank(player2) + if rank1 > rank2: + print("Player 1 wins! with rank:", rank1) + print("Player 2 loses with rank:", rank2) + elif rank2 > rank1: + print("Player 2 wins! with rank:", rank2) + print("Player 1 loses with rank:", rank1) + else: + print("It's a tie!") + print("Both players have rank:", rank1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/practice_1.py b/practice_1.py new file mode 100644 index 0000000..2dbdc6c --- /dev/null +++ b/practice_1.py @@ -0,0 +1,62 @@ +class Math(object): + def sum (self, *args, **kargs) -> float: + result = sum(args) + return result + + def sub (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("sub requires at least two arguments") + result = args[0] - args[1] + return result + + def mult (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("mult requires at least two arguments") + result = args[0] * args[1] + return result + + def div (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("div requires at least two arguments") + result = args[0] / args[1] + return result + + def fdiv (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("fdiv requires at least two arguments") + result = args[0] // args[1] + return result + + def pow (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("pow requires at least two arguments") + result = args[0] ** args[1] + return result + + def mod (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("mod requires at least two arguments") + result = args[0] % args[1] + return result + + def avg (self, *args, **kargs) -> float: + if len(args) < 2: + raise ValueError("avg requires at least two arguments") + result = (sum(args)/len(args)) + return result + + + +s = Math() + +print(f"Sum: {s.sum(3.564, 92.335, 14.56):.2f}") +print(f"Product: {s.mult(8.56, 3.567):.2f}") +print(f"Difference: {s.sub(8.56, 3.567):.2f}") +print(f"Floor Division: {s.fdiv(8.56, 3.567):.2f}") +print(f"Power: {s.pow(8.56, 3.567):.2f}") +print(f"Mod: {s.mod(8.0, 3.0):.2f}") +print(f"Average: {s.avg(8.56, 3.567, 73.45, 10.778, 14.334, 56.789):.2f}") +print(f"Division: {s.div(8.56, 3.567):.2f}") + + +print(f"Average: {s.avg(2, 3, 4, 53, 6):.2f}") diff --git a/prime_numbers_over_an_interval.py b/prime_numbers_over_an_interval.py new file mode 100644 index 0000000..12d0c32 --- /dev/null +++ b/prime_numbers_over_an_interval.py @@ -0,0 +1,20 @@ +"""This program prints all prime numbers over a specified interval""" + +x, y = 2, 100 # defining the range + +# create a boolean list to mark primes, assume all are prime initially +primes = [True] * (y + 1) + +# 0 and 1 are not prime +primes[0], primes[1] = False, False + +# Sieve of Eratosthenes to mark non-primes +for i in range(2, int(y ** 0.5) + 1): + if primes[i]: + for j in range(i * i, y + 1, i): + primes[j] = False + +# collect primes in the range [x, y] +res = [i for i in range(x, y + 1) if primes[i]] +print(res if res else "No") +print ("the number of primes is: ", len(res)) diff --git a/product_revenues_exercise.py b/product_revenues_exercise.py new file mode 100644 index 0000000..202d29a --- /dev/null +++ b/product_revenues_exercise.py @@ -0,0 +1,21 @@ + # List of products, their prices, and the quantities sold +products = ["Bread", "Apples", "Oranges", "Bananas"] +prices = [0.50, 1.20, 2.50, 2.00] # price per item +quantities_sold = [150, 200, 100, 50] # number of items sold +def calculate_revenue(product_price, product_sold): + revenue = [] + for index in range(len(product_price)): + revenue.append(product_price[index] * product_sold[index]) + return revenue + +revenue = calculate_revenue(prices, quantities_sold) + +def formatted_output(products_list, revenue_list): + revenue_per_product = list(zip(products_list, revenue_list)) + sorted(revenue_per_product) + return revenue_per_product + +revenue_per_product = formatted_output(products, revenue) + +for product, rev in revenue_per_product: + print(f"{product} has total revenue of ${rev}") diff --git a/python-cheat-sheet.pdf b/python-cheat-sheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2b9903eb527a489625fcc9804af8500c61d2242 GIT binary patch literal 339604 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

^{gB{!J&Xn7+H*#DSn)c(#rL+p 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

1mZ6)(>f%CF0`g}o`;mRe2&a>W; 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 |A{hF= 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

o!v+r~90_5#A;HtNi)yk^^^y1v4$B)uvJ>1BaSg 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 C4cl)3 literal 0 HcmV?d00001 diff --git a/python_closures.py b/python_closures.py new file mode 100644 index 0000000..bc1e880 --- /dev/null +++ b/python_closures.py @@ -0,0 +1,17 @@ +def calculate_income(percent): + def annual_income(amount): + return amount * percent / 100 + return annual_income # function returned by outer function + +interest_rate_3 = calculate_income(3) # function assigned to the variable +interest_rate_7 = calculate_income(7) +interest_rate_10 = calculate_income(10) + +print(interest_rate_3(1500)) # 45.0 +print(interest_rate_3(2000)) # 60.0 +print(interest_rate_10(1500)) # 150.0 + +print(interest_rate_7(1500)) # 105.0 +print(interest_rate_7(2000)) # 140.0 +print(interest_rate_10(2000)) # 200.0 + \ No newline at end of file diff --git a/python_decorators.py b/python_decorators.py new file mode 100644 index 0000000..f66632e --- /dev/null +++ b/python_decorators.py @@ -0,0 +1,21 @@ +def decorator(func): + def wrapper(argument1, argument2): + print("Function starts executing") + result = func(argument1, argument2) + print("Function ends executing") + + return result + + return wrapper + + +def add(a, b): + print(f"Function add: {a} + {b}") + return a + b + + +add = decorator(add) + +print(add(14, 12)) +print(add(11, 28)) +print(add(33, 16)) \ No newline at end of file diff --git a/random_arrays.py b/random_arrays.py new file mode 100644 index 0000000..09d21d0 --- /dev/null +++ b/random_arrays.py @@ -0,0 +1,15 @@ +import numpy as np +# Generating a random integer from 0 to 3 exclusive +random_integer = np.random.randint(3) +print(random_integer) +# Generating a 1D array of random integers in [0, 5) with 4 elements +random_int_array = np.random.randint(5, size=4) +print(random_int_array) +# Generating a 1D array of random integers in [2, 5) with 4 elements +random_int_array_2 = np.random.randint(2, 5, size=4) +print(random_int_array_2) +# Generating a random 2D array of random integers in [1, 6) of shape 4x2 +random_int_matrix = np.random.randint(1, 6, size=(4, 2)) +print(random_int_matrix) + + diff --git a/random_arrays_2.py b/random_arrays_2.py new file mode 100644 index 0000000..a62486d --- /dev/null +++ b/random_arrays_2.py @@ -0,0 +1,20 @@ +import numpy as np +# Generating a random number +random_number = np.random.rand() +print(random_number) +# Generating a random 1D array with 5 elements +random_array = np.random.rand(5) +print(random_array) +# Generating a random 2D array (matrix) of shape 4x3 +random_matrix = np.random.rand(4, 3) +print(random_matrix) + +# Generate a 1D array of random floats in [0, 1) with 4 elements +random_floats_array = np.random.rand(4) +# Generate a 2D array of random floats in [0, 1) of shape 3x2 +random_floats_matrix = np.random.rand(3, 2) +# Generate a 2D array of random integers in [10, 21) of shape 3x2 +random_integers_matrix = np.random.randint(10, 21, size=(3, 2)) +print(random_floats_array) +print(random_floats_matrix) +print(random_integers_matrix) \ No newline at end of file diff --git a/reshape_array.py b/reshape_array.py new file mode 100644 index 0000000..73554fd --- /dev/null +++ b/reshape_array.py @@ -0,0 +1,37 @@ +import numpy as np +""" +This script demonstrates how to reshape NumPy arrays into different dimensions. +Functionality: +1. Creates a 1D NumPy array with values from 0 to 11. +2. Reshapes the 1D array into a 3x4 2D array and prints it. +3. Reshapes the same 1D array into a 2x2x3 3D array and prints it. +4. Creates another 1D NumPy array with values from 0 to 4. +5. Reshapes this array into a 2D column vector (shape: 5x1) and prints it. +Usage: +- Demonstrates the use of `np.arange` for array creation. +- Shows how to use the `reshape` method for changing array dimensions. +""" + +# Creating a 1D array from 0 to 11 inclusive +array = np.arange(12) +# Reshaping the array to a 3x4 2D array (matrix) +reshaped_array_2d = array.reshape(3, 4) +print(reshaped_array_2d) +# Reshaping the array to a 2x2x3 3D array +reshaped_array_3d = array.reshape(2, 2, 3) +print(reshaped_array_3d) + + +import numpy as np +# Creating a 1D array from 0 to 4 inclusive +array = np.arange(5) + +# Reshaping the array to a 2D array with one column +reshaped_array = array.reshape(-1, 1) +print(reshaped_array) + +array = np.arange(18) + +# Reshaping the array to a 2D array with three columns +reshaped_array = array.reshape(-1, 3) +print(reshaped_array) \ No newline at end of file diff --git a/single_node_neural_network.py b/single_node_neural_network.py new file mode 100644 index 0000000..35d54c2 --- /dev/null +++ b/single_node_neural_network.py @@ -0,0 +1,36 @@ +from ast import arg +import numpy as np # type: ignore + +# Fix the seed for reproducibility +np.random.seed(100) + +def sigmoid(z): + return 1 / (1 + np.exp(-z)) + +class Neuron: + def __init__(self, *args): + # 1. Initialize weights and bias with random values + self.weights = np.random.uniform(-1, 1, size=args[0]) + self.bias = np.random.uniform(-1, 1) + + def activate(self, inputs): + # 2. Compute the weighted sum using dot product and add bias + input_sum_with_bias = np.dot(inputs, self.weights) + self.bias + # 3. Apply the sigmoid activation function + output = sigmoid(input_sum_with_bias) + return output + +# Create a neuron with 6 inputs +neuron = Neuron(6) +# Generate inputs for the neuron +neuron_inputs = np.array([-0.5, 0.4, -0.8, 0.2, 0.1, -0.3]) +# Pass the inputs to the created neuron +neuron_output = neuron.activate(neuron_inputs) + +print(f'Output of the neuron is {neuron_output:.3f}') + +''' +How it works: +# The neuron takes any number of inputs, computes the weighted sum, applies the sigmoid function, and returns the output which is a value between 0 and 1. + +''' \ No newline at end of file diff --git a/sleeping_decorator.py b/sleeping_decorator.py new file mode 100644 index 0000000..92c2061 --- /dev/null +++ b/sleeping_decorator.py @@ -0,0 +1,18 @@ + +import time + +def sleep_decorator(seconds): + def decorator(func): + def wrapper(*args, **kwargs): + print(f"Sleeping for {seconds} seconds before executing '{func.__name__}'") + time.sleep(seconds) + return func(*args, **kwargs) + return wrapper + return decorator + +@sleep_decorator(5) +def my_function(): + print("Function executed!") + +# Usage +my_function() \ No newline at end of file diff --git a/slicing_1D_arrays.py b/slicing_1D_arrays.py new file mode 100644 index 0000000..50309a2 --- /dev/null +++ b/slicing_1D_arrays.py @@ -0,0 +1,31 @@ +import numpy as np + +array = np.array([5, 10, 2, 8, 9, 1, 0, 4]) +print(f'Initial array: {array}') +# Slicing from the element at index 2 to the element at index 4 exclusive +print(array[2:4]) +# Slicing from the first element to the element at index 5 exclusive +print(array[:5]) +# Slicing from the element at index 5 to the last element inclusive +print(array[5:]) + + + +#import numpy as np +# Initial array +array = np.array([5, 10, 2, 8, 9, 1, 0, 4]) +print(f'Initial array: {array}') +# Slicing from the first element to the last element inclusive with step=2 +print(array[::2]) +# Slicing from the element at index 4 to the element at index 2 exclusive (step=-1) +print(array[4:2:-1]) +# Slicing from the last element to the first element inclusive (reversed array) +print(array[::-1]) +# Slicing from the first element to the last inclusive (the same as our array) +print(array[:]) + +# Sales data for the past week (Monday to Sunday) +weekly_sales = np.array([150, 200, 170, 180, 160, 210, 190]) +# Create a slice of weekly_sales with every second day's sales starting from the second day +alternate_day_sales = weekly_sales[1::2] +print(alternate_day_sales) \ No newline at end of file diff --git a/sorted_arrays.py b/sorted_arrays.py new file mode 100644 index 0000000..116e189 --- /dev/null +++ b/sorted_arrays.py @@ -0,0 +1,16 @@ +import array +import numpy as np +array_1d = np.array([10, 2, 5, 1, 6, 5]) +array_1d_sorted = np.sort(array_1d, kind='quicksort') + +print("Unsorted 1D array:", array_1d) +print("Sorted 1D array (ascending):", array_1d_sorted) +print("Sorted 1D array (descending):", np.sort(array_1d)[::-1]) + +# Employee salaries +salaries = np.array([45000, 38000, 52000, 47000, 43000, 39000]) +print("Original salaries:", salaries) +# Sort the salaries in descending order +sorted_salaries = np.sort(salaries)[::-1] +# Print top 3 salaries +print("Top 3 salaries:", sorted_salaries[:3]) \ No newline at end of file diff --git a/sorting_2d_arrays.py b/sorting_2d_arrays.py new file mode 100644 index 0000000..1d62988 --- /dev/null +++ b/sorting_2d_arrays.py @@ -0,0 +1,24 @@ +import numpy as np +''' +array_2d = np.array([[2, 9, 3], [1, 6, 4], [5, 7, 8]]) +# Sorting a 2D array along axis 1 +print(np.sort(array_2d)) + +# Sorting a 2D array along axis 0 +print(np.sort(array_2d, axis=0)[::-1]) + +# Creating a 1D sorted array out of the elements of array_2d +print(np.sort(array_2d, axis=None)) +''' + +# Simulated exam scores for three students in three subjects +exam_scores = np.array([[75, 82, 90], [92, 88, 78], [60, 70, 85], [80, 95, 88], [70, 65, 80], [85, 90, 92]]) +# Create an array with every column sorted by scores in descending order +top_scores_subject = np.sort(exam_scores, axis=0)[::-1] +# Create a 1D array of all scores sorted in ascending order +sorted_scores = np.sort(exam_scores, axis=None) +print("Top scores by subject:") +print(top_scores_subject) +print("All scores sorted (ascending):") +print(sorted_scores) +print("Average score:", sum(sorted_scores) / len(sorted_scores)) # Length of the first dimension (number of rows) \ No newline at end of file diff --git a/square_numbers.py b/square_numbers.py new file mode 100644 index 0000000..1342c9f --- /dev/null +++ b/square_numbers.py @@ -0,0 +1,6 @@ +squares = [] +for value in range(1, 11): + #square = value ** 2 + squares.append(value ** 2) +print(squares) + diff --git a/square_numbers2.py b/square_numbers2.py new file mode 100644 index 0000000..60d29b8 --- /dev/null +++ b/square_numbers2.py @@ -0,0 +1,2 @@ +squares = [value ** 2 for value in range (1, 11)] +print(squares) \ No newline at end of file diff --git a/stripping_names.py b/stripping_names.py new file mode 100644 index 0000000..e6f6e0f --- /dev/null +++ b/stripping_names.py @@ -0,0 +1,6 @@ +name = "\t Benjamin Franklin \n" +print(name) +print(name.lstrip()) +print(name.rstrip()) +print(name.strip()) + diff --git a/temperature_conversion.py b/temperature_conversion.py new file mode 100644 index 0000000..d7daf8b --- /dev/null +++ b/temperature_conversion.py @@ -0,0 +1,21 @@ +#This program converts temperature from Fahrenheit to Celcius or Celcius to Fahrenheit depending on the input from the user + +unit = input("Is this temperature in Celcius or Fahrenheit (C/F)?: ") +temp = float(input("Please enter a temperature: ")) +if unit == "C": + temp = round((temp * 1.8)+32, 2) + print(f"The temperature in degrees F is {temp}F") +elif unit == "F": + temp = round((temp - 32) * 5 / 9, 2) + print(f"The temperature in degrees C is {temp}C") +else: + print(f"{unit} is an invalid unit of measurement.") + + + + + + + + + diff --git a/test.py b/test.py new file mode 100644 index 0000000..3a26e4b --- /dev/null +++ b/test.py @@ -0,0 +1,24 @@ +import numpy as np + +'''array_1d_1 = np.array([1, 4, 6, 2, 9, 10, 11]) +# Assigning an array to the slice of array_1d +array_1d_1[2:] = np.array([3, 5, ]) +print(array_1d_1) + + +import numpy as np + +arr = np.zeros((5,)) +arr[:] = np.array([1, 2]) # ❌ ValueError + + +np.zeros((5)) # Interpreted as np.zeros(5), returns a 1D array of size 5 +np.zeros((5,)) # Explicitly a tuple, also returns a 1D array of size 5 +''' + +print(np.zeros((5))) +print(np.zeros((5,))) +print(np.zeros((5, 1))) # 2D array with shape (5, 1) +print(np.zeros((5, 2))) # 2D array with shape (5 + +print(np.full((5, 5), 1)) # 2D array of 1's with shape (5, 5) \ No newline at end of file diff --git a/test2.py b/test2.py new file mode 100644 index 0000000..39e4937 --- /dev/null +++ b/test2.py @@ -0,0 +1,19 @@ +import numpy as np +""" +This script demonstrates basic NumPy array manipulation: +- Updates product prices by assigning a value of 20 to all prices greater than 10. +- Modifies product ratings for two categories over three criteria by setting the last two criteria of the first category to 9. +- Prints the updated prices and ratings arrays. +""" +# Product prices +prices = np.array([15, 8, 22, 7, 12, 5]) +# Assign 20 to every price greater than 10 +prices[prices > 10] = 20 + +# Product ratings for two categories over three criteria +ratings = np.array([[6, 8, 9], [7, 5, 10]]) + +ratings[0, 1:] = np.array([9, 9]) +print(prices) +print(ratings) + diff --git a/test_digital_to_hexidecimal.py b/test_digital_to_hexidecimal.py new file mode 100644 index 0000000..e69de29 diff --git a/threshold_checker.py b/threshold_checker.py new file mode 100644 index 0000000..f96d47e --- /dev/null +++ b/threshold_checker.py @@ -0,0 +1,16 @@ +def threshold_checker(threshold): + def check(value): + return threshold < value + + return check + +# Usage +greater_than_10 = threshold_checker(10) +print(greater_than_10(12)) +print(greater_than_10(8)) +print(greater_than_10(10)) + +greater_than_100 = threshold_checker(100) +print(greater_than_100(150)) +print(greater_than_100(80)) +print(greater_than_100(100)) \ No newline at end of file diff --git a/timing_decorator.py b/timing_decorator.py new file mode 100644 index 0000000..ee67e2a --- /dev/null +++ b/timing_decorator.py @@ -0,0 +1,18 @@ +import time + +def timing_decorator(func): + def wrapper(*args, **kwargs): + start_time = time.time() + result = func(*args, **kwargs) + end_time = time.time() + print(f"'{func.__name__}' executed in {end_time - start_time} seconds") + return result + return wrapper + +@timing_decorator +def some_function(): + time.sleep(1) # Simulating a task + print("Function completed") + +# Usage +some_function() \ No newline at end of file diff --git a/toppings.py b/toppings.py new file mode 100644 index 0000000..f33a9bf --- /dev/null +++ b/toppings.py @@ -0,0 +1,4 @@ +requested_toppings = 'mushrooms' +if requested_toppings != 'anchovies': + print('Hold the anchovies!') + diff --git a/toppings2.py b/toppings2.py new file mode 100644 index 0000000..6ad5964 --- /dev/null +++ b/toppings2.py @@ -0,0 +1,9 @@ +requested_toppings = ['mushrooms', 'extra cheese'] +if 'mushrooms' in requested_toppings: + print('adding mushrooms!') +if 'pepperoni' in requested_toppings: + print('adding pepperoni') +if 'extra cheese' in requested_toppings: + print('adding extra cheese') + +print('\nFinished making your Pizza!') diff --git a/toppings3.py b/toppings3.py new file mode 100644 index 0000000..f590e02 --- /dev/null +++ b/toppings3.py @@ -0,0 +1,9 @@ +requested_toppings = ['mushrooms', 'green peppers', 'extra cheese'] +for requested_topping in requested_toppings: + if requested_topping == 'green peppers': + print('Sorry, we are out of green pappers right now') + else: + print(f'adding {requested_topping}.') + +print('\nFinished making your Pizza!') + diff --git a/toppings4.py b/toppings4.py new file mode 100644 index 0000000..a3074b3 --- /dev/null +++ b/toppings4.py @@ -0,0 +1,11 @@ +#requested_toppings = [] +requested_toppings = ['mushrooms', 'pepperoni', 'green peppers', 'extra cheese'] +if requested_toppings: + for requested_topping in requested_toppings: + print(f'adding {requested_topping}.') + print('\nFinished making your Pizza!') +else: + print('Are you sure you want a plain Pizza?') + + + diff --git a/toppings5.py b/toppings5.py new file mode 100644 index 0000000..eac65c6 --- /dev/null +++ b/toppings5.py @@ -0,0 +1,10 @@ +available_toppings = ['mushrooms', 'olives', 'green peppers', 'pepperoni', 'pineapple', 'extra cheese'] +requested_toppings = ['mushrooms', 'french fries', 'extra cheese'] +for requested_topping in requested_toppings: + if requested_topping in available_toppings: + print(f'Adding {requested_topping}.') + else: + print(f'Sorry, we don\'t have the {requested_topping}.') +print('\nFinished making your Pizza!') + + diff --git a/toppings6.py b/toppings6.py new file mode 100644 index 0000000..e69de29 diff --git a/two_numbers_sum_to_9.py b/two_numbers_sum_to_9.py new file mode 100644 index 0000000..2c88014 --- /dev/null +++ b/two_numbers_sum_to_9.py @@ -0,0 +1,33 @@ +from itertools import combinations + +# Step 1: Define the set and target sum +numbers = list(range(1, 9)) +target = 9 + +# Step 2: Generate all 5-number combinations +valid_combinations = list(combinations(numbers, 5)) + +# Step 3: Define the 4 mutually exclusive pairs that sum to 9 +pairs = [(1, 8), (2, 7), (3, 6), (4, 5)] + +# Step 4: Check each combination for the required condition +def has_pair_summing_to_target(combo, pair_list): + for a, b in pair_list: + if a in combo and b in combo: + return True + return False + +# Step 5: Verify each combination +always_has_pair = all(has_pair_summing_to_target(c, pairs) for c in valid_combinations) + +print(f"Every 5-number combination has at least one pair summing to {target}: {always_has_pair}") + +''' +The code verifies if every 5-number combination from 1 to 8 contains at least one of the specified pairs that sum to 9. +# Output: True or False based on the verification +# Note: The output will be True since every combination of 5 numbers from 1 to 8 will always +# include at least one of the pairs (1, 8), (2, 7), (3, 6), or (4, 5) due to the nature of combinations and the range of numbers. +How it works: +1. It generates all combinations of 5 numbers from the set {1, 2, 3, 4, 5, 6, 7, 8}. +2. It checks each combination to see if it contains at least one of the pairs that sum to 9. +''' \ No newline at end of file diff --git a/unpacking.py b/unpacking.py new file mode 100644 index 0000000..60f22f0 --- /dev/null +++ b/unpacking.py @@ -0,0 +1,7 @@ +# unpacking +a, b, c = (1, 2, 3) # a = 1, b = 2, c = 3 +print(f"a = {a}, b = {b}, c = {c}") + +# packing +a, b, *c = 1, 2, 3, 4, 5 # a = 1, b = 2, c = [3, 4, 5] +print(f"a = {a}, b = {b}, c = {c}") \ No newline at end of file diff --git a/user.py b/user.py new file mode 100644 index 0000000..dcecc4a --- /dev/null +++ b/user.py @@ -0,0 +1,10 @@ +# program prints key and value pairs +user_0 = { + 'username': 'efermi', + 'first': 'enrico', + 'last': 'fermi', +} +for key, value in user_0.items(): + print(f'\nKey: {key}') + print(f'Value: {value}') + diff --git a/using_eval_function.py b/using_eval_function.py new file mode 100644 index 0000000..553b5a2 --- /dev/null +++ b/using_eval_function.py @@ -0,0 +1,3 @@ +expression = input("Enter an arithmetic expression") +result = eval(expression) +print("Result:", result) diff --git a/using_kwargs.py b/using_kwargs.py new file mode 100644 index 0000000..425955c --- /dev/null +++ b/using_kwargs.py @@ -0,0 +1,21 @@ +def create_user_profile(**kwargs): + if not kwargs: + return "No profile data provided." + + profile_parts = [] + for key, value in kwargs.items(): + profile_parts.append(f"{key.capitalize()}: {value}") + + # If you want to return a single string with all profile parts joined by newlines + return "\n".join(profile_parts) + + # If you want to return a list of profile parts, use + # return profile_parts + + +# Example usage +profile = create_user_profile(name="Alice", age=30, occupation="Engineer") +print(profile) + +profile_empty = create_user_profile() +print(profile_empty) diff --git a/using_zip.py b/using_zip.py new file mode 100644 index 0000000..7e566e6 --- /dev/null +++ b/using_zip.py @@ -0,0 +1,23 @@ +#Zipping two lists of equal length +names = ['Alice', 'Bob', 'Charlie'] +scores = [85, 92, 78] +paired = list(zip(names, scores)) +print(paired) + +#Creating a dictionary +keys = ['id', 'name', 'age'] +values = [101, 'Alice', 30] +data = dict(zip(keys, values)) +print(data) + +#Unzipping the zipped lists +zipped = [('Alice', 85), ('Bob', 92), ('Charlie', 78)] +names, scores = zip(*zipped) +print(names) # ('Alice', 'Bob', 'Charlie') +print(scores) # (85, 92, 78) + +#Unzipping the dictionary to a list of key, value tuples +data = {'id': 101, 'name': "Alice", 'age' : 30} +keys, values = zip(*data.items()) +print(keys, values) + diff --git a/voting.py b/voting.py new file mode 100644 index 0000000..ad8ba56 --- /dev/null +++ b/voting.py @@ -0,0 +1,5 @@ +age = 17 +if age >= 18: + print('You are old enough to vote') +else: + print('You are not old enough to vote.') \ No newline at end of file diff --git a/voting2.py b/voting2.py new file mode 100644 index 0000000..9f4d695 --- /dev/null +++ b/voting2.py @@ -0,0 +1,5 @@ +age = 19 +if age >= 18: + print('You\'re old enough to vote.') + print('Have you registered to vote yet?') + diff --git a/voting3.py b/voting3.py new file mode 100644 index 0000000..62af63d --- /dev/null +++ b/voting3.py @@ -0,0 +1,8 @@ +age = 17 +if age >= 18: + print('You\'re old enough to vote.') + print('Have you registered to vote yet?') +else: + print('Sorry, you\'re too young to vote.') + print('Please register to vote when you turn 18.') + diff --git a/votint3.py b/votint3.py new file mode 100644 index 0000000..e69de29 diff --git a/zipping_lists.py b/zipping_lists.py new file mode 100644 index 0000000..b5f8d58 --- /dev/null +++ b/zipping_lists.py @@ -0,0 +1,45 @@ +list_a = [1, 2, 3] +list_b = [4, 5, 6] +""" +This script demonstrates how to zip and unzip two lists in Python. +- `list_a` and `list_b` are two lists of integers. +- The `zip()` function combines these lists into a list of tuples, pairing elements by their positions. +- The zipped result is printed. +- The script then shows how to unzip the zipped list using unpacking (`*`) and `zip()`, resulting in tuples containing + the original lists' elements. +- The unzipped tuples are converted back to lists using `map(list, ...)`. +- The final output confirms that the original lists are successfully recovered after zipping and unzipping. +Example output: +list_a: [1, 2, 3] +list_b: [4, 5, 6] +list_a and list_b zipped: [(1, 4), (2, 5), (3, 6)] +zipped list unzipped: [(1, 2, 3), (4, 5, 6)] +list_a unzipped: [1, 2, 3] +list_b unzipped: [4, 5, 6] +""" + +print('list_a:', list_a) +print('list_b:', list_b) +zipped = zip(list_a, list_b) +print('list_a and list_b zipped:', list(zipped)) # Output: [(1, 4), (2, 5), (3, 6)] +# Unzipping +unzipped = zip(*zip(list_a, list_b)) +print('zipped list unzipped:', list(unzipped)) # Output: [(1, 2, 3), (4, 5, 6)] +# Note: The unzipped output is a list of tuples, each containing elements from the original lists. +# To convert tuples back to lists +list_a_unzipped, list_b_unzipped = map(list, zip(*zip(list_a, list_b))) + +print('list_a unzipped:', list(list_a_unzipped)) # Output: [1, 2, 3] +print('list_b unzipped:', list(list_b_unzipped)) # Output: [4, 5, 6] + +# Use cases + +for num, char in zip([1, 2, 3], ['a', 'b', 'c']): + print('num', num, 'char', char) + +pairs = [(1, 'a'), (2, 'b'), (3, 'c')] + +nums, chars = zip(*pairs) +print('list of unzipped pairs:', list(zip(*pairs))) +print('list of nums:', list(nums)) # (1, 2, 3) +print('list of chars:', list(chars)) # ('a', 'b', 'c') \ No newline at end of file