static abstract class o_KnowingSolver { abstract void solve(L examples, Para target); } static void optimizeLastLine(L paras, O solver) { int score = 0; for (Para p : paras) { S method = optimizeLastLine(paras, p); if (notNull(method)) { print(p.index + " = " + method); ++score; } } print("Successfully calculated last lines: " + score + " of " + l(paras)); } // returns calculation method if pivot could be calculated from other paragraphs static S optimizeLastLine(L all, Para pivot) { L rest = listMinus(all, pivot); Para shortened = new Para(pivot.index, dropLastLine(pivot.text)); ret optimizeLastLine_solve(rest, shortened); } optimizeLastLine_solve(L examples, Para target) { S lastLine = lastLine(pivot.text); }