Skip to content

Commit 2afca88

Browse files
Add puzzle validation support
1 parent 6745437 commit 2afca88

File tree

3 files changed

+13954
-13568
lines changed

3 files changed

+13954
-13568
lines changed

src/main/kotlin/io/github/lambdallama/JsValidator.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ sealed class JsValidatorResult {
99
}
1010

1111
fun validateWithJsValidator(desc: String, sol: String): JsValidatorResult {
12-
val result = ProcessBuilder("node", "validator/main.js", desc, sol)
12+
val result = ProcessBuilder("node", "validator/main.js", "solution", desc, sol)
1313
.redirectOutput(ProcessBuilder.Redirect.PIPE)
1414
.redirectError(ProcessBuilder.Redirect.PIPE)
1515
.start().apply {

validator/main.js

+29-18
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
"use strict";
22
let fs = require('fs');
33

4-
if (process.argv.length != 4) {
5-
process.stdout.write("Usage: node validator/main.js DESC SOL");
4+
let argv = process.argv
5+
if (argv.length != 5 || (argv[2] != "solution" && argv[2] != "puzzle")) {
6+
process.stdout.write("Usage: node validator/puzzle.js <solution|puzzle> TASK SOLUTION");
67
process.exit();
78
}
89

9-
const DESCRIPTION_FILE = process.argv[2];
10-
const SOLUTION_FILE = process.argv[3];
10+
const MODE = argv[2];
11+
const TASK_FILE = argv[3];
12+
const SOLUTION_FILE = argv[4];
1113

1214
// The validator will use `window` for callback subscription and delaying execution
1315
global.window = {
@@ -50,28 +52,37 @@ global.FileReader = function() {
5052
// Include the validator script into this scope, source: https://icfpcontest2019.github.io/solution_checker
5153
eval.apply(global, [fs.readFileSync(__dirname + '/validator.js').toString()]);
5254
// Call the top-level validator method to subscribe the callbacks
53-
validate();
55+
if (MODE == "solution") {
56+
validate();
57+
} else {
58+
puzzle();
59+
}
5460

5561
let e = window.document.elements;
56-
e.submit_task.files = [new Blob(DESCRIPTION_FILE)];
62+
e.submit_task.files = [new Blob(TASK_FILE)];
5763
e.submit_task.onchange();
5864
e.submit_solution.files = [new Blob(SOLUTION_FILE)];
5965
e.submit_solution.onchange();
6066
e.execute_solution.onclick();
6167

6268
let output = e.output.textContent
63-
let result = {}
64-
let success = output.match(/Success! \n?Your solution took (\d+) time units\./);
65-
if (success) {
66-
result.success = true;
67-
result.time = parseInt(success[1]);
68-
} else {
69-
result.success = false;
70-
let failure = output.match(/.*[F|f]ailed.*/);
71-
if (failure) {
72-
result.error = failure[0];
69+
if (MODE == "solution") {
70+
let result = {}
71+
let success = output.match(/Success! \n?Your solution took (\d+) time units\./);
72+
if (success) {
73+
result.success = true;
74+
result.time = parseInt(success[1]);
7375
} else {
74-
result.error = "Unexpected validator output: '" + output + "'";
76+
result.success = false;
77+
let failure = output.match(/.*[F|f]ailed.*/);
78+
if (failure) {
79+
result.error = failure[0];
80+
} else {
81+
result.error = "Unexpected validator output: '" + output + "'";
82+
}
7583
}
84+
process.stdout.write(JSON.stringify(result));
85+
} else {
86+
// TODO: write JSON if needed
87+
process.stdout.write(output + "\n");
7688
}
77-
process.stdout.write(JSON.stringify(result));

0 commit comments

Comments
 (0)