package algorithms;
import org.apache.commons.io.FileUtils;
import org.paukov.combinatorics.Factory;
import org.paukov.combinatorics.Generator;
import org.paukov.combinatorics.ICombinatoricsVector;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import static java.
util.
Arrays.
asList;
/**
* @author m1st
* todo: JUnit tests, JavaDocs, Comments, less Memory and Running time consumption, more Negative cases and Exceptions handling
*/
public class AlgorithmsSolver {
public static void println
(Object obj
) { }
return array;
}
ArrayList<Object> list = new ArrayList<>();
Scanner scanner
= new Scanner
(new File(filePath
)); while (scanner.hasNextLine()) {
list.add(scanner.nextLine());
}
scanner.close();
return list.toArray();
}
writer.println(object);
}
writer.close();
}
/**
* The key is to use merge sorting.
*/
list.addAll(asList(a));
list.addAll(asList(b));
writeFile(cPath, c);
}
public static int randInt(int min, int max) {
return rand.nextInt(max - min + 1) + min;
}
public static float randFloat(List<Float> list) {
shuffle(list);
return list.get(0);
}
public static String randString
(List
<String
> list
) { shuffle(list);
return list.get(0);
}
/**
* Don't reinvent the wheel. Usage of CombinatoricsLib library.
*/
public static void permutations
(Integer...
numbers) { ICombinatoricsVector<Integer> initialVector = Factory.createVector(numbers);
Generator<Integer> generator = Factory.createPermutationGenerator(initialVector);
for (ICombinatoricsVector<Integer> perm : generator) {
}
}
/**
* Don't reinvent the wheel. Usage of Commons IO library.
*/
String nestedTags
= FileUtils.
readFileToString(file
); if (nestedTags != null) {
noTagsString = nestedTags.replaceAll("\\<.*?\\>", "").replaceAll("\\r\\n\\t", "").replaceAll("\\r\\n", "");
}
if (noTagsString != null) {
result = noTagsString.split("\\s");
}
for (String string
: result
) { int length = string.length();
for (int c = 0; c < length; c++) {
for (int i = 1; i <= length - c; i++) {
sub = string.substring(c, c + i);
}
}
}
}
}
cGFja2FnZSBhbGdvcml0aG1zOwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CmltcG9ydCBvcmcucGF1a292LmNvbWJpbmF0b3JpY3MuRmFjdG9yeTsKaW1wb3J0IG9yZy5wYXVrb3YuY29tYmluYXRvcmljcy5HZW5lcmF0b3I7CmltcG9ydCBvcmcucGF1a292LmNvbWJpbmF0b3JpY3MuSUNvbWJpbmF0b3JpY3NWZWN0b3I7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKaW1wb3J0IGphdmEudXRpbC4qOwoKaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2h1ZmZsZTsKCi8qKgogKiBAYXV0aG9yIG0xc3QKICogICAgICAgICB0b2RvOiBKVW5pdCB0ZXN0cywgSmF2YURvY3MsIENvbW1lbnRzLCBsZXNzIE1lbW9yeSBhbmQgUnVubmluZyB0aW1lIGNvbnN1bXB0aW9uLCBtb3JlIE5lZ2F0aXZlIGNhc2VzIGFuZCBFeGNlcHRpb25zIGhhbmRsaW5nCiAqLwpwdWJsaWMgY2xhc3MgQWxnb3JpdGhtc1NvbHZlciB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRsbihPYmplY3Qgb2JqKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG9iaik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSB0cmFuc3Bvc2VBcnJheShPYmplY3RbXSBhcnJheSkgewogICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoQXJyYXlzLmFzTGlzdChhcnJheSkpOwogICAgICAgIHJldHVybiBhcnJheTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIHJlYWRGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKG5ldyBGaWxlKGZpbGVQYXRoKSk7CiAgICAgICAgd2hpbGUgKHNjYW5uZXIuaGFzTmV4dExpbmUoKSkgewogICAgICAgICAgICBsaXN0LmFkZChzY2FubmVyLm5leHRMaW5lKCkpOwogICAgICAgIH0KICAgICAgICBzY2FubmVyLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIGZpbGVQYXRoLCBPYmplY3RbXSBkYXRhKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGUoZmlsZVBhdGgpKTsKICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBkYXRhKSB7CiAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG9iamVjdCk7CiAgICAgICAgfQogICAgICAgIHdyaXRlci5jbG9zZSgpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGtleSBpcyB0byB1c2UgbWVyZ2Ugc29ydGluZy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2R1Y2VTb3J0ZWRBcnJheShTdHJpbmcgYVBhdGgsIFN0cmluZyBiUGF0aCwgU3RyaW5nIGNQYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICBPYmplY3RbXSBhID0gcmVhZEZpbGUoYVBhdGgpOwogICAgICAgIE9iamVjdFtdIGIgPSByZWFkRmlsZShiUGF0aCk7CiAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGEubGVuZ3RoICsgYi5sZW5ndGgpOwogICAgICAgIGxpc3QuYWRkQWxsKGFzTGlzdChhKSk7CiAgICAgICAgbGlzdC5hZGRBbGwoYXNMaXN0KGIpKTsKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOwogICAgICAgIE9iamVjdFtdIGMgPSBsaXN0LnRvQXJyYXkoKTsKICAgICAgICB3cml0ZUZpbGUoY1BhdGgsIGMpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgaW50IHJhbmRJbnQoaW50IG1pbiwgaW50IG1heCkgewogICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwogICAgICAgIHJldHVybiByYW5kLm5leHRJbnQobWF4IC0gbWluICsgMSkgKyBtaW47CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmbG9hdCByYW5kRmxvYXQoTGlzdDxGbG9hdD4gbGlzdCkgewogICAgICAgIHNodWZmbGUobGlzdCk7CiAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJhbmRTdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpIHsKICAgICAgICBzaHVmZmxlKGxpc3QpOwogICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKICAgIH0KCiAgICAvKioKICAgICAqIERvbid0IHJlaW52ZW50IHRoZSB3aGVlbC4gVXNhZ2Ugb2YgQ29tYmluYXRvcmljc0xpYiBsaWJyYXJ5LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVybXV0YXRpb25zKEludGVnZXIuLi4gbnVtYmVycykgewogICAgICAgIElDb21iaW5hdG9yaWNzVmVjdG9yPEludGVnZXI+IGluaXRpYWxWZWN0b3IgPSBGYWN0b3J5LmNyZWF0ZVZlY3RvcihudW1iZXJzKTsKICAgICAgICBHZW5lcmF0b3I8SW50ZWdlcj4gZ2VuZXJhdG9yID0gRmFjdG9yeS5jcmVhdGVQZXJtdXRhdGlvbkdlbmVyYXRvcihpbml0aWFsVmVjdG9yKTsKICAgICAgICBmb3IgKElDb21iaW5hdG9yaWNzVmVjdG9yPEludGVnZXI+IHBlcm0gOiBnZW5lcmF0b3IpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBlcm0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvbid0IHJlaW52ZW50IHRoZSB3aGVlbC4gVXNhZ2Ugb2YgQ29tbW9ucyBJTyBsaWJyYXJ5LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWxsU3Vic3RyaW5nc09mTmVzdGVkVGFncyhTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwogICAgICAgIFN0cmluZyBuZXN0ZWRUYWdzID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcoZmlsZSk7CiAgICAgICAgU3RyaW5nIG5vVGFnc1N0cmluZyA9IG51bGw7CiAgICAgICAgaWYgKG5lc3RlZFRhZ3MgIT0gbnVsbCkgewogICAgICAgICAgICBub1RhZ3NTdHJpbmcgPSBuZXN0ZWRUYWdzLnJlcGxhY2VBbGwoIlxcPC4qP1xcPiIsICIiKS5yZXBsYWNlQWxsKCJcXHJcXG5cXHQiLCAiIikucmVwbGFjZUFsbCgiXFxyXFxuIiwgIiIpOwogICAgICAgIH0KICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzZdOwogICAgICAgIGlmIChub1RhZ3NTdHJpbmcgIT0gbnVsbCkgewogICAgICAgICAgICByZXN1bHQgPSBub1RhZ3NTdHJpbmcuc3BsaXQoIlxccyIpOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgc3ViOwogICAgICAgIGZvciAoU3RyaW5nIHN0cmluZyA6IHJlc3VsdCkgewogICAgICAgICAgICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwogICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGxlbmd0aDsgYysrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBsZW5ndGggLSBjOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzdWIgPSBzdHJpbmcuc3Vic3RyaW5nKGMsIGMgKyBpKTsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3ViKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo=