2011-02-21 — Tobias HillTobias Hill
Som någon form av sammanfattning av vad jag själv lärt mig under tävlingens gång skrev jag en reducerare i Groovy. Den inkorporerar några av de trick som den här tävlingen har vaskat fram: Pivotering, memoisering och även Carins index-trick i något putsad form. Den är inte uppenbart lättläst, men koncis och snabb.

s = 'CICVTDDTEVOCVOVDDDSUSURSUSUTDVOTITDDODOCDDDCVOVODVODIOCIVOUS'
r = "TDD DDD DI DO OO UI ANT CV IOC LOC SU VO".split();
def pivotize(s, r) {s.split("(?=(?!^)[^${r}])|(?<=[^${r}])")}
def reduce(String s, best, solved, int start) {
r.each {
ix = start - it.length();
while ((ix = s.indexOf(it, ix)) != -1) {
t = s.substring(0, ix) + s.substring(ix + it.length())
if (solved.add(t)) best = reduce(t, best, solved, ix)
ix++;
}
}
return best.length() < s.length() ? best : s
}
pivotize(s, r.join("")).each { print reduce(it, it, [] as Set, 0) }