1
0
This commit is contained in:
2025-12-06 19:23:32 +01:00
parent 2ac9f10c15
commit 423f2ceb60
4 changed files with 4692 additions and 0 deletions

View File

@@ -0,0 +1,183 @@
package de.advent_of_code_2025.one;
import de.advent_of_code_2025.util.InputReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
private static enum Direction {
LEFT, RIGHT;
}
private static final class DialPosition {
private final int value;
private DialPosition next;
private DialPosition previous;
public DialPosition(int value) {
this.value = value;
}
public void setNext(DialPosition next) {
this.next = next;
}
public void setPrevious(DialPosition previous) {
this.previous = previous;
}
public DialPosition next() {
return this.next;
}
public DialPosition previous() {
return this.previous;
}
public boolean isZero() {
return this.value == 0;
}
}
private static final class Dial {
private DialPosition current;
private DialPosition reset;
public Dial(DialPosition current) {
this.current = current;
this.reset = current;
}
public int dialEnd(Direction direction, int moves) {
if(direction == Direction.LEFT) {
for(int i = 0; i < moves; i++) {
this.current = this.current.previous();
}
}
else {
for(int i = 0; i < moves; i++) {
this.current = this.current.next();
}
}
return this.current.isZero() ? 1 : 0;
}
public int dialAll(Direction direction, int moves) {
int zeroCounter = 0;
if(direction == Direction.LEFT) {
for(int i = 0; i < moves; i++) {
this.current = this.current.previous();
if(this.current.isZero()) {
zeroCounter += 1;
}
}
}
else {
for(int i = 0; i < moves; i++) {
this.current = this.current.next();
if(this.current.isZero()) {
zeroCounter += 1;
}
}
}
return zeroCounter;
}
public void reset() {
this.current = this.reset;
}
}
private static final record Command(Direction direction, int moves) {
public int apply(Dial dial) {
return dial.dialEnd(this.direction, this.moves);
}
public int applyAll(Dial dial) {
return dial.dialAll(this.direction, this.moves);
}
}
public static void main(String[] args) throws Throwable {
final List<String> lines = InputReader.read(args);
final DialPosition start = setupDialPositions();
final Dial dial = new Dial(start);
final List<Command> commands = setupCommands(lines);
int zeroCounter = 0;
int zeroCounterAll = 0;
// Part 1
for (Command c : commands) {
zeroCounter += c.apply(dial);
}
System.out.println(zeroCounter);
// Part 2
dial.reset();
for (Command c : commands) {
zeroCounterAll += c.applyAll(dial);
}
System.out.println(zeroCounterAll);
}
private static final List<Command> setupCommands(List<String> lines) {
return lines.stream().map(line -> {
Direction direction = Direction.RIGHT;
int moves = 0;
if (line.startsWith("L")) {
direction = Direction.LEFT;
}
moves = Integer.parseInt(line.substring(1));
return new Command(direction, moves);
}).collect(Collectors.toList());
}
private static final DialPosition setupDialPositions() {
final List<DialPosition> positions = new ArrayList<>(100);
IntStream.range(0, 100).mapToObj(DialPosition::new).forEach(positions::add);
DialPosition current = null;
DialPosition next = null;
DialPosition previous = null;
for(int i = 0; i < 100; i++) {
current = positions.get(i);
if(i == 0) {
next = positions.get(i + 1);
previous = positions.getLast();
}
else if(i == positions.size() - 1) {
next = positions.getFirst();
previous = positions.get(i - 1);
}
else {
next = positions.get(i + 1);
previous = positions.get(i - 1);
}
current.setNext(next);
current.setPrevious(previous);
}
return positions.get(50);
}
}

View File

@@ -0,0 +1,6 @@
3-5
10-14
12-18
16-20
1

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,10 @@
L68
L30
R48
L5
R60
L55
L1
L99
R14
L82