Skip to content

Instantly share code, notes, and snippets.

@Gladozzz
Last active June 30, 2022 11:43
Show Gist options
  • Save Gladozzz/0facb0bc495bf42dfafe84c47b344025 to your computer and use it in GitHub Desktop.
Save Gladozzz/0facb0bc495bf42dfafe84c47b344025 to your computer and use it in GitHub Desktop.
траектория
# Задача #1
# Есть кусочно заданная линейная функция. Функция задаётся точками (x,y), которые соединяются прямыми.
# Необходимо получать значение этой функции при определённом значении x.
# Так же оценить сложность алгоритма вычисления значения функции в нотации О-большое.
# Реализация на любом удобном языке, без использования библиотек.
#
# Эта кусочно линейная функция заданная двумя точками
# Точки с одинаковым х переписывают друг друга
# Входящие точки: x=0,y=100 и x=10,y=122
#
# F = piecewise_func(0,100)(10,122) #.. и т.д
#
# Добавим еще одну точку, к примеру, x=30, y=0
#
# F = F(30, 0)
#
# Вычислим значение от x = 5
# F.y(5)
# Результат: y = 111
#
#
# Дополнительная задача. Реализовать функцию получения таблицы.Необходимо получить таблицу вида:
# ---------------------------
# | x1 | x2 | a | b |
# ---------------------------
# | | | | |
# ---------------------------
# | | | | |
#
# Где x1, x2 - это границы интервала, a и b - коэффициенты линейной функции.
class Piecewise_func:
'''кусочно заданная линейная функция'''
dots = []
def __init__(self,x,y):
self.dots = [[x,y]]
def y(self,x):
'''O(n) — линейная сложность'''
if len(self.dots) < 2:
return None # недостаточно точек для кусочно-линейной функции
def calc(i1,i2):
'''i1 - индекс первой точки
i2 - индекс второй точки
A x + B y + C = 0'''
A = self.dots[i2][1] - self.dots[i1][1] # y2 - y1
B = self.dots[i1][0] - self.dots[i2][0] # x1 - x2
C = self.dots[i2][0]*self.dots[i1][1] - self.dots[i1][0]*self.dots[i2][1] # x2*y1 - x1*y2
return (-A*x - C) / B
for i, v in enumerate(self.dots):
if v[0] > x:
if i == 0:
return calc(0,1)
else:
return calc(i-1,i)
if v[0] == x:
return v[1]
last_i = len(self.dots)-1
return calc(last_i-1,last_i)
def table(self):
print('-----------------------------')
print('| x1 | x2 | a | b |')
print('-----------------------------')
for i in range(1,len(self.dots)):
A = self.dots[i][1] - self.dots[i-1][1] # y2 - y1
B = self.dots[i-1][0] - self.dots[i][0] # x1 - x2
print('| {} | {} | {} | {} |'.format(self.dots[i-1][0],self.dots[i][0],A,B))
print('-----------------------------')
def __call__(self, x, y):
for i, v in enumerate(self.dots):
if v[0] > x:
self.dots.insert(i,[x,y])
return self
elif v[0] == x:
self.dots = self.dots[i]
self.dots.append([x,y])
return self
F = Piecewise_func(0,100)(10,122)
F = F(30,0)
print(F.dots)
print(F.y(5))
F.table()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment