137 lines
4.5 KiB
Java
137 lines
4.5 KiB
Java
import java.io.File;
|
|
import java.math.BigInteger;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Scanner;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
class day14 {
|
|
|
|
public static void main(String[] args) {
|
|
|
|
try {
|
|
|
|
File inputFile = new File("input.txt");
|
|
Scanner in = new Scanner(inputFile);
|
|
|
|
HashMap<Long, Long> memory = new HashMap<>();
|
|
String mask = "";
|
|
|
|
while (in.hasNext()) {
|
|
|
|
String[] line = in.nextLine().split(" = ");
|
|
if (line[0].equals("mask")) {
|
|
mask = line[1];
|
|
System.out.println("Mask: " + mask);
|
|
} else {
|
|
int address = Integer.parseInt(line[0].substring(line[0].indexOf("[") + 1, line[0].indexOf("]")));
|
|
long value = Long.parseLong(line[1]);
|
|
//memory.put(address, maskedValue(mask, value));
|
|
long[] addresses = maskedAddresses(mask, address);
|
|
for (long a : addresses) {
|
|
System.out.printf("Address: %d | Value: %d \n", a, value);
|
|
memory.put(a, value);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
long sumLong = 0;
|
|
|
|
for (long key : memory.keySet()) {
|
|
sumLong += memory.get(key);
|
|
}
|
|
|
|
System.out.println("Answer: " + sumLong);
|
|
|
|
} catch (Exception e) {
|
|
System.out.println(e);
|
|
}
|
|
|
|
}
|
|
|
|
static long maskedValue(String mask, int value) {
|
|
|
|
String binaryString = Integer.toBinaryString(value);
|
|
|
|
while (binaryString.length() != 36) binaryString = "0" + binaryString;
|
|
|
|
String returnString = new String();
|
|
System.out.println("Binary String: " + binaryString);
|
|
for (int i = binaryString.length() - 1; i >= 0; i--) {
|
|
|
|
if (binaryString.charAt(i) != mask.charAt(i) && mask.charAt(i) != 'X') {
|
|
returnString = mask.charAt(i) + returnString;
|
|
} else {
|
|
returnString = binaryString.charAt(i) + returnString;
|
|
}
|
|
|
|
}
|
|
|
|
System.out.println("Return String: " + returnString);
|
|
|
|
return toDenary(returnString);
|
|
|
|
}
|
|
|
|
static long[] maskedAddresses(String mask, int value) {
|
|
String binaryString = Integer.toBinaryString(value);
|
|
|
|
while (binaryString.length() != 36) binaryString = "0" + binaryString;
|
|
|
|
String returnString = new String();
|
|
ArrayList<Integer> xlist = new ArrayList<>();
|
|
System.out.println("Binary String: " + binaryString);
|
|
for (int i = binaryString.length() - 1; i >= 0; i--) {
|
|
|
|
if (mask.charAt(i) == 'X') xlist.add(i);
|
|
|
|
if (binaryString.charAt(i) != mask.charAt(i) && mask.charAt(i) != '0') {
|
|
returnString = mask.charAt(i) + returnString;
|
|
} else {
|
|
returnString = binaryString.charAt(i) + returnString;
|
|
}
|
|
|
|
}
|
|
|
|
System.out.println("Return string: " + returnString);
|
|
|
|
String[] binaryStrings = new String[(int) Math.pow(2, xlist.size())];
|
|
|
|
for (int i = 0; i < Math.pow(2, xlist.size()); i++) {
|
|
|
|
String currentI = Integer.toBinaryString(i);
|
|
while (currentI.length() < xlist.size()) currentI = "0" + currentI;
|
|
|
|
String newAddress = returnString;
|
|
for (int j = 0; j < currentI.length(); j++) {
|
|
newAddress = newAddress.replaceFirst(Pattern.quote("X"), Matcher.quoteReplacement(Character.toString(currentI.charAt(j))));
|
|
}
|
|
|
|
System.out.println("New address: " + newAddress);
|
|
binaryStrings[i] = newAddress;
|
|
|
|
}
|
|
|
|
long[] newAddresses = new long[binaryStrings.length];
|
|
for (int i = 0; i < newAddresses.length; i++) {
|
|
newAddresses[i] = toDenary(binaryStrings[i]);
|
|
}
|
|
|
|
return newAddresses;
|
|
|
|
}
|
|
|
|
static long toDenary(String binary) {
|
|
long value = 0;
|
|
for (int i = 0; i < binary.length(); i++) {
|
|
if (binary.charAt(i) == '1') {
|
|
value += Math.pow(2, (35 - i));
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
}
|