# AoC 2015 Puzzle 12

###### Info

I solved this puzzle. You can find the code here, but I have yet to write a good explanation of the solution here. I will do this shortly, thank you for your patience.

## Day 12: JSAbacusFramework.io

Santa's Accounting-Elves need help balancing the books after a recent order. Unfortunately, their accounting software uses a peculiar storage format. That's where you come in.

They have a JSON document which contains a variety of things: arrays ([1,2,3]), objects ({"a":1, "b":2}), numbers, and strings. Your first job is to simply find all of the numbers throughout the document and add them together.

For example:

• `[1,2,3]` and `{"a":2,"b":4}` both have a sum of 6.
• `[[[3]]]` and `{"a":{"b":4},"c":-1}` both have a sum of 3.
• `{"a":[-1,1]}` and `[-1,{"a":1}]` both have a sum of 0.
• `[]` and `{}` both have a sum of 0.

You will not encounter any strings containing numbers.

What is the sum of all numbers in the document?

### Part 2

Uh oh - the Accounting-Elves have realized that they double-counted everything red.

Ignore any object (and all of its children) which has any property with the value "red". Do this only for objects ({…}), not arrays ([…]).

• [1,2,3] still has a sum of 6.
• [1,{"c":"red","b":2},3] now has a sum of 4, because the middle object is ignored.
• {"d":"red","e":[1,2,3,4],"f":5} now has a sum of 0, because the entire structure is ignored.
• [1,"red",5] has a sum of 6, because "red" in an array has no effect.

### Complete Solution

```@Override
public String part1(List<String> input) {
String json = input.get(0);

Pattern pattern = Pattern.compile("-?[0-9]+");
Matcher matcher = pattern.matcher(json);

int sum = 0;
while (matcher.find()) {
String match = matcher.group();
sum += Integer.parseInt(match);
}
return String.valueOf(sum);
}

boolean isRed(JsonNode node) {
Iterator<JsonNode> it = node.iterator();
while (it.hasNext()) {
if ("red".equals(it.next().asText())) {
return true;
}
}
return false;
}

int doJsonSum(JsonNode node, int sum) {
int res = 0;

if (node.isInt()) {
res += sum + node.asInt();
}

if (node.isArray()) {
for (JsonNode n : node) {
res += doJsonSum(n, sum);
}
}

if (node.isObject() && !isRed(node)) {
Iterator<JsonNode> it = node.elements();
while (it.hasNext()) {
JsonNode next = it.next();
res += doJsonSum(next, sum);
}
}
return res;
}

@Override
public String part2(List<String> input) {

ObjectMapper mapper = new ObjectMapper();
try {