-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay13b.java
More file actions
166 lines (152 loc) · 4.24 KB
/
Day13b.java
File metadata and controls
166 lines (152 loc) · 4.24 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
157
158
159
160
161
162
163
164
165
166
import java.util.Scanner;
import java.util.ArrayList;
import java.io.File;
public class Day13b {
public static String myRead(Scanner scanner) {
String line;
try {
line = scanner.nextLine().trim();
} catch (Exception e) {
line = null;
}
return line;
}
public static Scanner myScanner(File text) {
Scanner scanner;
try {
scanner = new Scanner(text);
} catch (Exception e) {
System.out.println("No Scanner");
return null;
}
return scanner;
}
public static void main(String[] args) {
File text = new File("/Users/axelteo/Desktop/AdventofCode/Day13input.txt");
Scanner scanner = myScanner(text);
if (scanner == null) {
return;
}
String line1;
String line2;
ArrayList<Integer> orders = new ArrayList<>();
ValOrList divider1 = new ValOrList().add(new ValOrList().add(new ValOrList(2)));
int divider1pos = 1;
int divider2pos = 2;
ValOrList divider2 = new ValOrList().add(new ValOrList().add(new ValOrList(6)));
while ((line1 = myRead(scanner)) != null && (line2 = myRead(scanner)) != null) {
ValOrList left = ValOrList.createNew(line1);
ValOrList right = ValOrList.createNew(line2);
if (left.isRightOrder(divider1) > 0) {
++divider1pos;
}
if (right.isRightOrder(divider1) > 0) {
++divider1pos;
}
if (left.isRightOrder(divider2) > 0) {
++divider2pos;
}
if (right.isRightOrder(divider2) > 0) {
++divider2pos;
}
// discard the empty line
myRead(scanner);
}
System.out.println("product of divider positions: " + (divider1pos * divider2pos));
}
}
class ValOrList {
final int val;
ArrayList<ValOrList> vlist;
public ValOrList(int x) {
this.val = x;
this.vlist = null;
}
public ValOrList() {
this.val = -1;
this.vlist = new ArrayList<>();
}
public ValOrList add(ValOrList x) {
this.vlist.add(x);
return this;
}
public static ValOrList createNew(String line) {
ArrayList<ValOrList> path = new ArrayList<>();
// skip the last close bracket.
for (int i = 0; i < line.length() - 1; ++i) {
char c = line.charAt(i);
if (c == '[') {
ValOrList tmp = new ValOrList();
if (path.isEmpty()) {
path.add(tmp);
} else {
path.get(path.size() - 1).add(tmp);
path.add(tmp);
}
continue;
} else if (c == ']') {
path.remove(path.size() - 1);
continue;
} else if (c == '1') {
if (line.charAt(i + 1) == '0') {
path.get(path.size() - 1).add(new ValOrList(10));
++i;
continue;
} else {
path.get(path.size() - 1).add(new ValOrList(Character.getNumericValue(c)));
continue;
}
} else if (Character.isDigit(c)) {
path.get(path.size() - 1).add(new ValOrList(Character.getNumericValue(c)));
continue;
} else if (c == ',') {
continue;
}
}
return path.get(0);
}
// positive int return means right order: left side is smaller, or left has fewer items
// 0 return means equality
// negative int return means wrong order: right side is smaller, or right has fewer items
public int isRightOrder(ValOrList right) {
if (this.val != -1 && right.val != -1) {
return right.val - this.val;
}
else if(this.val != -1) {
int res = right.vlist.size() - 1;
int res2;
if (right.vlist.size() > 0 && (res2 = this.isRightOrder(right.vlist.get(0))) != 0) {
return res2;
}
return res;
}
else if (right.val != -1) {
int res = 1 - this.vlist.size();
int res2;
if (this.vlist.size() > 0 && (res2 = this.vlist.get(0).isRightOrder(right)) != 0) {
return res2;
}
return res;
}
int res = right.vlist.size() - this.vlist.size();
int min = right.vlist.size() < this.vlist.size() ? right.vlist.size() : this.vlist.size();
for (int i = 0; i < min; ++i) {
int res2;
if ((res2 = this.vlist.get(i).isRightOrder(right.vlist.get(i))) != 0) {
return res2;
}
}
return res;
}
@Override
public String toString() {
if (this.val != -1) {
return Integer.toString(this.val);
}
String line = "";
for (ValOrList x: this.vlist) {
line += x.toString() + " ";
}
return line;
}
}