!752 answer { exceptionToUser { if (!tb()) null; if "how many lines" ret lstr(getLog()); if "how many users" ret lstr(getUsers()); if "how many different words" ret lstr(getWords()); if "some users" ret some(getUsers()); if "some words" ret some(getWords()); if "longest message" ret shorten(longest(getTexts()), 100); } } static L getLog() { ret getTBLog(); } static Set getUsers() { ret asTreeSet(collectField(getLog(), "userName")); } static L getTexts() { ret collectField(getLog(), "text"); } static Set getWords() { L lines = getTexts(); new TreeSet set; for (S text : lines) { for (S t : codeTokens(nlTok(text))) { if (isExtendedIdentifier(t)) set.add(t.toLowerCase()); } } ret set; } static S some(Collection c) { ret join(" ", selectRandom(asList(c), 10)); } static S longest(L l) { new Map map; for (S s : l) map.put(s, l(s)); ret highest(map); }