Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.FileReader;
- import java.io.IOException;
- import java.io.StringReader;
- import java.util.HashMap;
- import java.io.BufferedReader;
- public class Day12 {
- static HashMap<String, Integer> cache;
- static boolean valid(CharSequence str, int offset, int len) {
- if (offset + len > str.length()) return false;
- int i;
- for (i = offset; i < str.length() && i < offset + len; ++i) {
- if (str.charAt(i) == '.') return false;
- }
- if (i < str.length() && str.charAt(i) == '#') return false;
- return true;
- }
- public static int countArrangements(CharSequence record, int[] config, int recordStart, int configStart) {
- String key = String.valueOf(recordStart) + " " + String.valueOf(configStart);
- if (cache.containsKey(key)) return cache.get(key);
- if (recordStart >= record.length()) return configStart >= config.length ? 1 : 0;
- int ifNotTaken = 0;
- if (record.charAt(recordStart) != '#') {
- ifNotTaken = countArrangements(record, config, recordStart + 1, configStart);
- }
- if (record.charAt(recordStart) == '.') {
- cache.put(key, ifNotTaken);
- return ifNotTaken;
- }
- int ifTaken = 0;
- if (configStart < config.length && valid(record, recordStart, config[configStart])) {
- ifTaken = countArrangements(record, config, recordStart + config[configStart] + 1, configStart + 1);
- }
- if (record.charAt(recordStart) == '#') {
- cache.put(key, ifTaken);
- return ifTaken;
- }
- cache.put(key, ifTaken + ifNotTaken);
- return ifTaken + ifNotTaken;
- }
- public static int countArrangements(CharSequence record, int[] config) {
- cache = new HashMap<>(record.length() * config.length);
- return countArrangements(record, config, 0, 0);
- }
- public static void main(String[] args) throws IOException {
- FileReader file = new FileReader("./res/day12.txt");
- StringReader string = new StringReader("???.### 1,1,3\n.??..??...?##. 1,1,3\n?#?#?#?#?#?#?#? 1,3,1,6\n????.#...#... 4,1,1\n????.######..#####. 1,6,5\n?###???????? 3,2,1");
- BufferedReader reader = new BufferedReader(file);
- String line;
- long acc1 = 0, acc2 = 0;
- while ((line = reader.readLine()) != null) {
- String[] records = line.split(" ");
- String[] configStr = records[1].split(",");
- int[] config = new int[configStr.length];
- for (int i = 0; i < configStr.length; ++i) {
- config[i] = Integer.parseInt(configStr[i]);
- }
- String record = records[0];
- acc1 += countArrangements(record, config);
- record = "";
- int[] newConfig = new int[config.length * 5];
- for (int i = 0; i < 5; ++i) {
- record += records[0];
- if (i != 4) record += "?";
- for (int j = 0; j < config.length; ++j) {
- newConfig[i * config.length + j] = config[j];
- }
- }
- acc2 += countArrangements(record, newConfig);
- }
- System.out.println(acc1);
- System.out.println(acc2);
- reader.close();
- file.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment