Skip to content

Commit dd86878

Browse files
committed
Progress on updates to lap race, tests not passing.
1 parent f7dd8ee commit dd86878

File tree

16 files changed

+136
-96
lines changed

16 files changed

+136
-96
lines changed

src/main/java/common/Race.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
public abstract class Race {
1111

12-
1312
protected static final String DUMMY_DURATION_STRING = "23:59:59";
1413
public static final Duration DUMMY_DURATION = parseTime(DUMMY_DURATION_STRING);
1514
protected static final String ZERO_TIME_STRING = "0:0:0";
@@ -73,7 +72,7 @@ protected String getPropertyWithDefault(final String property_key, final String
7372
return value == null || value.isBlank() ? default_value : value;
7473
}
7574

76-
protected static Duration parseTime(String element) {
75+
public static Duration parseTime(String element) {
7776

7877
element = element.strip();
7978

src/main/java/common/RawResult.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public String getComment() {
5353
}
5454

5555
public void appendComment(String comment) {
56-
this.comment = this.comment + comment;
56+
if (!this.comment.isEmpty()) this.comment += " ";
57+
this.comment += comment;
5758
}
5859

5960
public Integer getLegNumber() {

src/main/java/lap_race/LapRace.java

+30-32
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,7 @@ private void interpolateMissingTimes() {
142142
raw_results[i].setRecordedFinishTime(raw_results[raw_result_index].getRecordedFinishTime());
143143
raw_results[i].setInterpolatedTime(true);
144144

145-
final String existing_comment = raw_results[i].getComment();
146-
String comment = "";
147-
if (!existing_comment.isEmpty()) comment = " ";
148-
comment += "Time not recorded. No basis for interpolation so set to first recorded time.";
145+
String comment = "Time not recorded. No basis for interpolation so set to first recorded time.";
149146
raw_results[i].appendComment(comment);
150147
}
151148

@@ -168,10 +165,7 @@ private void interpolateMissingTimes() {
168165
raw_results[i].setInterpolatedTime(true);
169166

170167

171-
final String existing_comment = raw_results[i].getComment();
172-
String comment = "";
173-
if (!existing_comment.isEmpty()) comment = " ";
174-
comment += "Time not recorded. Time interpolated.";
168+
String comment = "Time not recorded. Time interpolated.";
175169
raw_results[i].appendComment(comment);
176170
}
177171
}
@@ -180,11 +174,7 @@ private void interpolateMissingTimes() {
180174
raw_results[i].setRecordedFinishTime(raw_results[previous_non_null_time_index].getRecordedFinishTime());
181175
raw_results[i].setInterpolatedTime(true);
182176

183-
184-
final String existing_comment = raw_results[i].getComment();
185-
String comment = "";
186-
if (!existing_comment.isEmpty()) comment = " ";
187-
comment += "Time not recorded. No basis for interpolation so set to last recorded time.";
177+
String comment = "Time not recorded. No basis for interpolation so set to last recorded time.";
188178
raw_results[i].appendComment(comment);
189179
}
190180
}
@@ -195,31 +185,39 @@ private void guessMissingBibNumbers() {
195185

196186
record TeamSummaryAtPosition(int team_number, int finishes_before, int finishes_after, Duration previous_finish, Duration next_finish) { }
197187

198-
int position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber();
199-
while (position_of_first_missing_bib_number > 0) {
200-
201-
TeamSummaryAtPosition[] summaries = new TeamSummaryAtPosition[entries.length];
202-
for (int i = 0; i < summaries.length; i++) {
188+
if (raw_results.length != entries.length * number_of_legs) {
203189

204-
int bib_number = entries[i].bib_number;
205-
int finishes_before = getNumberOfTeamFinishesBefore(position_of_first_missing_bib_number, bib_number);
206-
int finishes_after = getNumberOfTeamFinishesAfter(position_of_first_missing_bib_number, bib_number);
207-
Duration previous_finish_time = getPreviousTeamFinishTime(position_of_first_missing_bib_number, bib_number);
208-
Duration next_finish_time = getNextTeamFinishTime(position_of_first_missing_bib_number, bib_number);
209-
summaries[i] = new TeamSummaryAtPosition(bib_number, finishes_before, finishes_after, previous_finish_time, next_finish_time);
190+
for (int i = 0; i < raw_results.length; i++) {
191+
if (raw_results[i].getBibNumber() == null) raw_results[i].appendComment("Time but not bib number recorded electronically. Bib number not recorded on paper. Too many missing times to guess from DNF teams.");
210192
}
193+
}
194+
else {
211195

212-
Arrays.sort(summaries, Comparator.comparing(o -> o.previous_finish));
213-
Arrays.sort(summaries, Comparator.comparing(o -> o.next_finish));
214-
Arrays.sort(summaries, Comparator.comparingInt(o -> o.finishes_after));
215-
Arrays.sort(summaries, Comparator.comparingInt(o -> o.finishes_before));
196+
int position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber();
197+
while (position_of_first_missing_bib_number > 0) {
216198

217-
raw_results[position_of_first_missing_bib_number - 1].setBibNumber(summaries[0].team_number);
218-
raw_results[position_of_first_missing_bib_number - 1].appendComment("Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.");
199+
TeamSummaryAtPosition[] summaries = new TeamSummaryAtPosition[entries.length];
200+
for (int i = 0; i < summaries.length; i++) {
219201

220-
position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber();
221-
}
202+
int bib_number = entries[i].bib_number;
203+
int finishes_before = getNumberOfTeamFinishesBefore(position_of_first_missing_bib_number, bib_number);
204+
int finishes_after = getNumberOfTeamFinishesAfter(position_of_first_missing_bib_number, bib_number);
205+
Duration previous_finish_time = getPreviousTeamFinishTime(position_of_first_missing_bib_number, bib_number);
206+
Duration next_finish_time = getNextTeamFinishTime(position_of_first_missing_bib_number, bib_number);
207+
summaries[i] = new TeamSummaryAtPosition(bib_number, finishes_before, finishes_after, previous_finish_time, next_finish_time);
208+
}
209+
210+
Arrays.sort(summaries, Comparator.comparing(o -> o.previous_finish));
211+
Arrays.sort(summaries, Comparator.comparing(o -> o.next_finish));
212+
Arrays.sort(summaries, Comparator.comparingInt(o -> o.finishes_after));
213+
Arrays.sort(summaries, Comparator.comparingInt(o -> o.finishes_before));
214+
215+
raw_results[position_of_first_missing_bib_number - 1].setBibNumber(summaries[0].team_number);
216+
raw_results[position_of_first_missing_bib_number - 1].appendComment("Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.");
222217

218+
position_of_first_missing_bib_number = getPositionOfFirstMissingBibNumber();
219+
}
220+
}
223221
}
224222

225223
private int getNumberOfTeamFinishesBefore(int position, int bib_number) {

src/main/java/lap_race/LapRaceInput.java

+16-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package lap_race;
22

3-
import common.MissingTimeException;
3+
import common.Race;
44
import common.RawResult;
55

66
import java.io.IOException;
@@ -126,8 +126,8 @@ private static void loadRawResult(final List<RawResult> raw_results, String line
126126
return;
127127
}
128128

129-
if (result.getBibNumber() == null && result.getRecordedFinishTime() != null)
130-
result.appendComment("Time but not bib number recorded electronically.");
129+
// if (result.getBibNumber() == null && result.getRecordedFinishTime() != null)
130+
// result.appendComment("Time but not bib number recorded electronically.");
131131

132132
final RawResult previous_result = !raw_results.isEmpty() ? raw_results.get(raw_results.size() - 1) : null;
133133

@@ -144,19 +144,22 @@ public void loadTimeAnnotations(RawResult[] raw_results) throws IOException {
144144

145145
List<String> lines = Files.readAllLines(annotations_path);
146146

147-
int index1 = lines.indexOf("Missing bib numbers:") + 2;
148-
if (index1 > 1) {
149-
while (index1 < lines.size() && !lines.get(index1).isEmpty()) {
150-
String[] elements = lines.get(index1).split("\t");
151-
int position = Integer.parseInt(elements[0]);
152-
int bib_number = Integer.parseInt(elements[1]);
153-
String comment = elements[2];
147+
for (int line_index = 1; line_index < lines.size(); line_index++) {
154148

149+
String[] elements = lines.get(line_index).split("\t");
150+
151+
if (elements[0].equals("Update")) {
152+
153+
final int position = Integer.parseInt(elements[1]);
155154
RawResult raw_result = raw_results[position - 1];
156-
raw_result.setBibNumber(bib_number);
157-
raw_result.appendComment(comment);
158155

159-
index1++;
156+
if (elements[2].equals("?")) raw_result.setBibNumber(null);
157+
else if (!elements[2].isEmpty()) raw_result.setBibNumber(Integer.parseInt(elements[2]));
158+
159+
if (elements[3].equals("?")) raw_result.setRecordedFinishTime(null);
160+
else if (!elements[3].isEmpty()) raw_result.setRecordedFinishTime(Race.parseTime(elements[3]));
161+
162+
if (!elements[4].isEmpty()) raw_result.appendComment(elements[4]);
160163
}
161164
}
162165
}

src/main/java/lap_race/LapRaceOutputText.java

+3-9
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,11 @@ public void printCollatedTimes() throws IOException {
8888

8989
for (int i = 0; i < race.getRawResults().length; i++) {
9090

91-
if (i == race.input.getNumberOfRawResults()) {
92-
writer.append("""
93-
94-
// Remaining times from paper recording sheet only.
95-
96-
""");
97-
}
98-
9991
RawResult raw_result = race.getRawResults()[i];
10092

93+
if (i == race.input.getNumberOfRawResults() - 1)
94+
raw_result.appendComment("Remaining times from paper recording sheet only.");
95+
10196
final Integer bib_number = raw_result.getBibNumber();
10297
final int legs_already_finished = leg_finished_count.getOrDefault(bib_number, 0);
10398

@@ -110,7 +105,6 @@ public void printCollatedTimes() throws IOException {
110105
if (raw_result.getLegNumber() > 0) {
111106
writer.append("\t").append(String.valueOf(raw_result.getLegNumber()));
112107
if (legs_already_finished >= raw_result.getLegNumber()) {
113-
if (!comment.isEmpty()) comment.append(" ");
114108
comment.append("Leg ").
115109
append(raw_result.getLegNumber()).
116110
append(" finisher was runner ").

src/test/java/lap_race/devils_burdens/LapRaceTest.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,13 @@ public void interpolatedRawTimes() throws Exception {
8181
}
8282

8383
@Test
84-
public void guessedMissingBibNumbers() throws Exception {
85-
testExpectedCompletion("guessed_missing_bib_numbers");
84+
public void guessedMissingBibNumbersA() throws Exception {
85+
testExpectedCompletion("guessed_missing_bib_numbers_a");
86+
}
87+
88+
@Test
89+
public void guessedMissingBibNumbersB() throws Exception {
90+
testExpectedCompletion("guessed_missing_bib_numbers_b");
8691
}
8792

8893
@Test

src/test/resources/lap_race/devils_burdens/actual_2024/expected/times_collated.txt

+26-31
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,22 @@
5252
49 00:53:15
5353
72 00:53:19
5454
106 00:53:23
55-
64 00:53:24 // Time but not bib number recorded electronically. Recording sheet has 84 in this position but inconsistent with result 3 minutes earlier, so guessed bib number 64 from DNF teams.
56-
10 00:53:25 // Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
55+
79 00:53:24 # Recording sheet has 84 in this position but inconsistent with result 3 minutes earlier, so ignored. Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
56+
64 00:53:25 # Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
5757
11 00:53:28
5858
52 00:53:31
5959
19 00:54:03
6060
5 00:54:08
6161
35 00:54:10
62-
53 00:54:15 // Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
62+
53 00:54:15 # Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
6363
24 00:54:17
6464
83 00:54:21
6565
27 00:54:26
6666
15 00:55:27
6767
23 00:55:30
6868
33 00:55:32
6969
40 00:55:36
70-
79 00:55:37 // Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
70+
10 00:55:37 # Time but not bib number recorded electronically. Bib number not recorded on paper. Guessed bib number from DNF teams.
7171
91 00:55:39
7272
111 00:55:44
7373
77 00:55:57
@@ -212,8 +212,7 @@
212212
93 02:40:04
213213
76 02:40:23
214214
95 02:41:07
215-
75 ? // 75 recorded on paper in this position.
216-
14 02:41:10
215+
14 02:41:10 # 75 on recording sheet before 14, but no electronic record.
217216
37 02:42:04
218217
96 02:42:10
219218
10 02:43:03
@@ -382,20 +381,17 @@
382381
111 04:12:45
383382
30 04:12:47
384383
8 04:13:03
385-
44 04:13:06
386-
387-
// Remaining times from paper recording sheet only.
388-
389-
72 04:13:33 // Interpolated time.
390-
93 04:14:01 // Interpolated time.
391-
105 04:14:29 // Interpolated time.
392-
6 04:14:57 // Interpolated time.
384+
44 04:13:06 # Remaining times from paper recording sheet only.
385+
72 04:13:33 # Time not recorded. Time interpolated.
386+
93 04:14:01 # Time not recorded. Time interpolated.
387+
105 04:14:29 # Time not recorded. Time interpolated.
388+
6 04:14:57 # Time not recorded. Time interpolated.
393389
70 04:15:25
394-
2 04:15:32 // Interpolated time.
395-
5 04:15:39 // Interpolated time.
396-
23 04:15:46 // Interpolated time.
397-
3 04:15:53 // Interpolated time.
398-
41 04:16:00 // Interpolated time.
390+
2 04:15:32 # Time not recorded. Time interpolated.
391+
5 04:15:39 # Time not recorded. Time interpolated.
392+
23 04:15:46 # Time not recorded. Time interpolated.
393+
3 04:15:53 # Time not recorded. Time interpolated.
394+
41 04:16:00 # Time not recorded. Time interpolated.
399395
95 04:16:07
400396
70 04:16:25
401397
45 04:17:02
@@ -406,29 +402,28 @@
406402
69 04:18:05
407403
50 04:18:16
408404
51 04:18:16
409-
112 04:18:22 // Seems unlikely that this and following time are correct, so probably missing an earlier finish for 112.
410-
112 04:18:28 // Not recorded, time reverse engineered from submitted strava trace.
405+
112 04:18:22 # Seems unlikely that this and following time are correct, so probably missing an earlier finish for 112.
406+
112 04:18:28 # Time not recorded. Time reverse engineered from submitted Strava trace.
411407
76 04:18:30
412-
40 04:18:30 // Not recorded, time reverse engineered from submitted leg time.
413-
36 04:18:32 // Leg 4, not recorded, time reverse engineered from submitted leg time.
414-
11 04:18:40 // Only on recording sheet, looks like 110. Time interpolated.
415-
39 04:18:51 // Interpolated time.
408+
40 04:18:30 # Time not recorded. Time reverse engineered from submitted leg time.
409+
36 04:18:32
410+
11 04:18:40 # Only on recording sheet, looks like 110. Time interpolated.
411+
39 04:18:51 # Time not recorded. Time interpolated.
416412
28 04:19:01
417413
31 04:19:03 // Not recorded, time reverse engineered from submitted strava trace.
418414
95 04:19:08
419-
// 104 on recording sheet in this position, but runner says their time was 49.30.
420-
10 04:19:30
415+
10 04:19:30 # 104 on recording sheet in this position, but runner says their time was 49.30.
421416
7 04:19:45
422417
38 04:20:06
423418
67 04:20:43
424419
26 04:21:50
425-
36 04:22:07 3 // Leg 3 finisher was runner 4 to finish for team.
426-
105 04:22:15 3 // Leg 3 finisher was runner 4 to finish for team.
420+
36 04:22:07 3 # Leg 3 finisher was runner 4 to finish for team.
421+
105 04:22:15 3 # Leg 3 finisher was runner 4 to finish for team.
427422
42 04:22:21
428423
56 04:22:35
429424
84 04:22:41
430425
2 04:22:49
431-
76 04:23:04 3 // Leg 3 finisher was runner 4 to finish for team.
426+
76 04:23:04 3 # Leg 3 finisher was runner 4 to finish for team.
432427
17 04:23:04
433428
8 04:23:35
434429
65 04:23:40
@@ -450,4 +445,4 @@
450445
113 04:35:20
451446
66 04:40:04
452447
26 04:49:54
453-
65 04:50:16 3 // Leg 3 finisher was runner 4 to finish for team.
448+
65 04:50:16 3 # Leg 3 finisher was runner 4 to finish for team.
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
Missing bib numbers:
2-
Position Bib Number Comment
3-
55 64 Recording sheet has 84 in this position but inconsistent with result 3 minutes earlier, so guessed bib number 64 from DNF teams.
4-
56 10 Bib number not recorded on paper. Guessed bib number from DNF teams.
5-
62 53 Bib number not recorded on paper. Guessed bib number from DNF teams.
6-
70 79 Bib number not recorded on paper. Guessed bib number from DNF teams.
1+
Action Position Bib Number Time Comment
2+
Update 55 Recording sheet has 84 in this position but inconsistent with result 3 minutes earlier, so ignored.
3+
Update 215 75 on recording sheet before 14, but no electronic record.
4+
Update 405 Seems unlikely that this and following time are correct, so probably missing an earlier finish for 112.
5+
Update 406 04:18:28 Time not recorded. Time reverse engineered from submitted Strava trace.
6+
Update 408 04:18:30 Time not recorded. Time reverse engineered from submitted leg time.
7+
Update 410 Only on recording sheet, looks like 110.
8+
Update 413 04:19:03 Time not recorded. Time reverse engineered from submitted Strava trace.
9+
Update 415 104 on recording sheet in this position, but runner says their time was 49.30.
10+
Update 430 04:24:20 Time estimated based on runner's information.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
1 00:42:43
2+
2 00:43:52
3+
3 00:44:59
4+
? 00:45:35 # Time but not bib number recorded electronically. Bib number not recorded on paper. Too many missing times to guess from DNF teams.
5+
5 00:45:43
6+
1 01:27:00
7+
2 01:43:08
8+
3 01:43:48
9+
? 01:47:23 # Time but not bib number recorded electronically. Bib number not recorded on paper. Too many missing times to guess from DNF teams.
10+
? 01:47:44 # Time but not bib number recorded electronically. Bib number not recorded on paper. Too many missing times to guess from DNF teams.
11+
1 02:35:05
12+
2 02:35:34
13+
3 02:35:59
14+
4 02:36:10
15+
5 02:37:19
16+
1 03:47:58
17+
2 03:48:22
18+
? 03:48:29 # Time but not bib number recorded electronically. Bib number not recorded on paper. Too many missing times to guess from DNF teams.
19+
4 03:49:21
20+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
ENTRIES_FILENAME = entries.txt
2+
RAW_RESULTS_FILENAME = rawtimes.txt
3+
YEAR = 2020
4+
NUMBER_OF_LEGS = 4
5+
PAIRED_LEGS = 2,3
6+
RACE_NAME_FOR_RESULTS = Devil's Burdens
7+
RACE_NAME_FOR_FILENAMES = simple
8+
9+
# Elapsed duration from start of leg 1 to mass start time for each leg.
10+
# 23:59:59 indicates no mass start.
11+
MASS_START_ELAPSED_TIMES =
12+
13+
# Comma-separated sequence of bib-number/leg-number for all legs that have a time
14+
# recorded but the runners DNF'd the leg.
15+
DNF_LEGS =
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
1 Team 1 Women Senior John Smith Hailey Dickson:) & Alix Crawford Rhys Müllar & Paige Thompson Amé MacDonald
2+
2 Team 2 Open 50+ Bartosz Thomson John Smith & Zuzanna Miller-Ford Leo McKenzie & Henry Muir Regan Millar
3+
3 Team 3 Open Senior JackBruce Martin King & Leland Donaldson Neil MacDonald & Myles Christie Hubert Gray
4+
4 Team 4 Women 50+ Sofia O'Connor Philip O’Donohue & Hasan Robertson Lena K. Maclean & Isabel Ritchie Martha Gibson
5+
5 Team 5 Open Senior Clark O' Connor Nina Joan Fiona Walker & Hope Christie Cayla Duncan & Scott Kelly Amelia Muir

src/test/resources/lap_race/devils_burdens/guessed_missing_bib_numbers_b/input/rawtimes.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1 42:432 43:523 44:59? 45:355 45:431 1:27:002 1:43:083 1:43:48? 1:47:23? 1:47:441 2:35:052 2:35:343 2:35:594 2:36:105 2:37:191 3:47:582 3:48:22? 3:48:294 3:49:21

0 commit comments

Comments
 (0)