Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package adventofcode2023day01;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.regex.Pattern;
- public class Main {
- public static void main(String[] args) {
- System.out.println("Part 1: " + new Part1().result(Main.class.getResourceAsStream("/input.txt")));
- System.out.println("Part 2: " + new Part2().result(Main.class.getResourceAsStream("/input.txt")));
- }
- static class Part1 extends AoC2023Day1Processor {
- @Override
- protected int firstDigit(String line) {
- for (int i = 0; i < line.length(); ++i) {
- var character = line.charAt(i);
- if (character >= '0' && character <= '9') {
- return character - '0';
- }
- }
- return 0;
- }
- @Override
- protected int lastDigit(String line) {
- for (int i = line.length() - 1; i >= 0; --i) {
- var character = line.charAt(i);
- if (character >= '0' && character <= '9') {
- return character - '0';
- }
- }
- return 0;
- }
- }
- static class Part2 extends AoC2023Day1Processor {
- private static final String DIGIT_PATTERN_STRING = "(zero|one|two|three|four|five|six|seven|eight|nine|\\d)";
- private static final Pattern FIRST_DIGIT_PATTERN = Pattern.compile("^" + DIGIT_PATTERN_STRING + ".*");
- private static final Pattern LAST_DIGIT_PATTERN = Pattern.compile(".*" + DIGIT_PATTERN_STRING + "$");
- @Override
- protected int firstDigit(String line) {
- for (int i = 0; i < line.length(); ++i) {
- var matcher = FIRST_DIGIT_PATTERN.matcher(line.substring(i));
- if (matcher.matches()) {
- return toDigit(matcher.group(1));
- }
- }
- return 0;
- }
- @Override
- protected int lastDigit(String line) {
- for (int i = line.length() - 1; i >= 0; --i) {
- var matcher = LAST_DIGIT_PATTERN.matcher(line.substring(0, i + 1));
- if (matcher.matches()) {
- return toDigit(matcher.group(1));
- }
- }
- return 0;
- }
- private static int toDigit(String digitString) {
- return switch (digitString) {
- case "zero", "0" -> 0;
- case "one", "1" -> 1;
- case "two", "2" -> 2;
- case "three", "3" -> 3;
- case "four", "4" -> 4;
- case "five", "5" -> 5;
- case "six", "6" -> 6;
- case "seven", "7" -> 7;
- case "eight", "8" -> 8;
- case "nine", "9" -> 9;
- default -> throw new IllegalArgumentException();
- };
- }
- }
- abstract static class AoC2023Day1Processor {
- int result(InputStream inputStream) {
- try (var reader = new BufferedReader(new InputStreamReader(inputStream))) {
- int result = 0;
- for (var line = reader.readLine(); line != null; line = reader.readLine()) {
- result += (10 * firstDigit(line) + lastDigit(line));
- }
- return result;
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- protected abstract int firstDigit(String line);
- protected abstract int lastDigit(String line);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement