Guest User

Untitled

a guest
Dec 23rd, 2023
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.31 KB | None | 0 0
  1. import java.io.FileReader;
  2. import java.io.IOException;
  3. import java.io.StringReader;
  4. import java.util.HashMap;
  5. import java.io.BufferedReader;
  6.  
  7. public class Day12 {
  8.     static HashMap<String, Integer> cache;
  9.  
  10.     static boolean valid(CharSequence str, int offset, int len) {
  11.         if (offset + len > str.length()) return false;
  12.  
  13.         int i;
  14.         for (i = offset; i < str.length() && i < offset + len; ++i) {
  15.             if (str.charAt(i) == '.') return false;
  16.         }
  17.         if (i < str.length() && str.charAt(i) == '#') return false;
  18.         return true;
  19.     }
  20.  
  21.  
  22.     public static int countArrangements(CharSequence record, int[] config, int recordStart, int configStart) {
  23.         String key = String.valueOf(recordStart) + " " + String.valueOf(configStart);
  24.         if (cache.containsKey(key)) return cache.get(key);
  25.         if (recordStart >= record.length()) return configStart >= config.length ? 1 : 0;
  26.  
  27.         int ifNotTaken = 0;
  28.         if (record.charAt(recordStart) != '#') {
  29.             ifNotTaken = countArrangements(record, config, recordStart + 1, configStart);
  30.         }
  31.         if (record.charAt(recordStart) == '.') {
  32.             cache.put(key, ifNotTaken);
  33.             return ifNotTaken;
  34.         }
  35.  
  36.         int ifTaken = 0;
  37.         if (configStart < config.length && valid(record, recordStart, config[configStart])) {
  38.             ifTaken = countArrangements(record, config, recordStart + config[configStart] + 1, configStart + 1);
  39.         }
  40.         if (record.charAt(recordStart) == '#') {
  41.             cache.put(key, ifTaken);
  42.             return ifTaken;
  43.         }
  44.  
  45.         cache.put(key, ifTaken + ifNotTaken);
  46.         return ifTaken + ifNotTaken;
  47.     }
  48.  
  49.     public static int countArrangements(CharSequence record, int[] config) {
  50.         cache = new HashMap<>(record.length() * config.length);
  51.         return countArrangements(record, config, 0, 0);
  52.     }
  53.  
  54.     public static void main(String[] args) throws IOException {
  55.         FileReader file = new FileReader("./res/day12.txt");
  56.         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");
  57.         BufferedReader reader = new BufferedReader(file);
  58.  
  59.         String line;
  60.         long acc1 = 0, acc2 = 0;
  61.         while ((line = reader.readLine()) != null) {
  62.             String[] records = line.split(" ");
  63.  
  64.             String[] configStr = records[1].split(",");
  65.             int[] config = new int[configStr.length];
  66.             for (int i = 0; i < configStr.length; ++i) {
  67.                 config[i] = Integer.parseInt(configStr[i]);
  68.             }
  69.  
  70.             String record = records[0];
  71.             acc1 += countArrangements(record, config);
  72.  
  73.             record = "";
  74.             int[] newConfig = new int[config.length * 5];
  75.             for (int i = 0; i < 5; ++i) {
  76.                 record += records[0];
  77.                 if (i != 4) record += "?";
  78.  
  79.                 for (int j = 0; j < config.length; ++j) {
  80.                     newConfig[i * config.length + j] = config[j];
  81.                 }
  82.             }
  83.             acc2 += countArrangements(record, newConfig);
  84.         }
  85.         System.out.println(acc1);
  86.         System.out.println(acc2);
  87.  
  88.         reader.close();
  89.         file.close();
  90.     }
  91. }
  92.  
  93.  
Advertisement
Add Comment
Please, Sign In to add comment