Så har Google publiceret spørgsmål 2 i skattejagten, og igen har Hinnerup Net ApS lagt sig ud med det nye spørgsmål.
Denne gang får man en zip-fil til download. Zip-filen indeholder en katalog struktur, med en masse små filer. Hver fil består af et begrænset antal linjer, og på hver linje står et tal. Der gives to kritierier A og B til udvælgelse af tal i filerne. Hvert kriterie består af en delstreng som filens sti eller navn skal indeholde, en fil type samt et linje nummer. Opgaven går i al sin enkelthed ud på at summere tallene der opfylder kriterie A og derefter B. Det endelige resultat er produktet af de to summer.
På forundelig vis ender svaret endnu engang op med at være præcis 42 linjer langt.
Klik her for at se Java koden – spoiler advarsel!
package GoogleTreasureHunt2008;
import java.io.*;
import java.math.BigInteger;
import java.util.regex.Pattern;
public class GoogleTreasureHunt2 {
public GoogleTreasureHunt2(String path, String a1, String b1, int l1, String a2, String b2, int l2) {
File root = new File(path);
System.out.println(sum(root, p(root, a1, b1), l1).multiply(sum(root, p(root, a2, b2), l2)));
}
private Pattern p(File root, String a, String b) {
String pattern = root.getAbsolutePath() + "\\.*" + a + ".*" + b + "$";
return Pattern.compile(pattern.replace("\\", "\\\\"));
}
private BigInteger sum(File dir, Pattern criteria, int line) {
BigInteger result = BigInteger.ZERO;
File[] files = dir.listFiles();
for (File file : files)
if (file.isDirectory())
result = result.add(sum(file, criteria, line));
else if (criteria.matcher(file.getAbsolutePath()).matches())
result = result.add(lineToNumber(file, line));
return result;
}
private BigInteger lineToNumber(File file, int line) {
String l = null;
BufferedReader reader = null;
BigInteger result = BigInteger.ZERO;
try {
reader = new BufferedReader(new FileReader(file));
for (int i = 1; (l = reader.readLine()) != null; i++) if (i == line) {
result = new BigInteger(l);
break;
}
} catch (Exception e) { ; }
finally { try { reader.close(); } catch (Exception e) { ; } }
return result;
}
public static void main(String[] args) {
new GoogleTreasureHunt2("level2", "abc", ".pdf", 5, "yz1", ".pdf", 4);
}
}
Ja - vi ved godt det kan klares med to unix kommandoer der på gammeldagsvis piper resultater imellem "find", "sed", "tr" og "bc" kommandoerne, men fandt det mere udfordrende at programmere os igennem opgaven.