Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
bqcuong committed Dec 10, 2024
1 parent 19eff8a commit dfe0690
Show file tree
Hide file tree
Showing 21 changed files with 109 additions and 102 deletions.
2 changes: 0 additions & 2 deletions src/main/java/net/bqc/aoc/DayGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
package net.bqc.aoc.utils;

import java.math.BigDecimal;
import java.math.MathContext;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SolutionUtils {
public class Array2DUtils {

public static char[][] readAsMatrix(List<String> inputLines) {
int m = inputLines.size();
Expand Down Expand Up @@ -69,33 +64,6 @@ public static List<Pos> getXPos(char[][] matrix, char x) {
return posList;
}

public static BigDecimal[] solveQuadraticEquation(BigDecimal a, BigDecimal b, BigDecimal c) {
BigDecimal discriminant = b.pow(2).subtract(new BigDecimal("4").multiply(a).multiply(c));

if (discriminant.compareTo(BigDecimal.ZERO) < 0) {
return new BigDecimal[]{};
}

BigDecimal sqrtDiscriminant = discriminant.sqrt(MathContext.DECIMAL128);

BigDecimal x1 = b.negate().subtract(sqrtDiscriminant).divide(a.multiply(new BigDecimal("2")), MathContext.DECIMAL128);
BigDecimal x2 = b.negate().add(sqrtDiscriminant).divide(a.multiply(new BigDecimal("2")), MathContext.DECIMAL128);
return new BigDecimal[]{x1, x2};
}

public static long gcd(long number1, long number2) {
while (number2 != 0) {
long temp = number2;
number2 = number1 % number2;
number1 = temp;
}
return Math.abs(number1);
}

public static long lcm(List<Long> numbers) {
return numbers.stream().reduce(1L, (a, b) -> a * b / SolutionUtils.gcd(a, b));
}

public static boolean isConsecutiveArray(long[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] + 1 != arr[i+1]) {
Expand Down Expand Up @@ -140,41 +108,6 @@ public static int countInMatrix(char[][] matrix, char toCount) {
return count;
}

private static final MessageDigest digest;

static {
try {
digest = MessageDigest.getInstance("SHA-256");
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}

public static String generateSHA256(int[][] matrix) {
StringBuilder res = new StringBuilder();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
res.append(matrix[i][j] + '0');
}
}

byte[] encodedHash = digest.digest(res.toString().getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedHash);
}

public static String bytesToHex(byte[] hash) {
StringBuilder hexString = new StringBuilder(2 * hash.length);
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}

public static void swapElements(int[][] matrix, int row1, int col1, int row2, int col2) {
int temp = matrix[row1][col1];
matrix[row1][col1] = matrix[row2][col2];
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/net/bqc/aoc/utils/EncryptionUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package net.bqc.aoc.utils;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class EncryptionUtils {
private static final MessageDigest digest;

static {
try {
digest = MessageDigest.getInstance("SHA-256");
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}

public static String generateSHA256(int[][] matrix) {
StringBuilder res = new StringBuilder();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
res.append(matrix[i][j] + '0');
}
}

byte[] encodedHash = digest.digest(res.toString().getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedHash);
}

public static String bytesToHex(byte[] hash) {
StringBuilder hexString = new StringBuilder(2 * hash.length);
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
}
34 changes: 34 additions & 0 deletions src/main/java/net/bqc/aoc/utils/MathUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.bqc.aoc.utils;

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.List;

public class MathUtils {
public static BigDecimal[] solveQuadraticEquation(BigDecimal a, BigDecimal b, BigDecimal c) {
BigDecimal discriminant = b.pow(2).subtract(new BigDecimal("4").multiply(a).multiply(c));

if (discriminant.compareTo(BigDecimal.ZERO) < 0) {
return new BigDecimal[]{};
}

BigDecimal sqrtDiscriminant = discriminant.sqrt(MathContext.DECIMAL128);

BigDecimal x1 = b.negate().subtract(sqrtDiscriminant).divide(a.multiply(new BigDecimal("2")), MathContext.DECIMAL128);
BigDecimal x2 = b.negate().add(sqrtDiscriminant).divide(a.multiply(new BigDecimal("2")), MathContext.DECIMAL128);
return new BigDecimal[]{x1, x2};
}

public static long gcd(long number1, long number2) {
while (number2 != 0) {
long temp = number2;
number2 = number1 % number2;
number1 = temp;
}
return Math.abs(number1);
}

public static long lcm(List<Long> numbers) {
return numbers.stream().reduce(1L, (a, b) -> a * b / gcd(a, b));
}
}
4 changes: 2 additions & 2 deletions src/main/java/net/bqc/aoc/year2023/Day03.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.bqc.aoc.year2023;

import net.bqc.aoc.Solution;
import net.bqc.aoc.utils.SolutionUtils;
import net.bqc.aoc.utils.Array2DUtils;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -15,7 +15,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {
int m = inputLines.size();
int n = inputLines.get(0).length();

char[][] matrix = SolutionUtils.readAsMatrix(inputLines);
char[][] matrix = Array2DUtils.readAsMatrix(inputLines);

long sum = 0;
for (int row = 0; row < m; row++) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/net/bqc/aoc/year2023/Day06.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.bqc.aoc.year2023;

import net.bqc.aoc.Solution;
import net.bqc.aoc.utils.SolutionUtils;
import net.bqc.aoc.utils.MathUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
Expand Down Expand Up @@ -34,7 +34,7 @@ public BigInteger solve2(PART_NUMBER part, List<String> inputLines) {
}

public BigInteger countStrategies(BigDecimal time, BigDecimal distance) {
BigDecimal[] roots = SolutionUtils.solveQuadraticEquation(BigDecimal.ONE, time.negate(), distance);
BigDecimal[] roots = MathUtils.solveQuadraticEquation(BigDecimal.ONE, time.negate(), distance);
BigDecimal start = roots[0].add(BigDecimal.ONE).setScale(0, RoundingMode.FLOOR);
BigDecimal end = roots[1].subtract(BigDecimal.ONE).setScale(0, RoundingMode.CEILING);
return end.subtract(start).add(BigDecimal.ONE).toBigInteger();
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/net/bqc/aoc/year2023/Day08.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.bqc.aoc.year2023;

import net.bqc.aoc.Solution;
import net.bqc.aoc.utils.SolutionUtils;
import net.bqc.aoc.utils.MathUtils;

import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -32,7 +32,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {
.map(l -> travelInMaps(p, l))
.toList();

return SolutionUtils.lcm(steps);
return MathUtils.lcm(steps);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day09.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {
.map(l -> Arrays.stream(l.split("\s")).map(Long::parseLong).toList())
.toList();

if (part == PART_NUMBER.ONE) {
if (!isPart2()) {
return histories.stream().mapToLong(this::predict).sum();
}
else {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day10.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {

long steps = traversal(matrix, startPos) / 2;

if (part == PART_NUMBER.TWO) {
if (isPart2()) {
// Use Shoelace's theorem to compute the area of polygon:
// A = 1/2(x1y2 + x2y3 + ... + xny1) - (y1x2 + y2x3 + ... + x1yn)
// The area of the polygon can also be computed with Rick's theorem
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day11.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class Day11 extends Solution {
public long solve(PART_NUMBER part, List<String> inputLines) {
int[][] space = parseSpace(inputLines);
List<int[]> galaxies = findGalaxies(space);
return computeTotalDistance(galaxies, part == PART_NUMBER.ONE ? 2 : 1000000);
return computeTotalDistance(galaxies, !isPart2() ? 2 : 1000000);
}

private long computeTotalDistance(List<int[]> galaxies, int expansionRatio) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day13.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class Day13 extends Solution {
public long solve(PART_NUMBER part, List<String> inputLines) {
super.solve(part, inputLines);
List<int[][]> mirrors = parseMirrors(inputLines);
return summarize(mirrors, part == PART_NUMBER.ONE ? 0 : 1);
return summarize(mirrors, !isPart2() ? 0 : 1);
}

private long summarize(List<int[][]> mirrors, int acceptedWrongSymbol) {
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/net/bqc/aoc/year2023/Day14.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.bqc.aoc.year2023;

import net.bqc.aoc.Solution;
import net.bqc.aoc.utils.SolutionUtils;
import net.bqc.aoc.utils.EncryptionUtils;

import java.util.HashMap;
import java.util.List;
Expand All @@ -24,7 +24,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {

int[][] space = parseSpace(inputLines);

if (part == PART_NUMBER.ONE) {
if (!isPart2()) {
roll(space, UP);
}
else {
Expand All @@ -36,7 +36,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {
long[] loads = new long[1001];
for (int i = 1; i <= 1000; i++) {
rollOneCycle(space);
String hash = SolutionUtils.generateSHA256(space);
String hash = EncryptionUtils.generateSHA256(space);
loads[i] = calculateTotalLoad(space);

if (map.containsKey(hash)) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day15.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {

String[] texts = inputLines.get(0).split(",");

if (part == PART_NUMBER.ONE) {
if (!isPart2()) {
return Arrays.stream(texts).mapToLong(this::hash).sum();
}
else {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day16.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {

char[][] map = parseMap(inputLines);

if (part == PART_NUMBER.ONE) {
if (!isPart2()) {
visitedPoints = new int[map.length][map[0].length];
move(map, 0, 0, RIGHT);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2023/Day17.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {
super.solve(part, inputLines);

Graph graph = constructGraph(inputLines);
return part == PART_NUMBER.ONE ? graph.minCost(0, 3) : graph.minCost(4, 10);
return !isPart2() ? graph.minCost(0, 3) : graph.minCost(4, 10);
}

private Graph constructGraph(List<String> inputLines) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2024/Day01.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {

int sum = 0;
for (int i = 0; i < list1.length; i++) {
sum += part == PART_NUMBER.ONE ? Math.abs(list2[i] - list1[i]) : list1[i] * map.getOrDefault(list1[i], 0);
sum += !isPart2() ? Math.abs(list2[i] - list1[i]) : list1[i] * map.getOrDefault(list1[i], 0);
}
return sum;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2024/Day02.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class Day02 extends Solution {
public long solve(PART_NUMBER part, List<String> inputLines) {
super.solve(part, inputLines);

if (part == PART_NUMBER.ONE) return inputLines.stream().filter(this::isSafe).count();
if (!isPart2()) return inputLines.stream().filter(this::isSafe).count();
return inputLines.stream().filter(this::isSafeWithDampener).count();
}

Expand Down
10 changes: 5 additions & 5 deletions src/main/java/net/bqc/aoc/year2024/Day04.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package net.bqc.aoc.year2024;

import net.bqc.aoc.Solution;
import net.bqc.aoc.utils.Array2DUtils;
import net.bqc.aoc.utils.Pos;
import net.bqc.aoc.utils.SolutionUtils;

import java.util.List;

Expand All @@ -12,14 +12,14 @@ public class Day04 extends Solution {
public long solve(PART_NUMBER part, List<String> inputLines) {
super.solve(part, inputLines);

char[][] matrix = SolutionUtils.readAsMatrix(inputLines);
char[][] matrix = Array2DUtils.readAsMatrix(inputLines);

if (part == PART_NUMBER.ONE) {
List<Pos> xPos = SolutionUtils.getXPos(matrix, 'X');
if (!isPart2()) {
List<Pos> xPos = Array2DUtils.getXPos(matrix, 'X');
return xPos.stream().map(p -> countXMAS(matrix, p)).reduce(Integer::sum).get();
}

List<Pos> aPos = SolutionUtils.getXPos(matrix, 'A');
List<Pos> aPos = Array2DUtils.getXPos(matrix, 'A');
return aPos.stream().map(p -> countX_MAS(matrix, p)).reduce(Integer::sum).get();
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/bqc/aoc/year2024/Day05.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public long solve(PART_NUMBER part, List<String> inputLines) {

List<List<Integer>> chosenUpdates;

if (part == PART_NUMBER.ONE) {
if (!isPart2()) {
chosenUpdates = this.printUpdates.stream().filter(this::isValidUpdate).toList();
}
else {
Expand Down
Loading

0 comments on commit dfe0690

Please sign in to comment.