feat: trapping rain water problem done

This commit is contained in:
2025-11-23 23:54:34 +01:00
parent feb122711a
commit 6a86e0ab9d
3 changed files with 78 additions and 0 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -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