rows = [
    ("L01", 7, 0, 0, "train"), ("L02", 7, 1, 1, "train"),
    ("L03", 14, 0, 0, "train"), ("L04", 14, 2, 1, "train"),
    ("L05", 21, 0, 0, "train"), ("L06", 21, 2, 1, "train"),
    ("L07", 7, 2, 1, "train"), ("L08", 14, 1, 0, "train"),
    ("L09", 7, 0, 0, "validation"), ("L10", 21, 1, 1, "validation"),
    ("L11", 14, 0, 0, "test"), ("L12", 21, 2, 0, "test"),
]
train = [r for r in rows if r[4] == "train"]
validation = [r for r in rows if r[4] == "validation"]
test = [r for r in rows if r[4] == "test"]

def nearest(row):
    _, days, reservations, _, _ = row
    choices = []
    for old in train:
        old_id, old_days, old_reservations, label, _ = old
        dist2 = (days - old_days) ** 2 + (reservations - old_reservations) ** 2
        choices.append((dist2, old_id, label))
    return min(choices)

def accuracy(actual, predicted):
    return sum(a == p for a, p in zip(actual, predicted)) / len(actual)

actual_validation = [r[3] for r in validation]
base_val = [0 for _ in validation]
near_val_details = [nearest(r) for r in validation]
near_val = [result[2] for result in near_val_details]
print("validation:", base_val, near_val,
      accuracy(actual_validation, base_val), accuracy(actual_validation, near_val))

near_test_details = [nearest(row) for row in test]
for row, result in zip(validation + test, near_val_details + near_test_details):
    dist2, old_id, label = result
    print("nearest:", row[0], old_id, dist2, label)
actual_test = [r[3] for r in test]
base_test = [0 for _ in test]
near_test = [result[2] for result in near_test_details]
print("test baseline:", base_test, accuracy(actual_test, base_test))
print("test 1-NN:", near_test, accuracy(actual_test, near_test))
