This is a small (not necessarily well coded) program which shows you the results of cubers with a specific WCA ID year. It requires Java to run and uses JavaFX (so you don’t need to and actually can’t use the console).
There also is a SpeedSolving Forums post for this.
Click here to download, the following is the source code (fits all into one file):
import java.io.BufferedInputStream;
import java.net.URL;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
public static final String WCA_EXPORT = "https://www.worldcubeassociation.org/results/misc/WCA_export.tsv.zip";
public static final String SINGLES_RANK_FILE = "WCA_export_RanksSingle.tsv";
public static final String AVERAGE_RANK_FILE = "WCA_export_RanksAverage.tsv";
public static final Pattern WCA_ID = Pattern.compile("^\\d\\d\\d\\d+\\w\\w\\w\\w\\d+");
public static final Pattern WCA_ID_YEAR = Pattern.compile("^\\d\\d\\d\\d+(?=\\w)");
public static final String[] EVENTS = { "333", "222", "444", "555", "666", "777", "333bf", "333fm", "333oh",
"clock", "minx", "pyram", "skewb", "sq1", "444bf", "555bf", "333mbf" };
public static final NumberFormat INTEGER_FORMAT = NumberFormat.getIntegerInstance();
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage window) throws Exception {
TextArea output = new TextArea(
"Enter what the program should search for below and then press the start button.");
output.setEditable(false);
TextField year = new TextField();
year.setPromptText("WCA ID year");
year.setTextFormatter(getIntegerFormatter());
TextField resultCount = new TextField();
resultCount.setPromptText("Persons to show");
resultCount.setTextFormatter(getIntegerFormatter());
CheckBox singleOrAverage = new CheckBox("Single (otherwise average)");
singleOrAverage.setAllowIndeterminate(false);
singleOrAverage.setSelected(true);
ComboBox<String> eventName = new ComboBox<>();
eventName.getItems().addAll(EVENTS);
eventName.setEditable(true);
eventName.getSelectionModel().selectFirst();
Button startButton = new Button("Start");
startButton.setOnAction(event -> {
try {
collectData(output, singleOrAverage.isSelected(), Integer.parseInt(resultCount.getText()),
Integer.parseInt(year.getText()), eventName.getSelectionModel().getSelectedItem());
} catch (NumberFormatException e) {
output.setText(
"Please enter a number for " + year.getPromptText() + " and " + resultCount.getPromptText());
}
});
window.setHeight(500);
window.setWidth(800);
window.setTitle("WCA ID Records");
window.setScene(new Scene(new VBox(output, startButton, year, resultCount, singleOrAverage, eventName)));
window.show();
}
public void collectData(TextArea output, boolean singles, int resultCount, int year, String eventName) {
new Thread(() -> {
output.setText("Downloading data...");
try (ZipInputStream inputStream = new ZipInputStream(
new BufferedInputStream(new URL(WCA_EXPORT).openStream()))) {
for (ZipEntry entry = inputStream.getNextEntry(); entry != null; entry = inputStream.getNextEntry()) {
if ((singles ? SINGLES_RANK_FILE : AVERAGE_RANK_FILE).equals(entry.getName())) {
output.setText("Successfully downloaded files.\nNow processing data...");
Scanner scanner = new Scanner(inputStream);
int resultCountCopy = resultCount;
StringBuilder result = new StringBuilder();
result.append(year).append(" WCA ID ").append(eventName)
.append(singles ? " single" : " average").append(" records");
while ((resultCountCopy > 0) && scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.startsWith(String.valueOf(year))) {
String[] data = line.split("\t");
if (eventName.equals(data[1])) {
result.append("\n").append(resultCount - resultCountCopy + 1).append(". ")
.append(data[0]).append(": ").append(data[2]);
resultCountCopy--;
}
}
}
output.setText(result.toString());
scanner.close();
return;
}
}
output.setText("Could not find the correct file");
} catch (Exception e) {
e.printStackTrace();
output.setText("Caught error: " + e.getMessage());
}
}).start();
}
public TextFormatter<String> getIntegerFormatter() {
return new TextFormatter<>(c -> {
if (c.getControlNewText().isEmpty()) {
return c;
}
ParsePosition parsePosition = new ParsePosition(0);
return (INTEGER_FORMAT.parse(c.getControlNewText(), parsePosition) == null
|| parsePosition.getIndex() < c.getControlNewText().length()) ? null : c;
});
}
}