diff --git a/src/modules/exercises/essentials.py b/src/modules/exercises/essentials.py index 2cff5ea..4959c65 100644 --- a/src/modules/exercises/essentials.py +++ b/src/modules/exercises/essentials.py @@ -20,3 +20,32 @@ def find_missing(input_aray: list[int]): return sum(get_array_range(1, len(input_aray) + 1)) - sum(input_aray) def trap_rain_water(input_aray: list[int]): + ceiling = max(input_aray) + # Step 1: create a matrix with the graph + container = [] + for wall_index in range(0, len(input_aray)): + wall = [] + for coord_index in range(0, ceiling): + if (coord_index < input_aray[wall_index]): + wall.insert(coord_index, "w") + else: + wall.insert(coord_index, "a") + container.insert(wall_index, wall) + + total_water = 0 + # Step 2: fill the air with water + for wall_x in range(0, len(input_aray)): + for wall_y in range(0, input_aray[wall_x]): + if (container[wall_x][wall_y] == "a"): + continue + # Step 2.1 count distance with next wall + temp_water = 0 + for water_x in range(wall_x + 1, len(input_aray)): + if (container[water_x][wall_y] == "a"): + temp_water += 1 + else: + total_water += temp_water + break + + return total_water + diff --git a/src/modules/statistics.py b/src/modules/statistics.py index 322af79..43d5b2c 100644 --- a/src/modules/statistics.py +++ b/src/modules/statistics.py @@ -1,5 +1,34 @@ from math import sqrt, pi, e +def mean(list): + return sum(list) / len(list) + +def weighted_mean(items, weights): + if (len(items) != len(weights)): + return + total = 0 + for i in range(len(items)): + total += items[i] * weights[i] + return total / sum(weights) + +def weighted_mean_inline(items, weights): + return sum(s * w for s, w in zip(items, weights)) / sum(weights) + +# also called 50% quantile +def median(items): + ordered = sorted(items) + length = len(ordered) + pair = length % 2 == 0 + mid = int(length / 2) - 1 if pair else int(n/2) + + if pair: + return (ordered[mid] + ordered[mid+1]) / 2 + else: + return ordered[mid] + +def mode(items): + sums = [] + def population_variance(difference_list, mean): summatory = 0.0 for diff in difference_list: @@ -29,6 +58,12 @@ def probability_density_function(x: float, mean: float, standard_deviation: floa def test_statistics_module(): print("=== Statistics module ===") + list = [ 1, 2, 3, 4, 5, 6] + print(">> The mean of {0} is {1}".format(list, mean(list))) + weights = [0.2, 0.5, 0.7, 1, 0, 0.9] + print(">> The weighted_mean of {0} is {1} and it is equivalent to {2}".format(list, weighted_mean(list, weights), weighted_mean_inline(list, weights))) + print(">> The mean is {0}".format(median(list))) + differences = [ -6.571, -5.571, -1.571, 0.429, 2.429, 3.429, 7.429 ] print("The population variance is", population_variance(differences, sum(differences) / len(differences)), population_variance_inline(differences)) print("The standard deviation is", standard_deviation(differences, False)) diff --git a/tests/test_essentials.py b/tests/test_essentials.py index 0b80fb8..2c82a7f 100644 --- a/tests/test_essentials.py +++ b/tests/test_essentials.py @@ -25,3 +25,17 @@ def test_find_missing(): result = find_missing(input) expected = 4 assert result == expected + +def test_rain_watter(): + input = [3,0,1,0,4,0,2] + expected = 10 + result = trap_rain_water(input) + assert result == expected + input = [3,0,2,0,4] + expected = 7 + result = trap_rain_water(input) + assert result == expected + input = [1,2,3,4] + expected = 0 + result = trap_rain_water(input) + assert result == expected