package net.projecteuler;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import net.projecteuler.model.Index;
import net.projecteuler.model.Tree;
import net.projecteuler.model.Tree.Row;
public class Problem18n67 extends AbstractProblem {
Tree tree = new Tree();
private PrintWriter solution;
@Override
public void init(Object... inits) {
LineNumberReader lnr = newLineNumberReader("triangle.txt");
String line = null;
do {
line = readLine(lnr);
if (line != null) {
String[] numbers = line.split(" ");
int level = numbers.length;
for (int i = 0; i < level; i++) {
Integer x = Integer.parseInt(numbers[i]);
if (x > 99)
throw new RuntimeException(String.format("over 99: (%s, %s) %s", level - 1, i, x));
tree.add(level - 1, i, x);
}
}
} while (line != null);
println(String.format("Loaded: %s", tree.maxRows()));
}
@Override
public void solve() {
initSolutionFile();
Index index = tree.getRootValue();
println(index);
long sum = index.getValue();
writeSolution(index, sum);
for (int row = 0; row < tree.maxRows(); row++) {
index = tree.getMaxChildIndex(index);
println(index);
if (index != null)
sum += index.getValue();
writeSolution(index, sum);
}
println(String.format("Sum: %s", sum));
closeSolutionFile();
}
private void closeSolutionFile() {
solution.flush();
solution.close();
}
private void initSolutionFile() {
File f = new File("/tmp/18n67.txt");
try {
f.createNewFile();
} catch (IOException e) {
throw new RuntimeException(String.format("Unable to create new file: ", f.getAbsolutePath()), e);
}
try {
solution = new PrintWriter(f);
} catch (FileNotFoundException e) {
throw new RuntimeException("Oops", e);
}
}
private void writeSolution(Index index, long sum) {
if (index != null) {
Row row = tree.getRow(index.getRow());
for(int i = 100 - index.getRow(); i > 0; i-- )
solution.print(" ");
for (int col = 0; col < row.size(); col++) {
if (col == index.getCol())
solution.print(String.format("(%02d)", row.valueAt(col)));
else
solution.print(String.format(" %02d ", row.valueAt(col)));
if (col < row.size() - 1)
solution.print(" ");
}
solution.println(" => " + sum);
}
}
}