CSES - Datatähti 2024 alku - Results
Submission details
Task:Säähavainnot
Sender:Roopekt
Submission time:2023-11-12 23:37:11 +0200
Language:Python3 (CPython3)
Status:READY
Result:37
Feedback
groupverdictscore
#1ACCEPTED36.63
Test results
testverdicttimescore
#1ACCEPTED0.19 s4.63details
#2ACCEPTED0.18 s4.75details
#3ACCEPTED0.19 s4.88details
#4ACCEPTED0.18 s4.38details
#5ACCEPTED0.19 s4.63details
#6ACCEPTED0.18 s4.38details
#7ACCEPTED0.18 s4.25details
#8ACCEPTED0.18 s4.75details

Code

import random
import statistics

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 = statistics.stdev(previous_temperatures)
    cutoff = 15 * fluctuation #6.4 for **2
    forecast = [(forecast if float(i)**2.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("")
    print(f"{final_score = }")
    print(f"{correct_forecasts = }")
    print(f"{incorrect_forecasts = }")
    print(f"{skipped_forecasts = }")

solve_task()

Test details

Test 1

Verdict: ACCEPTED

input
1000
-0.4 -0.1 -0.2 -0.3 -0.4 -0.5 ...

correct output
0.4 0.4 0.5 0.8 0.9 1.1 1.3 1....

user output
0.20000000000000007 0.50000000...
Truncated

Test 2

Verdict: ACCEPTED

input
1000
2.9 2.9 2.9 2.1 2.6 2 2 2.2 2....

correct output
2.3 1.6 1.5 1.1 1 0.7 0.6 0.8 ...

user output
2.6 2.6 ? ? ? ? ? ? ? ? ? ?
-0.7 -0.6 ? ? ? ? ? ? ? ? ? ?
14.1 14.799999999999999 14.799...
Truncated

Test 3

Verdict: ACCEPTED

input
1000
6.6 6 6.4 6 4.6 4.6 4.2 4.3 4....

correct output
10 10.9 10.3 10.1 9.1 7.3 5.7 ...

user output
10.1 9.5 9.9 9.5 8.1 ? ? ? ? ?...
Truncated

Test 4

Verdict: ACCEPTED

input
1000
19.4 20.2 19.1 18.9 18.3 17.3 ...

correct output
18 18.2 17 17.5 17.2 16.2 12 8...

user output
17.2 18.0 16.900000000000002 1...
Truncated

Test 5

Verdict: ACCEPTED

input
1000
-5.7 -5.8 -5.8 -5.9 -7.1 -6.9 ...

correct output
-4.2 -4.1 -4 -3.8 -3.5 -3.2 -3...

user output
-4.5 -4.6 -4.6 ? ? ? ? ? ? ? ?...
Truncated

Test 6

Verdict: ACCEPTED

input
1000
14.8 14.8 15.4 12.9 11.8 9.7 9...

correct output
11.8 11 11.6 10.8 10.4 10.4 10...

user output
12.6 12.6 13.2 10.7 9.6 ? ? ? ...
Truncated

Test 7

Verdict: ACCEPTED

input
1000
0.7 1 2 1.4 0.6 -0.4 -0.9 -0.7...

correct output
-1.3 -0.5 -0.6 -1 -3.2 -7.2 -6...

user output
-1.8 -1.5 -0.5 -1.1 ? ? ? ? ? ...
Truncated

Test 8

Verdict: ACCEPTED

input
1000
15.1 15.3 14.9 14.4 14.4 13.7 ...

correct output
15.6 15.9 16 15.2 14.6 14.4 13...

user output
15.0 15.200000000000001 14.8 1...
Truncated