-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay13.java
More file actions
156 lines (141 loc) · 4.51 KB
/
Day13.java
File metadata and controls
156 lines (141 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.zip.DataFormatException;
public class Day13 {
public static void Run(List<String> input)
{
var packets = new ArrayList<List<Object>>();
for (var line: input)
{
if(line.isBlank())
continue;
packets.add(new ListReader(line).getList());
}
p1(packets);
p2(packets);
}
private static void p1(List<List<Object>> packets)
{
int sum=0;
var packetComparator = new PacketComparator();
for (int pair=1, pairs = packets.size()/2; pair<=pairs; pair++)
{
int index = (pair-1)*2;
if (packetComparator.compare(packets.get(index), packets.get(index+1)) < 1)
{
// add 1-based index
sum += (pair);
}
}
System.out.println("Day 13.1: " + sum);
}
private static void p2(List<List<Object>> packets)
{
var marker1=new ListReader("[[2]]").getList();
var marker2=new ListReader("[[6]]").getList();
packets.add(marker1);
packets.add(marker2);
packets.sort(new PacketComparator());
var index1 = packets.indexOf(marker1);
var index2 = packets.indexOf(marker2);
int decoderKey = (index1+1) * (index2+1);
System.out.println("Day 13.2: " + decoderKey);
}
private static class ListReader{
private int _index;
private String _input;
public ListReader(String input)
{
_input=input;
}
public List<Object> getList()
{
_index=0;
try {
return readList();
} catch (DataFormatException e) {
System.out.println("bad input: "+ e.getMessage());
return null;
}
}
private List<Object> readList() throws DataFormatException
{
if (_input.charAt(_index) != '[')
throw new DataFormatException("List didn't start with [");
_index++;
var list = new ArrayList<Object>();
while((_index < _input.length()) && (nextChar() != ']'))
{
list.add(readElement());
}
if (_index < _input.length())
_index++; // skip ']'
return list;
}
private int readInteger(){
char c=nextChar();
int i=0;
while(Character.isDigit(c))
{
i= (i*10 )+(c-'0');
_index++;
c=nextChar();
}
return i;
}
private Object readElement() throws DataFormatException
{
Object element;
if (nextChar()=='[')
element = readList();
else
element = readInteger();
if (nextChar()==',')
_index++;
return element;
}
private char nextChar()
{
return _input.charAt(_index);
}
}
private static class PacketComparator implements Comparator<List<Object>>
{
@Override
public int compare(List<Object> left, List<Object> right) {
int rsize = right.size();
for (int i = 0, n = left.size(); i < n; i++)
{
if (i>=rsize)
return +1; //right ran out first, left is bigger
var leftElement = left.get(i);
var rightElement = right.get(i);
int compare = CompareElements(leftElement, rightElement);
if (compare != 0)
return compare;
}
if (right.size() > left.size())
return -1; // left ran out first, left is smaller
return 0; // equal
}
private int CompareElements(Object left, Object right)
{
if (left instanceof Integer)
{
if (right instanceof Integer)
{
return ((Integer)left).compareTo((Integer)right);
}
// integer and list
return compare(List.of(left), (List<Object>)right);
}
var leftList = (List<Object>)left;
if (right instanceof Integer)
{
return compare(leftList, List.of(right));
}
return compare(leftList, (List<Object>)right);
}
}
}