import random
def get_forecast(previous_temperatures):
forecast = previous_temperatures[:12]
total_change = previous_temperatures[-1] - previous_temperatures[0]
forecast = (t + total_change for t in forecast)
fluctuation = max(previous_temperatures) - min(previous_temperatures)
cutoff = .95 * fluctuation
forecast = [(forecast if float(i)**1.5 < cutoff else None) for i, forecast in enumerate(forecast)]
return forecast
def load_test_data():
parsed_data = []
with open("test-data.txt", "r", encoding="utf-8") as file:
for line in file:
temperatures = [float(s) for s in line.strip().split(" ")]
forecast_input = temperatures[:24]
correct_forecast = temperatures[24:]
parsed_data.append((forecast_input, correct_forecast))
random.shuffle(parsed_data)
return parsed_data
def solve_task():
day_count = int(input(""))
data = ([float(s) for s in input("").split(" ")] for _ in range(day_count))
for day in data:
forecast = get_forecast(day)
print(" ".join(("?" if h is None else str(h)) for h in forecast))
def get_point_forecast_quality(correct_temperature, forecast_temperature):
if forecast_temperature is None:
return 1
deviation = abs(correct_temperature - forecast_temperature)
if deviation > 2.05:
return 0
elif deviation > 0.75:
return 1
else:
return 2
def get_point_forecast_score(correct_temperature, forecast_temperature):
possible_scores = [-1, 0, 1]
return possible_scores[get_point_forecast_quality(correct_temperature, forecast_temperature)]
def get_random_color():
return (random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1))
def plot():
import matplotlib.pyplot as plt
import numpy as np
color_codes = ["#F00", "#FF0", "#0F0"]
fig = plt.figure()
x = np.arange(36)
test_data = load_test_data()
for day in test_data[:20]:
line_color = get_random_color()
forecast = get_forecast(day[0])
full_day = day[0] + day[1]
plt.plot(x, full_day, color=line_color)
points = [p for p in zip(x[24:], forecast, day[1]) if p[1] is not None]
filtered_t = [t for t, forecast, correct in points]
filtered_forecast = [forecast for t, forecast, correct in points]
filtered_correct = [correct for t, forecast, correct in points]
colors = [color_codes[get_point_forecast_quality(correct, forecast)] for t, forecast, correct in points]
plt.scatter(filtered_t, filtered_forecast, c = colors)
plt.plot(filtered_t, filtered_forecast, color=line_color)
plt.show()
def test_perfomance():
test_data = load_test_data()
correct_forecasts = 0
incorrect_forecasts = 0
skipped_forecasts = 0
for day in test_data:
forecast = get_forecast(day[0])
for f, c in zip(forecast, day[1]):
score = get_point_forecast_score(c, f)
if f is None:
skipped_forecasts += 1
elif score == 1:
correct_forecasts += 1
elif score == -1:
incorrect_forecasts += 1
final_score = 25 * (correct_forecasts - incorrect_forecasts) / len(test_data)
print(f"{final_score = }")
print(f"{correct_forecasts = }")
print(f"{incorrect_forecasts = }")
print(f"{skipped_forecasts = }")
print("")
test_perfomance()