Alternativ lösning 5: Koncis groovy

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) }


Kommentera artikeln

Din kommentar

Hantering: Publiceras inte. Vi delar aldrig din e-post med tredje part och vi skickar aldrig oönskad reklam.

Karin Edsröm, VD på Citerus

Vi söker konsulter!

Vi vet att man kan förändra världen med hjälp av mjukvara. Vill du vara med?  Bli en av oss →

 

Inspiration via e-post

  Artiklar om framgångsrik mjukvaruutveckling
  Information om nya kurser och seminarier

Du kan enkelt säga upp din prenumeration om du ändrar dig. Vi lämnar aldrig ut e-postadresser till tredje part.
Läs mer om hur vi hanterar personuppgifter.

 

 

 

Om Citerus

Citerus hjälper företag att lyckas med sin mjukvaruutveckling. Vi erbjuder metodinförande, kurser och träning samt systemutveckling och kan dessutom avlasta våra kunder genom ta oss an både delprojekt och hela projektåtaganden. Allt för att de ska kunna hålla en hög innovationstakt och skapa smarta lösningar som ökar deras konkurrenskraft. Citerus kunder har den gemensamma nämnaren att de ser mjukvaruutveckling som affärskritiskt. Läs mer →

monthly
0.5