!752 !include #1002461 // Source static class TuringQuestion { S id; S question; S answer; Source source; int level; // difficulty level, 1 or higher (0 means 1) } // validate or invalidate a question static class Val { S id; // turing question id boolean value; Source source; *() {} *(S *id, boolean *value, Source *source) {} } static new L questions; static long nextID = 1; static new L vals; p { load("questions"); load("nextID"); load("vals"); } synchronized answer { if (match("list turing questions", s) || match("list tq", s)) { S url = "bots.tinybrain.de/1002408?id=" + parseSnippetID("#1002463"); ret n(l(questions), "question") + ", results here: " + url + "\n" + simpleList(); } if (match("full list turing questions", s) || match("full list tq", s)) ret n(l(questions), "question") + "\n" + structureLines(questions); if (match("count turing questions", s) || match("count tq", s)) ret str(l(questions)); if "show tq * full" { S id = "tq" + m.unq(0); ret structure(findQuestion(id)); } if (match("*", s, m)) { S x = m.unq(0); if (x.startsWith("tq")) ret structure(findQuestion(x)); } // add last dialog as turing question if "add tq" { O dialog = last(getDialog()); if (dialog == null) ret "No dialog to add"; new TuringQuestion tq; tq.question = getString(dialog, "question"); tq.answer = removeAtName(getString(dialog, "answer")); tq.source = new Source(s); ret addTQ(tq); } // add last question as turing question with custom answer if "add tq *" { O dialog = last(getDialog()); if (dialog == null) ret "No dialog to add"; new TuringQuestion tq; tq.question = getString(dialog, "question"); tq.answer = m.unq(0); tq.source = new Source(s); ret addTQ(tq); } if (match("add tq * *", s, m) || match("add turing question * *", s, m)) { new TuringQuestion tq; tq.question = m.unq(0); tq.answer = m.unq(1); tq.source = new Source(s); ret addTQ(tq); } if (match("add tq level * * *", s, m) || match("add turing question level * * *", s, m)) { new TuringQuestion tq; tq.level = m.psi(0); tq.question = m.unq(1); tq.answer = m.unq(2); tq.source = new Source(s); ret addTQ(tq); } if (match("run tq", s) || match("run turing questions", s)) ret askSelf(format("run turing test *", "#1002463")); if "run tq *" { S id = "tq" + m.unq(0); TuringQuestion tq = findQuestion(id); if (tq == null) ret "TQ not found"; ret checkTQ(tq) ? id + " solved" : id +" not solved"; } if "show tq *" { S id = "tq" + m.unq(0); TuringQuestion tq = findQuestion(id); if (tq == null) ret "TQ not found"; ret tq.question + " => " + tq.answer; } if "invalidate tq *" { S id = "tq" + m.unq(0); TuringQuestion tq = findQuestion(id); if (tq == null) ret "TQ not found"; vals.add(new Val(id, false, new Source(s))); save("vals"); ret "OK, your input is recorded."; } } static synchronized TuringQuestion findQuestion(S id) { ret findByField(questions, "id", id); } static synchronized L getLiveList() { ret cloneList(questions); } static synchronized S simpleList() { Map valsByID = indexByField(vals, "id"); new L l; for (TuringQuestion tq : questions) { boolean inv = valsByID.containsKey(tq.id); l.add(tq.question + " => " + tq.answer + (inv ? " (invalidated)" : "")); } ret fromLines(l); } static S html() { ret h3("Turing Questions") + sourceCodeToHTML(simpleList()); } static S addTQ(TuringQuestion tq) { tq.id = "tq" + nextID++; save("nextID"); questions.add(tq); save("questions"); boolean solved = checkTQ(tq); ret "OK, added as question " + tq.id + ". " + (solved ? "Also, solved." : "Not solved yet."); } static boolean checkTQ(TuringQuestion tq) { ret turingMatch(tq.answer, askSelf(tq.question)); }