gt22 icon

Интерполяция

gt22 | PRO | 11/22/18 06:13:58 PM UTC | 0 ⭐ | 634 👁️ | Never ⏰ | []
Python |

1.99 KB

|

None

|

0 👍

/

0 👎

# Считываем известные точки, и точки для которых нужно найти ответ
dots, questions = eval(input())
# Создаём массив ответов
ans = []
# для каждого вопроса...
for q in questions:
    # Считаем расстояние до каждой из известных точек, и сохраняем в формате (x, y, distance)
    data = [(x, y, abs(x - q)) for x, y in dots]
    # Сортируем их по расстоянию, по умолчанию в начале окажутся точки с меньшим расстоянием
    sorted_data = sorted(data, key=lambda x: x[2])
    # Мы не можем быть уверенны что две ближайшие точки не лежат с одной стороны
    # поэтому нам надо найти ближайшии с разных сторон
 
    # Находим точку справа:
    right_i = 0
    # Проверяем, если точка лежит слева от вопроса, пробуем следующию, и так пока не окажется справа
    # Таким образом получаем ближайшую точку справа
    while sorted_data[right_i][0] < q:
        right_i += 1
    # Всё то-же самое, только слева
    left_i = 0
    while sorted_data[left_i][0] > q:
        left_i += 1
 
    # Достаём наши точки, расстояние нам больше не надо, так-что выкидываем
    right_x, right_y, _ = sorted_data[right_i]
    left_x, left_y, _ = sorted_data[left_i]
    # Чистая математика
    dx = right_x - left_x
    dy = right_y - left_y
    k = dy / dx
    b = left_y - (k * left_x)
    # Добавляем ответ в массив
    ans.append((k * q) + b)
 
# Выводим наши ответы
print(ans)
 
 
 
Шутка на тему:
https://xkcd.com/605/

Comments