-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathteam_score
More file actions
executable file
·115 lines (96 loc) · 4.1 KB
/
team_score
File metadata and controls
executable file
·115 lines (96 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python
import curses
import sys
def calculate_total_team_rating(weight, total_teams, best_points, team_place, team_points):
# Calculate coefficients
points_coef = team_points / best_points if best_points > 0 else 0
place_coef = 1 / team_place if team_place > 0 else 0
# Calculate E_rating
if points_coef > 0:
E_rating = (points_coef + place_coef) * weight / (1 / (1 + team_place / total_teams))
else:
E_rating = 0 # Ensure E_rating is zero if points_coef is not positive
return E_rating
def main(stdscr):
curses.curs_set(1) # Show cursor
curses.echo()
stdscr.clear()
stdscr.keypad(True)
# Initialize values with defaults
values = ["1.0", "10", "100", "1", "50"]
selected_idx = 0
field_edited = [False, False, False, False, False] # Track if a field has been edited
labels = ["Weight", "Total Teams", "Best Points", "Team Place", "Team Points"]
while True:
stdscr.clear()
h, w = stdscr.getmaxyx()
# Draw title
title = "Team Rating Calculator"
stdscr.addstr(1, (w - len(title)) // 2, title, curses.A_BOLD)
# Draw fields
for i, label in enumerate(labels):
y = i + 3
if i == selected_idx:
stdscr.addstr(y, 2, f"{label:<15}", curses.A_BOLD)
stdscr.addstr(y, 17, f"{values[i]}", curses.A_REVERSE)
else:
stdscr.addstr(y, 2, f"{label:<15}{values[i]}")
# Calculate and display result
try:
weight = float(values[0])
total_teams = int(values[1])
best_points = float(values[2])
team_place = int(values[3])
team_points = float(values[4])
rating = calculate_total_team_rating(weight, total_teams, best_points, team_place, team_points)
stdscr.addstr(9, 2, f"Total Team Rating: {rating:.4f}", curses.A_BOLD)
except (ValueError, ZeroDivisionError) as e:
stdscr.addstr(9, 2, f"Error: {str(e)}", curses.A_BOLD)
# Show keybindings
stdscr.addstr(h-4, 2, "↑/↓: Navigate fields | Tab: Next field | Shift+Tab: Previous field")
stdscr.addstr(h-3, 2, "Type directly to edit | Backspace to delete | Esc: Exit")
stdscr.addstr(h-2, 2, "First keypress clears the field")
# Position cursor for direct editing
stdscr.move(selected_idx + 3, 17 + len(values[selected_idx]))
stdscr.refresh()
key = stdscr.getch()
if key == 27: # ESC key
break
elif key == curses.KEY_UP and selected_idx > 0:
selected_idx -= 1
elif key == curses.KEY_DOWN and selected_idx < 4:
selected_idx += 1
elif key == 9: # Tab key
selected_idx = (selected_idx + 1) % 5
elif key == curses.KEY_BTAB: # Shift+Tab
selected_idx = (selected_idx - 1) % 5
elif key == curses.KEY_BACKSPACE or key == 127: # Backspace/Delete key
if values[selected_idx]:
values[selected_idx] = values[selected_idx][:-1]
field_edited[selected_idx] = True
elif key == curses.KEY_DC: # Delete key
values[selected_idx] = ""
field_edited[selected_idx] = True
elif 32 <= key <= 126: # Printable characters
# Clear field on first edit
if not field_edited[selected_idx]:
values[selected_idx] = ""
field_edited[selected_idx] = True
# For numbers, decimal point, and minus sign
char = chr(key)
if char.isdigit() or char == '.' or (char == '-' and not values[selected_idx]):
values[selected_idx] += char
# Validate immediately
try:
if selected_idx in [1, 3]: # Integer fields
int(values[selected_idx])
else: # Float fields
float(values[selected_idx])
except ValueError:
# Revert invalid input
values[selected_idx] = values[selected_idx][:-1]
if __name__ == "__main__":
try:
curses.wrapper(main)
except KeyboardInterrupt:
sys.exit(0)